automapper-validation 0.1.59

AHB condition expression parsing, evaluation, and EDIFACT validation
Documentation
//! Verifies [73] uses the Artikel-ID codelist correctly for UTILMD/Preisangabe.

use automapper_validation::eval::{
    ConditionEvaluator, ConditionResult, EvaluationContext, MapExternalProvider,
};
use automapper_validation::generated::fv2504::UtilmdStromConditionEvaluatorFV2504;
use mig_types::segment::OwnedSegment;

fn pia(code: &str) -> OwnedSegment {
    OwnedSegment {
        id: "PIA".to_string(),
        elements: vec![vec!["Z02".to_string()], vec![code.to_string()]],
        segment_number: 0,
    }
}

#[test]
fn evaluate_73_returns_false_when_no_pia_code_is_x_in_utilmd_preisangabe() {
    // 55218 fixture PIAs — NONE carry X in UTILMD/Preisangabe.
    let segments = vec![
        pia("1-02-0-001"),
        pia("1-02-0-002"),
        pia("1-08-4-004"),
        pia("1-10-1"),
        pia("1-10-2"),
        pia("1-10-4"),
    ];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(73, &ctx), ConditionResult::False);
}

#[test]
fn evaluate_73_returns_true_when_some_pia_code_has_x_in_utilmd_preisangabe() {
    // 1-07-3-001 is the one code in v5.6 with UTILMD/Preisangabe=X.
    let segments = vec![pia("1-07-3-001")];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(73, &ctx), ConditionResult::True);
}

#[test]
fn evaluate_73_returns_false_with_no_pia_segments() {
    let segments = vec![];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(73, &ctx), ConditionResult::False);
}

#[test]
fn evaluate_73_ignores_pia_with_non_z02_qualifier() {
    // PIA+5+<code> is "Produktcode" — out of scope for [73].
    // Even if the code is Preisangabe=X in the codelist, the rule
    // only fires for Z02 (Artikel-ID) qualifier.
    let pia_non_z02 = OwnedSegment {
        id: "PIA".to_string(),
        segment_number: 0,
        elements: vec![vec!["5".to_string()], vec!["1-07-3-001".to_string()]],
    };
    let segments = vec![pia_non_z02];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(73, &ctx), ConditionResult::False);
}

#[test]
fn evaluate_73_returns_false_for_code_not_in_codelist() {
    // Pins .unwrap_or(false) — a PIA+Z02 with a code the codelist
    // doesn't know about is treated as False, not True.
    let segments = vec![pia("9-99-9-999")];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(73, &ctx), ConditionResult::False);
}

#[test]
fn evaluate_284_returns_true_when_pia_code_has_x_in_utilmd_codeverwendung() {
    // 1-02-0-001 has UTILMD/Codeverwendung=X in the codelist.
    let segments = vec![pia("1-02-0-001")];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(284, &ctx), ConditionResult::True);
}

#[test]
fn evaluate_284_returns_false_when_pia_code_has_no_x_in_utilmd_codeverwendung() {
    // 1-01-1-001 has UTILMD/Codeverwendung=-- in the codelist.
    let segments = vec![pia("1-01-1-001")];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(284, &ctx), ConditionResult::False);
}

#[test]
fn evaluate_284_returns_false_with_no_pia_segments() {
    let segments = vec![];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(284, &ctx), ConditionResult::False);
}

#[test]
fn evaluate_284_ignores_pia_with_non_z02_qualifier() {
    // PIA+5+<code> is "Produktcode" — out of scope for [284].
    // Even with a Codeverwendung=X code, the rule only fires for Z02.
    let pia_non_z02 = OwnedSegment {
        id: "PIA".to_string(),
        segment_number: 0,
        elements: vec![vec!["5".to_string()], vec!["1-02-0-001".to_string()]],
    };
    let segments = vec![pia_non_z02];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(284, &ctx), ConditionResult::False);
}

#[test]
fn evaluate_284_returns_false_for_code_not_in_codelist() {
    // Pins .unwrap_or(false) for [284] — a PIA+Z02 with an unknown
    // code is treated as False, not True.
    let segments = vec![pia("9-99-9-999")];
    let external = MapExternalProvider::new(Default::default());
    let ctx = EvaluationContext::new("55218", &external, &segments);
    let eval = UtilmdStromConditionEvaluatorFV2504::default();
    assert_eq!(eval.evaluate(284, &ctx), ConditionResult::False);
}