#![cfg(feature = "avro")]
use genson_core::normalise::{normalise_value, normalise_values, MapEncoding, NormaliseConfig};
use serde_json::json;
#[test]
fn test_array_empty_behavior() {
let schema = json!({"type":"array","items":"string"});
let cfg = NormaliseConfig {
empty_as_null: true,
..NormaliseConfig::default()
};
assert_eq!(normalise_value(json!([]), &schema, &cfg, None), json!(null));
let cfg = NormaliseConfig {
empty_as_null: false,
..NormaliseConfig::default()
};
assert_eq!(normalise_value(json!([]), &schema, &cfg, None), json!([]));
assert_eq!(
normalise_value(json!("foo"), &schema, &cfg, None),
json!(["foo"])
);
}
#[test]
fn test_map_empty_behavior() {
let schema = json!({"type":"map","values":"string"});
let cfg = NormaliseConfig {
empty_as_null: true,
..NormaliseConfig::default()
};
assert_eq!(normalise_value(json!({}), &schema, &cfg, None), json!(null));
let cfg = NormaliseConfig {
empty_as_null: false,
..NormaliseConfig::default()
};
assert_eq!(normalise_value(json!({}), &schema, &cfg, None), json!({}));
let val = normalise_value(json!("foo"), &schema, &cfg, None);
assert_eq!(val, json!({"default":"foo"}));
}
#[test]
fn test_nested_record_array_field() {
let schema = json!({
"type":"record",
"name":"doc",
"fields":[
{"name":"id","type":"string"},
{"name":"tags","type":{"type":"array","items":"string"}}
]
});
let cfg = NormaliseConfig {
empty_as_null: true,
..NormaliseConfig::default()
};
let input = json!({"id":"1","tags":[]});
let norm = normalise_value(input, &schema, &cfg, None);
assert_eq!(norm, json!({"id":"1","tags":null}));
let cfg = NormaliseConfig {
empty_as_null: false,
..NormaliseConfig::default()
};
let input = json!({"id":"1","tags":[]});
let norm = normalise_value(input, &schema, &cfg, None);
assert_eq!(norm, json!({"id":"1","tags":[]}));
}
#[test]
fn test_union_precedence_array() {
let schema = json!(["null", {"type":"array","items":"string"}]);
let cfg = NormaliseConfig {
empty_as_null: true,
..NormaliseConfig::default()
};
assert_eq!(
normalise_value(json!(null), &schema, &cfg, None),
json!(null)
);
let val = normalise_value(json!("x"), &schema, &cfg, None);
assert_eq!(val, json!(["x"]));
}
#[test]
fn test_union_precedence_map() {
let schema = json!(["null", {"type":"map","values":"string"}, "string"]);
let cfg = NormaliseConfig {
empty_as_null: true,
..NormaliseConfig::default()
};
let val = normalise_value(json!("foo"), &schema, &cfg, None);
assert_eq!(val, json!({"default":"foo"}));
}
#[test]
fn test_normalise_values_preserves_length() {
let schema = json!({"type":"array","items":"string"});
let cfg = NormaliseConfig {
empty_as_null: true,
..NormaliseConfig::default()
};
let inputs = vec![
json!(["a", "b"]),
json!([]), json!(null),
];
let outputs = normalise_values(inputs.clone(), &schema, &cfg);
assert_eq!(outputs.len(), inputs.len());
assert_eq!(outputs[0], json!(["a", "b"]));
assert_eq!(outputs[1], json!(null));
assert_eq!(outputs[2], json!(null));
}
#[test]
fn test_map_scalar_fallback_encodings() {
let schema = json!({"type":"map","values":"string"});
let cfg = NormaliseConfig {
map_encoding: MapEncoding::Mapping,
..NormaliseConfig::default()
};
let val = normalise_value(json!("foo"), &schema, &cfg, None);
assert_eq!(val, json!({"default": "foo"}));
let cfg = NormaliseConfig {
map_encoding: MapEncoding::Entries,
..NormaliseConfig::default()
};
let val = normalise_value(json!("foo"), &schema, &cfg, None);
assert_eq!(val, json!([{"default": "foo"}]));
let cfg = NormaliseConfig {
map_encoding: MapEncoding::KeyValueEntries,
..NormaliseConfig::default()
};
let val = normalise_value(json!("foo"), &schema, &cfg, None);
assert_eq!(val, json!([{"key": "default", "value": "foo"}]));
}