use serde_json::json;
use super::*;
#[test]
fn frame_and_strip_round_trip() {
let passport = json!({ "id": "abc", "productGroup": "battery" });
let framed = frame_passport(passport.clone());
let stripped = strip_context(framed);
assert_eq!(stripped["id"], "abc");
assert!(stripped.get("@context").is_none());
}
#[test]
fn the_passport_names_itself_with_the_id_keyword() {
assert_eq!(
term_map()["id"],
json!("@id"),
"`id` must alias the @id keyword, or the passport stops identifying itself"
);
}
#[test]
fn frame_passport_preserves_non_object_payload() {
let framed = frame_passport(json!("not-an-object"));
assert_eq!(framed, json!("not-an-object"));
}
#[test]
fn strip_context_passes_through_non_object() {
let array = json!(["a", "b"]);
assert_eq!(strip_context(array.clone()), array);
}
fn term_map() -> serde_json::Map<String, serde_json::Value> {
let context = context_value();
let entries = context.as_array().expect("@context is an array");
entries
.iter()
.find_map(|e| e.as_object())
.expect("@context carries an inline term object")
.clone()
}
#[test]
fn every_declared_prefix_is_ours_or_permitted_by_a_record() {
use dpp_vocab::{OWN_JSONLD_NAMESPACE, VocabularyRegister};
let register = VocabularyRegister::new();
let map = term_map();
let prefixes: Vec<(String, String)> = map
.iter()
.filter_map(|(term, target)| {
let target = target.as_str()?;
(target.starts_with("http://") || target.starts_with("https://"))
.then(|| (term.clone(), target.to_owned()))
})
.collect();
assert!(
!prefixes.is_empty(),
"the context declares no prefixes at all"
);
for (term, iri) in prefixes {
if iri == OWN_JSONLD_NAMESPACE {
continue; }
let record = register
.all()
.iter()
.find(|v| v.contains(&iri))
.unwrap_or_else(|| {
panic!(
"prefix '{term}' declares {iri}, which no vocabulary record covers — \
add a record before naming someone else's vocabulary"
)
})
.clone();
assert!(
record.permits_emission(),
"prefix '{term}' declares {iri} from the '{}' record, which does not permit \
emission ({:?}/{:?})",
record.key,
record.status,
record.layer
);
}
}
#[test]
fn every_compact_term_expands_to_a_permitted_iri() {
use dpp_vocab::{OWN_JSONLD_NAMESPACE, VocabularyRegister};
let register = VocabularyRegister::new();
let map = term_map();
let prefixes: std::collections::HashMap<String, String> = map
.iter()
.filter_map(|(term, target)| {
let target = target.as_str()?;
(target.starts_with("http")).then(|| (term.clone(), target.to_owned()))
})
.collect();
let mut checked = 0usize;
for (term, target) in &map {
let Some(target) = target.as_str() else {
continue;
};
let Some((prefix, suffix)) = target.split_once(':') else {
continue;
};
let Some(base) = prefixes.get(prefix) else {
continue; };
let expanded = format!("{base}{suffix}");
checked += 1;
if expanded.starts_with(OWN_JSONLD_NAMESPACE) {
continue;
}
assert!(
register.verdict(&expanded).is_permitted(),
"term '{term}' expands to {expanded}, which the register does not permit: {}",
register.verdict(&expanded).reason()
);
}
assert!(
checked > 0,
"no compact terms were expanded — the check would pass vacuously"
);
}
#[test]
fn the_gs1_prefix_matches_its_record() {
use dpp_vocab::VocabularyRegister;
let register = VocabularyRegister::new();
let recorded = register
.all()
.iter()
.find(|v| v.key == "gs1")
.expect("gs1 record")
.namespace_iri
.clone()
.expect("gs1 record carries a namespaceIri");
assert_eq!(
term_map()["gs1"].as_str().expect("gs1 prefix is a string"),
recorded,
"the context must declare the prefix the record records, not a copy of it"
);
}
#[test]
fn every_passport_wire_key_has_a_term() {
let map = term_map();
let missing: Vec<&str> = dpp_domain::PASSPORT_WIRE_KEYS
.iter()
.copied()
.filter(|key| !map.contains_key(*key))
.collect();
assert!(
missing.is_empty(),
"envelope keys carrying no JSON-LD term: {missing:?}"
);
}
#[test]
fn every_term_in_our_namespace_is_named_after_its_key() {
let mut checked = 0usize;
for (term, target) in term_map() {
let Some(local) = target.as_str().and_then(|t| t.strip_prefix("dpp:")) else {
continue;
};
checked += 1;
assert_eq!(
local, term,
"term '{term}' mints '{local}' under our own namespace"
);
}
assert!(
checked > 0,
"no terms were checked — this would pass vacuously"
);
}