use rstest::*;
use flagsmith_flag_engine::segments;
use flagsmith_flag_engine::identities;
use flagsmith_flag_engine::segments::constants;
use flagsmith_flag_engine::types::{FlagsmithValue, FlagsmithValueType};
const TRAIT_KEY_1: &str = "email";
const TRAIT_VALUE_1: &str = "user@example.com";
const TRAIT_KEY_2: &str = "num_purchase";
const TRAIT_VALUE_2: &str = "12";
const TRAIT_KEY_3: &str = "date_joined";
const TRAIT_VALUE_3: &str = "2021-01-01";
#[fixture]
pub fn identity() -> identities::Identity {
identities::Identity {
identifier: "foo".to_string(),
identity_uuid: "".to_string(),
identity_features: vec![],
identity_traits: vec![],
django_id: None,
created_date: chrono::Utc::now(),
environment_api_key: "test_api_key".to_string(),
}
}
pub fn trait_1() -> identities::Trait {
identities::Trait {
trait_key: TRAIT_KEY_1.to_string(),
trait_value: FlagsmithValue {
value: TRAIT_VALUE_1.to_string(),
value_type: FlagsmithValueType::String,
},
}
}
pub fn trait_2() -> identities::Trait {
identities::Trait {
trait_key: TRAIT_KEY_2.to_string(),
trait_value: FlagsmithValue {
value: TRAIT_VALUE_2.to_string(),
value_type: FlagsmithValueType::String,
},
}
}
pub fn trait_3() -> identities::Trait {
identities::Trait {
trait_key: TRAIT_KEY_3.to_string(),
trait_value: FlagsmithValue {
value: TRAIT_VALUE_3.to_string(),
value_type: FlagsmithValueType::String,
},
}
}
#[fixture]
pub fn empty_segment() -> segments::Segment {
segments::Segment {
id: 1,
name: "empty_segment".to_string(),
rules: vec![],
feature_states: vec![],
}
}
pub fn segment_single_condition() -> segments::Segment {
segments::Segment {
id: 2,
name: "segment_one_condition".to_string(),
rules: vec![segments::SegmentRule {
segment_rule_type: constants::ALL_RULE.to_string(),
rules: vec![],
conditions: vec![segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_1.to_string()),
value: Some(TRAIT_VALUE_1.to_string()),
}],
}],
feature_states: vec![],
}
}
pub fn segment_multiple_conditions_all() -> segments::Segment {
segments::Segment {
id: 3,
name: "segment_multiple_conditions_all".to_string(),
rules: vec![segments::SegmentRule {
segment_rule_type: constants::ALL_RULE.to_string(),
rules: vec![],
conditions: vec![
segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_1.to_string()),
value: Some(TRAIT_VALUE_1.to_string()),
},
segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_2.to_string()),
value: Some(TRAIT_VALUE_2.to_string()),
},
],
}],
feature_states: vec![],
}
}
pub fn segment_multiple_conditions_any() -> segments::Segment {
segments::Segment {
id: 4,
name: "segment_multiple_conditions_any".to_string(),
rules: vec![segments::SegmentRule {
segment_rule_type: constants::ANY_RULE.to_string(),
rules: vec![],
conditions: vec![
segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_1.to_string()),
value: Some(TRAIT_VALUE_1.to_string()),
},
segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_2.to_string()),
value: Some(TRAIT_VALUE_2.to_string()),
},
],
}],
feature_states: vec![],
}
}
pub fn segment_nested_rules_all() -> segments::Segment {
segments::Segment {
id: 5,
name: "segment_nested_rules_all".to_string(),
rules: vec![segments::SegmentRule {
segment_rule_type: constants::ALL_RULE.to_string(),
conditions: vec![],
rules: vec![
Box::new({
segments::SegmentRule {
segment_rule_type: constants::ALL_RULE.to_string(),
rules: vec![],
conditions: vec![
segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_1.to_string()),
value: Some(TRAIT_VALUE_1.to_string()),
},
segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_2.to_string()),
value: Some(TRAIT_VALUE_2.to_string()),
},
],
}
}),
Box::new(segments::SegmentRule {
segment_rule_type: constants::ALL_RULE.to_string(),
rules: vec![],
conditions: vec![segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_3.to_string()),
value: Some(TRAIT_VALUE_3.to_string()),
}],
}),
],
}],
feature_states: vec![],
}
}
pub fn segment_conditions_and_nested_rules() -> segments::Segment {
segments::Segment {
id: 6,
name: "segment_multiple_conditions_all_and_nested_rules".to_string(),
rules: vec![segments::SegmentRule {
segment_rule_type: constants::ALL_RULE.to_string(),
conditions: vec![segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_1.to_string()),
value: Some(TRAIT_VALUE_1.to_string()),
}],
rules: vec![
Box::new({
segments::SegmentRule {
segment_rule_type: constants::ALL_RULE.to_string(),
rules: vec![],
conditions: vec![segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_2.to_string()),
value: Some(TRAIT_VALUE_2.to_string()),
}],
}
}),
Box::new({
segments::SegmentRule {
segment_rule_type: constants::ALL_RULE.to_string(),
rules: vec![],
conditions: vec![segments::SegmentCondition {
operator: constants::EQUAL.to_string(),
property: Some(TRAIT_KEY_3.to_string()),
value: Some(TRAIT_VALUE_3.to_string()),
}],
}
}),
],
}],
feature_states: vec![],
}
}