dpp-domain 0.19.0

EU Digital Product Passport domain types, port traits, and per-field disclosure policy
Documentation
//! How a product identity is formed and compared.

use super::identity::*;
use crate::passport::ManufacturerInfo;
use crate::passport::Passport;
use crate::product_group::ProductGroup;
use crate::product_group::{ProductGroupData, TextileData};

fn base_passport(
    product_group: ProductGroup,
    product_group_data: Option<ProductGroupData>,
) -> Passport {
    Passport {
        batch_id: Some("BATCH-1".into()),
        product_name: "Test".into(),
        product_group,
        manufacturer: ManufacturerInfo {
            name: "Acme".into(),
            address: "1 Street".into(),
            did_web_url: None,
        },
        product_group_data,
        ..crate::test_support::sample_passport()
    }
}

fn battery_data() -> ProductGroupData {
    ProductGroupData::Battery(Box::new(crate::test_support::sample_battery_data()))
}

#[test]
fn battery_passport_yields_identity() {
    let p = base_passport(ProductGroup::Battery, Some(battery_data()));
    let id = ProductIdentity::from_passport(&p).expect("battery has a gtin");
    assert_eq!(id.product_group, ProductGroup::Battery);
    assert_eq!(id.gtin, "09506000134352");
    assert_eq!(id.batch_id.as_deref(), Some("BATCH-1"));
}

#[test]
fn textile_passport_yields_identity() {
    let textile_data = ProductGroupData::Textile(Box::new(TextileData {
        country_of_origin: "BD".into(),
        care_instructions: "wash".into(),
        chemical_compliance_standard: "OEKO-TEX 100".into(),
        ..crate::test_support::sample_textile_data()
    }));
    let p = base_passport(ProductGroup::Textile, Some(textile_data));
    let id = ProductIdentity::from_passport(&p).expect("textile has a gtin");
    assert_eq!(id.product_group, ProductGroup::Textile);
    assert_eq!(id.gtin, "09506000134352");
}

#[test]
fn no_product_group_data_yields_no_identity() {
    let p = base_passport(ProductGroup::Battery, None);
    assert!(ProductIdentity::from_passport(&p).is_none());
}