use super::strategies::*;
use crate::compliance::ComplianceErrorKind;
use crate::compliance::ComplianceStatus;
use crate::ports::compliance::ComplianceStrategy;
use crate::product_group::ProductGroupData;
fn battery() -> ProductGroupData {
ProductGroupData::Battery(Box::new(crate::test_support::sample_battery_data()))
}
fn textile() -> ProductGroupData {
ProductGroupData::Textile(Box::new(crate::product_group::TextileData {
carbon_footprint_kg_co2e: Some(8.5),
recycled_content_pct: Some(42.0),
repair_score: Some(7.5),
..crate::test_support::sample_textile_data()
}))
}
#[test]
fn textile_passthrough_lifts_declared_metrics_verbatim() {
let result = PassthroughTextileStrategy
.compute(&textile(), None)
.expect("textile data");
assert_eq!(result.co2e_score, Some(8.5));
assert_eq!(result.recycled_content_pct, Some(42.0));
assert_eq!(result.repairability_index, Some(7.5));
assert_eq!(
result.compliance_status,
ComplianceStatus::PassthroughNoValidation
);
assert!(result.violations.is_empty() && result.warnings.is_empty());
assert!(
result.receipt.is_none() && result.ruleset_version.is_none(),
"no calculation ran, so there is no receipt to show for one"
);
}
#[test]
fn battery_passthrough_leaves_recycled_content_unset() {
let result = PassthroughBatteryStrategy
.compute(&battery(), None)
.expect("battery data");
assert!(
result.recycled_content_pct.is_none(),
"four per-metal percentages must not be collapsed into one"
);
assert!(
result.repairability_index.is_none(),
"no EU repairability index applies to batteries"
);
assert_eq!(
result.compliance_status,
ComplianceStatus::PassthroughNoValidation
);
}
#[test]
fn a_strategy_refuses_another_product_groups_data() {
let err = PassthroughBatteryStrategy
.compute(&textile(), None)
.expect_err("battery strategy must refuse textile data");
assert_eq!(err.kind, ComplianceErrorKind::InvalidInput);
assert!(err.message.contains("textile"), "{}", err.message);
}
#[test]
fn product_group_keys_match_the_catalog() {
let catalog = crate::ProductGroupCatalog::new();
for key in [
PassthroughBatteryStrategy.product_group_key(),
PassthroughTextileStrategy.product_group_key(),
] {
assert!(
catalog.get(key).is_some(),
"'{key}' is not a catalog product_group key"
);
}
}