#[cfg(all(feature = "json", feature = "versioned"))]
mod compat_tests {
use rubo4e::v202607::{Marktlokation, Messlokation, Rechnung, Vertrag};
#[test]
fn python_marktlokation_deserializes() {
let json = include_str!("compat/python/marktlokation.json");
let malo: Marktlokation =
serde_json::from_str(json).expect("python/marktlokation.json must deserialize");
assert_eq!(
malo.marktlokations_id.as_ref().map(|id| id.as_ref()),
Some("51238696781")
);
assert!(malo.sparte.is_some(), "sparte must be present");
assert!(
malo.energierichtung.is_some(),
"energierichtung must be present"
);
}
#[test]
fn python_messlokation_deserializes() {
let json = include_str!("compat/python/messlokation.json");
let melo: Messlokation =
serde_json::from_str(json).expect("python/messlokation.json must deserialize");
assert_eq!(
melo.messlokations_id.as_ref().map(|id| id.as_ref()),
Some("DE0000000000000000000000000000001")
);
assert!(melo.sparte.is_some(), "sparte must be present");
}
#[test]
fn python_vertrag_deserializes() {
let json = include_str!("compat/python/vertrag.json");
let v: Vertrag = serde_json::from_str(json).expect("python/vertrag.json must deserialize");
assert_eq!(v.vertragsnummer.as_deref(), Some("V-2025-001"));
assert!(v.sparte.is_some(), "sparte must be present");
assert!(v.vertragsart.is_some(), "vertragsart must be present");
}
#[test]
fn python_rechnung_deserializes() {
let json = include_str!("compat/python/rechnung.json");
let r: Rechnung =
serde_json::from_str(json).expect("python/rechnung.json must deserialize");
assert_eq!(r.rechnungsnummer.as_deref(), Some("R-2025-0042"));
assert!(r.gesamtbrutto.is_some(), "gesamtbrutto must be present");
assert!(r.gesamtnetto.is_some(), "gesamtnetto must be present");
assert!(r.gesamtsteuer.is_some(), "gesamtsteuer must be present");
}
#[test]
fn go_marktlokation_deserializes() {
let json = include_str!("compat/go/marktlokation.json");
let malo: Marktlokation =
serde_json::from_str(json).expect("go/marktlokation.json must deserialize");
assert_eq!(
malo.marktlokations_id.as_ref().map(|id| id.as_ref()),
Some("51238696781")
);
assert!(malo.sparte.is_some(), "sparte must be present");
assert!(
malo.energierichtung.is_some(),
"energierichtung must be present"
);
}
#[test]
fn go_messlokation_deserializes() {
let json = include_str!("compat/go/messlokation.json");
let melo: Messlokation =
serde_json::from_str(json).expect("go/messlokation.json must deserialize");
assert_eq!(
melo.messlokations_id.as_ref().map(|id| id.as_ref()),
Some("DE0000000000000000000000000000002")
);
assert!(melo.sparte.is_some(), "sparte must be present");
}
#[test]
fn go_vertrag_deserializes() {
let json = include_str!("compat/go/vertrag.json");
let v: Vertrag = serde_json::from_str(json).expect("go/vertrag.json must deserialize");
assert_eq!(v.vertragsnummer.as_deref(), Some("VT-2025-9999"));
assert!(v.sparte.is_some(), "sparte must be present");
assert!(v.vertragsart.is_some(), "vertragsart must be present");
}
#[test]
fn go_rechnung_deserializes() {
let json = include_str!("compat/go/rechnung.json");
let r: Rechnung = serde_json::from_str(json).expect("go/rechnung.json must deserialize");
assert_eq!(r.rechnungsnummer.as_deref(), Some("INV-2025-007"));
assert!(r.gesamtbrutto.is_some(), "gesamtbrutto must be present");
assert!(r.gesamtnetto.is_some(), "gesamtnetto must be present");
assert!(r.gesamtsteuer.is_some(), "gesamtsteuer must be present");
}
}
#[cfg(all(feature = "json", feature = "versioned"))]
mod outbound_tests {
use rubo4e::current::{Betrag, Marktlokation, Rechnung, Vertrag};
use rubo4e::json::Bo4eJsonExt;
use rubo4e::Bo4eObject as _;
#[test]
fn constructed_bo_carries_typ_and_version() {
let v = Vertrag::default();
let json = v.to_json_german().expect("serialize");
assert!(json.contains(r#""_typ":"VERTRAG""#), "missing _typ: {json}");
assert!(
json.contains(&format!(r#""_version":"{}""#, v.schema_version())),
"missing _version: {json}"
);
}
#[test]
fn constructed_com_carries_version_but_not_typ() {
let json = Betrag::default().to_json_german().expect("serialize");
assert!(json.contains(r#""_version""#), "missing _version: {json}");
assert!(
!json.contains(r#""_typ""#),
"COM must not carry _typ: {json}"
);
}
#[test]
fn nested_com_carries_version() {
let r = Rechnung {
gesamtnetto: Some(Betrag::default()),
..Default::default()
};
let value: serde_json::Value =
serde_json::from_str(&r.to_json_german().expect("serialize")).expect("valid json");
assert!(
value["gesamtnetto"]["_version"].is_string(),
"nested COM lost _version: {value}"
);
}
#[test]
fn deserialized_version_is_not_overwritten() {
let body =
r#"{"_typ":"MARKTLOKATION","_version":"v202501.0.0","marktlokationsId":"51238696781"}"#;
let malo: Marktlokation = serde_json::from_str(body).expect("deserialize");
assert_eq!(malo.version.as_deref(), Some("v202501.0.0"));
assert!(malo
.to_json_german()
.expect("serialize")
.contains(r#""_version":"v202501.0.0""#));
}
#[test]
fn absent_version_stays_absent() {
let malo: Marktlokation =
serde_json::from_str(r#"{"_typ":"MARKTLOKATION"}"#).expect("deserialize");
assert_eq!(malo.version, None);
assert!(!malo
.to_json_german()
.expect("serialize")
.contains("_version"));
}
}