use serde_json::json;
use super::ProductGroupData;
use crate::product_group::ProductGroup;
fn untyped(product_identifier: serde_json::Value) -> serde_json::Value {
json!({
"productGroup": "photovoltaic",
"productIdentifier": product_identifier,
"moduleEfficiencyPct": 22.4,
})
}
#[test]
fn an_untyped_payload_answers_the_identifier_it_carries() {
let wire = untyped(json!({ "scheme": "gs1", "gtin": "09506000134352" }));
let deserialised: ProductGroupData = serde_json::from_value(wire.clone()).expect("untyped");
let constructed = ProductGroupData::other(wire).expect("untyped");
for data in [&deserialised, &constructed] {
assert_eq!(
data.product_group(),
ProductGroup::Other("photovoltaic".into())
);
let identifier = data.product_identifier().expect("carried");
assert_eq!(identifier.as_str(), "09506000134352");
assert_eq!(data.gtin(), Some("09506000134352"));
}
assert_eq!(deserialised, constructed);
}
#[test]
fn an_untyped_payload_carrying_a_did_answers_with_no_gtin() {
let data = ProductGroupData::other(untyped(json!({
"scheme": "did",
"did": "did:web:example.com:p:1",
})))
.expect("untyped");
assert!(data.product_identifier().is_some());
assert_eq!(data.gtin(), None);
}
#[test]
fn a_malformed_identifier_is_kept_verbatim_and_answers_none() {
for malformed in [
json!({ "scheme": "gs1", "gtin": "09506000134351" }),
json!({ "scheme": "nonsense", "value": "x" }),
json!("09506000134352"),
json!(null),
] {
let wire = untyped(malformed.clone());
let data: ProductGroupData = serde_json::from_value(wire.clone())
.unwrap_or_else(|e| panic!("{malformed} must not fail the payload: {e}"));
assert_eq!(data.product_identifier(), None, "{malformed}");
assert_eq!(serde_json::to_value(&data).expect("serialises"), wire);
}
}
#[test]
fn an_untyped_payload_without_an_identifier_answers_none() {
let data = ProductGroupData::other(json!({ "productGroup": "photovoltaic" })).expect("untyped");
assert_eq!(data.product_identifier(), None);
}
#[test]
fn an_untyped_payload_answers_nothing_only_an_act_defines() {
let data = ProductGroupData::other(json!({
"productGroup": "photovoltaic",
"modelIdentifier": "PV-400",
"productCategory": "module",
"svhcSubstances": [],
}))
.expect("untyped");
assert_eq!(data.model_identifier(), None);
assert_eq!(data.product_category(), None);
assert_eq!(data.svhc_substances(), None);
}