use crate::format::v2::AprV2Metadata;
#[test]
fn falsify_ship_022_apr_metadata_provenance_round_trip() {
let meta = AprV2Metadata {
license: Some("Apache-2.0".to_string()),
data_source: Some("teacher-only".to_string()),
data_license: Some("Apache-2.0".to_string()),
..Default::default()
};
let json = meta.to_json().expect("serialize AprV2Metadata");
let reparsed = AprV2Metadata::from_json(&json).expect("deserialize AprV2Metadata");
assert_eq!(
reparsed.license,
Some("Apache-2.0".to_string()),
"license must round-trip byte-identically"
);
assert_eq!(
reparsed.data_source,
Some("teacher-only".to_string()),
"data_source must round-trip byte-identically"
);
assert_eq!(
reparsed.data_license,
Some("Apache-2.0".to_string()),
"data_license must round-trip byte-identically"
);
assert!(
!reparsed.custom.contains_key("license"),
"license must be a named field, not in custom"
);
assert!(
!reparsed.custom.contains_key("data_source"),
"data_source must be a named field, not in custom"
);
assert!(
!reparsed.custom.contains_key("data_license"),
"data_license must be a named field, not in custom"
);
}
#[test]
fn falsify_ship_022_inspect_emits_provenance_keys() {
let meta = AprV2Metadata {
license: None,
data_source: None,
data_license: None,
..Default::default()
};
let json_bytes = meta.to_json().expect("serialize AprV2Metadata");
let json_str = std::str::from_utf8(&json_bytes).expect("utf-8 JSON");
let parsed: serde_json::Value = serde_json::from_str(json_str).expect("parse JSON");
let obj = parsed.as_object().expect("JSON object at top level");
for key in ["license", "data_source", "data_license"] {
assert!(
obj.contains_key(key),
"AprV2Metadata JSON must emit key `{key}` even when None (no skip_serializing_if); \
violating this silently hides provenance from auditors (FM-APR-PROV-SILENT-SKIP)"
);
assert!(
obj[key].is_null(),
"key `{key}` must serialize as null when None, got {:?}",
obj[key]
);
}
}
#[test]
fn falsify_ship_022_partial_provenance_round_trip() {
let meta = AprV2Metadata {
license: Some("CC-BY-4.0".to_string()),
data_source: None,
data_license: Some("CC-BY-4.0".to_string()),
..Default::default()
};
let json = meta.to_json().expect("serialize AprV2Metadata");
let reparsed = AprV2Metadata::from_json(&json).expect("deserialize AprV2Metadata");
assert_eq!(reparsed.license, Some("CC-BY-4.0".to_string()));
assert_eq!(
reparsed.data_source, None,
"None must survive round-trip as None, not coerced to Some(\"\")"
);
assert_eq!(reparsed.data_license, Some("CC-BY-4.0".to_string()));
}