#![allow(clippy::no_effect_underscore_binding)] #![allow(clippy::panic)] use fraiseql_core::db::where_clause::{WhereClause, WhereOperator};
use serde_json::json;
#[test]
fn test_where_case_sensitive_operators() {
let _test_value = "Hello World";
let cases = vec![
("Hello", WhereOperator::Contains, true), ("hello", WhereOperator::Contains, false), ("HELLO", WhereOperator::Contains, false), ("World", WhereOperator::Contains, true),
("world", WhereOperator::Contains, false),
];
for (pattern, operator, _should_match) in cases {
let clause = WhereClause::Field {
path: vec!["text".to_string()],
operator,
value: json!(pattern),
};
match clause {
WhereClause::Field {
value, operator, ..
} => {
assert_eq!(value, json!(pattern));
assert_eq!(operator, WhereOperator::Contains);
},
_ => panic!("Should be Field variant"),
}
}
}
#[test]
fn test_where_case_insensitive_operators() {
let _test_value = "Hello World";
let patterns = vec![
"hello", "HELLO", "Hello", "HeLLo", "world", "WORLD", "World",
];
for pattern in patterns {
let clause = WhereClause::Field {
path: vec!["name".to_string()],
operator: WhereOperator::Icontains,
value: json!(pattern),
};
match clause {
WhereClause::Field {
value, operator, ..
} => {
assert_eq!(value, json!(pattern));
assert_eq!(operator, WhereOperator::Icontains);
},
_ => panic!("Should be Field variant"),
}
}
}
#[test]
fn test_where_startswith_case_sensitive() {
let test_cases = vec![
("Test", "Test", true), ("test", "Test", false), ("TEST", "Test", false), ("T", "Test", true), ("t", "Test", false), ];
for (value, _pattern, _should_match) in test_cases {
let clause = WhereClause::Field {
path: vec!["name".to_string()],
operator: WhereOperator::Startswith,
value: json!(value),
};
match clause {
WhereClause::Field {
value: v, operator, ..
} => {
assert_eq!(v, json!(value));
assert_eq!(operator, WhereOperator::Startswith);
},
_ => panic!("Should be Field variant"),
}
}
}
#[test]
fn test_where_istartswith_case_insensitive() {
let patterns = vec!["test", "Test", "TEST", "TeSt", "tEST"];
for pattern in patterns {
let clause = WhereClause::Field {
path: vec!["email".to_string()],
operator: WhereOperator::Istartswith,
value: json!(pattern),
};
match clause {
WhereClause::Field {
value, operator, ..
} => {
assert_eq!(value, json!(pattern));
assert_eq!(operator, WhereOperator::Istartswith);
},
_ => panic!("Should be Field variant"),
}
}
}
#[test]
fn test_where_endswith_case_sensitive() {
let test_cases = vec![
("example.com", "example.com", true), ("example.COM", "example.com", false), ("EXAMPLE.COM", "example.com", false),
(".com", "example.com", true), (".COM", "example.com", false), ];
for (value, _pattern, _should_match) in test_cases {
let clause = WhereClause::Field {
path: vec!["domain".to_string()],
operator: WhereOperator::Endswith,
value: json!(value),
};
match clause {
WhereClause::Field {
value: v, operator, ..
} => {
assert_eq!(v, json!(value));
assert_eq!(operator, WhereOperator::Endswith);
},
_ => panic!("Should be Field variant"),
}
}
}
#[test]
fn test_where_iendswith_case_insensitive() {
let patterns = vec![
"example.com",
"example.COM",
"EXAMPLE.COM",
"Example.Com",
".com",
".COM",
".Com",
];
for pattern in patterns {
let clause = WhereClause::Field {
path: vec!["url".to_string()],
operator: WhereOperator::Iendswith,
value: json!(pattern),
};
match clause {
WhereClause::Field {
value, operator, ..
} => {
assert_eq!(value, json!(pattern));
assert_eq!(operator, WhereOperator::Iendswith);
},
_ => panic!("Should be Field variant"),
}
}
}
#[test]
fn test_where_case_operators_distinctions() {
let operators = vec![
(WhereOperator::Contains, WhereOperator::Icontains, "contains vs icontains"),
(
WhereOperator::Startswith,
WhereOperator::Istartswith,
"startswith vs istartswith",
),
(WhereOperator::Endswith, WhereOperator::Iendswith, "endswith vs iendswith"),
];
for (case_sensitive, case_insensitive, desc) in operators {
assert_ne!(
std::mem::discriminant(&case_sensitive),
std::mem::discriminant(&case_insensitive),
"{} should be distinct operators",
desc
);
let clause1 = WhereClause::Field {
path: vec!["text".to_string()],
operator: case_sensitive.clone(),
value: json!("test"),
};
let clause2 = WhereClause::Field {
path: vec!["text".to_string()],
operator: case_insensitive.clone(),
value: json!("test"),
};
match (clause1, clause2) {
(
WhereClause::Field { operator: op1, .. },
WhereClause::Field { operator: op2, .. },
) => {
assert_ne!(op1, op2);
},
_ => panic!("Should be Field variants"),
}
}
}
#[test]
fn test_where_case_with_mixed_content() {
let _test_content = "User123Example";
let test_cases = vec![
("User", WhereOperator::Startswith, true), ("user", WhereOperator::Startswith, false), ("User", WhereOperator::Istartswith, true), ("user", WhereOperator::Istartswith, true), ("Example", WhereOperator::Endswith, true),
("example", WhereOperator::Endswith, false),
("Example", WhereOperator::Iendswith, true),
("example", WhereOperator::Iendswith, true),
];
for (pattern, operator, _should_match) in test_cases {
let clause = WhereClause::Field {
path: vec!["id".to_string()],
operator: operator.clone(),
value: json!(pattern),
};
match clause {
WhereClause::Field {
value,
operator: op,
..
} => {
assert_eq!(value, json!(pattern));
assert_eq!(op, operator);
},
_ => panic!("Should be Field variant"),
}
}
}
#[test]
fn test_where_case_with_special_chars() {
let patterns = vec![
("Test-Case", "test-case"),
("Test_Case", "test_case"),
("Test.Case", "test.case"),
("Test@Case", "test@case"),
("Test#Case", "test#case"),
];
for (upper_pattern, lower_pattern) in patterns {
let clause_upper = WhereClause::Field {
path: vec!["value".to_string()],
operator: WhereOperator::Startswith,
value: json!(upper_pattern),
};
let clause_lower = WhereClause::Field {
path: vec!["value".to_string()],
operator: WhereOperator::Startswith,
value: json!(lower_pattern),
};
match (clause_upper, clause_lower) {
(WhereClause::Field { value: v1, .. }, WhereClause::Field { value: v2, .. }) => {
assert_ne!(v1, v2);
},
_ => panic!("Should be Field variants"),
}
let case_insensitive1 = WhereClause::Field {
path: vec!["value".to_string()],
operator: WhereOperator::Istartswith,
value: json!(upper_pattern),
};
let case_insensitive2 = WhereClause::Field {
path: vec!["value".to_string()],
operator: WhereOperator::Istartswith,
value: json!(lower_pattern),
};
match (case_insensitive1, case_insensitive2) {
(
WhereClause::Field { operator: op1, .. },
WhereClause::Field { operator: op2, .. },
) => {
assert_eq!(op1, op2);
assert_eq!(op1, WhereOperator::Istartswith);
},
_ => panic!("Should be Field variants"),
}
}
}
#[test]
fn test_where_case_unicode_handling() {
let unicode_tests = vec![
("Café", "café"),
("CAFÉ", "café"),
("Ångström", "ångström"),
("ÅNGSTRÖM", "ångström"),
("Straße", "strasse"), ("Москва", "москва"), ("МОСКВА", "москва"),
];
for (pattern1, pattern2) in unicode_tests {
let clause1 = WhereClause::Field {
path: vec!["text".to_string()],
operator: WhereOperator::Contains,
value: json!(pattern1),
};
let clause2 = WhereClause::Field {
path: vec!["text".to_string()],
operator: WhereOperator::Contains,
value: json!(pattern2),
};
match (clause1, clause2) {
(WhereClause::Field { value: v1, .. }, WhereClause::Field { value: v2, .. }) => {
assert_eq!(v1, json!(pattern1));
assert_eq!(v2, json!(pattern2));
},
_ => panic!("Should be Field variants"),
}
}
}