use serde_json::json;
use tellaro_query_language::Tql;
#[test]
fn test_b64encode_basic_string() {
let tql = Tql::new();
let data = vec![json!({"message": "Hello, World!"})];
let results = tql
.query(&data, "message | b64encode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64encode_empty_string() {
let tql = Tql::new();
let data = vec![json!({"value": ""})];
let results = tql
.query(&data, "value | b64encode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64encode_unicode() {
let tql = Tql::new();
let data = vec![
json!({"message": "Hello \u{4e16}\u{754c}"}), ];
let results = tql
.query(&data, "message | b64encode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64encode_special_characters() {
let tql = Tql::new();
let data = vec![json!({"value": "test@example.com"})];
let results = tql
.query(&data, "value | b64encode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64encode_number() {
let tql = Tql::new();
let data = vec![json!({"value": 12345})];
let results = tql
.query(&data, "value | b64encode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64encode_boolean() {
let tql = Tql::new();
let data = vec![json!({"flag": true})];
let results = tql
.query(&data, "flag | b64encode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64decode_basic_string() {
let tql = Tql::new();
let data = vec![
json!({"encoded": "SGVsbG8sIFdvcmxkIQ=="}), ];
let results = tql
.query(&data, "encoded | b64decode = 'Hello, World!'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64decode_with_proper_padding() {
let tql = Tql::new();
let data = vec![
json!({"encoded": "SGVsbG8="}), ];
let results = tql
.query(&data, "encoded | b64decode = 'Hello'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64decode_without_padding_fails_gracefully() {
let tql = Tql::new();
let data = vec![
json!({"encoded": "SGVsbG8"}), ];
let result = tql.query(&data, "encoded | b64decode = 'Hello'");
assert!(result.is_err() || result.unwrap().is_empty());
}
#[test]
fn test_b64decode_empty_string() {
let tql = Tql::new();
let data = vec![json!({"value": ""})];
let results = tql
.query(&data, "value | b64decode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64decode_unicode() {
let tql = Tql::new();
let data = vec![
json!({"encoded": "SGVsbG8g5LiW55WM"}), ];
let results = tql
.query(&data, "encoded | b64decode contains 'Hello'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64decode_invalid_input() {
let tql = Tql::new();
let data = vec![json!({"value": "not-valid-base64!!!"})];
let hits = tql
.query(&data, "value | b64decode exists")
.expect("a mutator that cannot process a value is a DATA error, not a query error");
assert!(
hits.is_empty(),
"the decoded field does not exist, so the record must not match: {hits:?}"
);
let negated = tql
.query(&data, "value | b64decode not exists")
.expect("the negated spelling must not error either");
assert_eq!(
negated.len(),
1,
"`not exists` is the complement and must include the record"
);
}
#[test]
fn a_failed_mutator_under_a_negated_comparator_matches_nothing() {
let tql = Tql::new();
let data = vec![json!({"value": "not-valid-base64!!!"})];
for query in [
"value | b64decode not contains 'x'",
"value | b64decode::number ne 999",
"value | b64decode is null",
] {
let hits = tql
.query(&data, query)
.unwrap_or_else(|e| panic!("`{query}` must answer rather than error: {e}"));
assert!(
hits.is_empty(),
"`{query}`: a value the mutator could not process matches nothing, \
positively or negatively — Python answers true here (see the doc comment)"
);
}
}
#[test]
fn test_urldecode_basic_string() {
let tql = Tql::new();
let data = vec![json!({"url": "hello%20world"})];
let results = tql
.query(&data, "url | urldecode = 'hello world'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_urldecode_special_characters() {
let tql = Tql::new();
let data = vec![json!({"value": "test%40example.com"})];
let results = tql
.query(&data, "value | urldecode = 'test@example.com'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_urldecode_multiple_encodings() {
let tql = Tql::new();
let data = vec![
json!({"value": "a%3Db%26c%3Dd"}), ];
let results = tql
.query(&data, "value | urldecode = 'a=b&c=d'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_urldecode_plus_as_space() {
let tql = Tql::new();
let data = vec![json!({"value": "hello+world"})];
let results = tql
.query(&data, "value | urldecode contains 'hello'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_urldecode_unicode() {
let tql = Tql::new();
let data = vec![
json!({"value": "%E4%B8%96%E7%95%8C"}), ];
let results = tql
.query(&data, "value | urldecode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_urldecode_empty_string() {
let tql = Tql::new();
let data = vec![json!({"value": ""})];
let results = tql
.query(&data, "value | urldecode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_urldecode_no_encoding() {
let tql = Tql::new();
let data = vec![json!({"value": "plain-text"})];
let results = tql
.query(&data, "value | urldecode = 'plain-text'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_urldecode_partial_encoding() {
let tql = Tql::new();
let data = vec![
json!({"value": "hello%20world%21test"}), ];
let results = tql
.query(&data, "value | urldecode contains 'hello'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_hexencode_basic_string() {
let tql = Tql::new();
let data = vec![json!({"message": "Hello"})];
let results = tql
.query(&data, "message | hexencode exists")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_hexdecode_basic_string() {
let tql = Tql::new();
let data = vec![
json!({"encoded": "48656c6c6f"}), ];
let results = tql
.query(&data, "encoded | hexdecode = 'Hello'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_hexdecode_uppercase() {
let tql = Tql::new();
let data = vec![
json!({"encoded": "48454C4C4F"}), ];
let results = tql
.query(&data, "encoded | hexdecode = 'HELLO'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_md5_basic_string() {
let tql = Tql::new();
let data = vec![json!({"message": "hello"})];
let results = tql
.query(&data, "message | md5 | length = 32")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_md5_known_hash() {
let tql = Tql::new();
let data = vec![json!({"message": "hello"})];
let results = tql
.query(&data, "message | md5 = '5d41402abc4b2a76b9719d911017c592'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_sha256_basic_string() {
let tql = Tql::new();
let data = vec![json!({"message": "hello"})];
let results = tql
.query(&data, "message | sha256 | length = 64")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_sha256_known_hash() {
let tql = Tql::new();
let data = vec![json!({"message": "hello"})];
let results = tql
.query(
&data,
"message | sha256 = '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'",
)
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_md5_empty_string() {
let tql = Tql::new();
let data = vec![json!({"value": ""})];
let results = tql
.query(&data, "value | md5 = 'd41d8cd98f00b204e9800998ecf8427e'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_encode_decode_roundtrip() {
let tql = Tql::new();
let data = vec![json!({"message": "test message"})];
let results = tql
.query(&data, "message | b64encode | b64decode = 'test message'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_hex_roundtrip() {
let tql = Tql::new();
let data = vec![json!({"message": "test"})];
let results = tql
.query(&data, "message | hexencode | hexdecode = 'test'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_lowercase_after_hash() {
let tql = Tql::new();
let data = vec![json!({"message": "HELLO"})];
let results = tql
.query(&data, "message | md5 | lowercase | length = 32")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}
#[test]
fn test_b64decode_in_filter() {
let tql = Tql::new();
let data = vec![
json!({"encoded": "YWRtaW4=", "name": "Admin User"}), json!({"encoded": "dXNlcg==", "name": "Regular User"}), ];
let results = tql
.query(&data, "encoded | b64decode = 'admin'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["name"], "Admin User");
}
#[test]
fn test_hash_comparison() {
let tql = Tql::new();
let data = vec![
json!({"password_hash": "5d41402abc4b2a76b9719d911017c592", "user": "alice"}),
json!({"password_hash": "098f6bcd4621d373cade4e832627b4f6", "user": "bob"}),
];
let results = tql
.query(&data, "password_hash = '5d41402abc4b2a76b9719d911017c592'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["user"], "alice");
}
#[test]
fn test_encoded_field_contains() {
let tql = Tql::new();
let data = vec![
json!({"url": "https%3A%2F%2Fexample.com%2Fpath"}),
json!({"url": "https%3A%2F%2Fother.com%2Fpath"}),
];
let results = tql
.query(&data, "url | urldecode contains 'example.com'")
.expect("Query should succeed");
assert_eq!(results.len(), 1);
}