use super::RETENTION_MUTABLE_FIELDS;
use crate::test_support::sample_passport;
#[test]
fn every_mutable_key_is_a_real_passport_field() {
let mut passport = sample_passport();
passport.public_jws_signature = Some("eyJ..a".to_owned());
passport.jws_signature = Some("eyJ..b".to_owned());
passport
.disclosure_signatures
.insert("public+restricted".to_owned(), "eyJ..c".to_owned());
passport.qr_code_url = Some("https://id.example/dpp/1".to_owned());
passport.seal = Some(crate::seal::SealedEnvelope {
format: crate::seal::SealFormat::Cades,
seal_value: "MIIB".to_owned(),
signing_cert_ref: None,
sealed_at: chrono::Utc::now(),
placeholder: true,
});
passport.lint_result = Some(crate::lint::LintResult {
pack_version: "1.0.0".to_owned(),
findings: Vec::new(),
assessed_at: chrono::Utc::now(),
});
passport.published_at = Some(chrono::Utc::now());
let json = serde_json::to_value(&passport).expect("passport serialises");
let obj = json.as_object().expect("passport is a JSON object");
let stale: Vec<&str> = RETENTION_MUTABLE_FIELDS
.iter()
.copied()
.filter(|k| !obj.contains_key(*k))
.collect();
assert!(
stale.is_empty(),
"RETENTION_MUTABLE_FIELDS names keys `Passport` does not serialise to: {stale:?}"
);
}
#[test]
fn mutable_and_protected_overlap_is_deliberate() {
use crate::ports::passport_repo::PROTECTED_PATCH_FIELDS;
let both: Vec<&str> = RETENTION_MUTABLE_FIELDS
.iter()
.copied()
.filter(|k| PROTECTED_PATCH_FIELDS.contains(k))
.collect();
assert_eq!(
both,
vec![
"status",
"publishedAt",
"retentionLocked",
"jwsSignature",
"publicJwsSignature",
"disclosureSignatures",
"seal",
],
"the overlap between system-writable-after-publish and \
not-user-patchable changed; confirm the new shape is intended"
);
}
#[test]
fn the_recorded_legal_basis_can_never_be_edited_in_place() {
assert!(
crate::ports::passport_repo::PROTECTED_PATCH_FIELDS.contains(&"applicableInstruments"),
"applicableInstruments must not be patchable"
);
assert!(
!RETENTION_MUTABLE_FIELDS.contains(&"applicableInstruments"),
"applicableInstruments must not change after retention lock"
);
assert!(!RETENTION_MUTABLE_FIELDS.contains(&"granularity"));
}