automapper-validation 0.2.0

AHB condition expression parsing, evaluation, and EDIFACT validation
Documentation
use automapper_validation::eval::codelist::{ArtikelIdCodelist, CodelistColumn};
use automapper_validation::eval::{EvaluationContext, MapExternalProvider};

const MINI_JSON: &str = r#"{
    "version": "5.6",
    "valid_from": "2025-09-01",
    "source_url": "https://example.com",
    "source_published": "2025-09-30",
    "pipeline_version": 1,
    "codes": {
        "1-02-0-001": {
            "description": "Grundpreis Marktlokation",
            "einheit": "€/Tag",
            "utilmd": { "codeverwendung": true,  "preisangabe": false },
            "pricat":  { "codeverwendung": true,  "preisangabe": true  },
            "invoic":  { "codeverwendung": true,  "preisangabe": true  }
        },
        "1-08-4-004": {
            "description": "Höchstbetrag Konzessionsabgabe",
            "einheit": "€/kWh",
            "utilmd": { "codeverwendung": true,  "preisangabe": false },
            "pricat":  { "codeverwendung": true,  "preisangabe": false },
            "invoic":  { "codeverwendung": true,  "preisangabe": true  }
        }
    }
}"#;

#[test]
fn flag_returns_true_for_x_marked_column() {
    let list = ArtikelIdCodelist::from_json(MINI_JSON).unwrap();
    assert_eq!(
        list.flag("1-02-0-001", CodelistColumn::UtilmdCodeverwendung),
        Some(true)
    );
    assert_eq!(
        list.flag("1-02-0-001", CodelistColumn::UtilmdPreisangabe),
        Some(false)
    );
    assert_eq!(
        list.flag("1-08-4-004", CodelistColumn::InvoicPreisangabe),
        Some(true)
    );
}

#[test]
fn flag_returns_none_for_unknown_code() {
    let list = ArtikelIdCodelist::from_json(MINI_JSON).unwrap();
    assert_eq!(
        list.flag("9-99-9-999", CodelistColumn::UtilmdPreisangabe),
        None
    );
}

#[test]
fn embedded_contains_sample_entries() {
    let list = ArtikelIdCodelist::embedded();
    // Sanity-check entries from Task A1:
    assert_eq!(
        list.flag("1-02-0-001", CodelistColumn::UtilmdPreisangabe),
        Some(false)
    );
    assert_eq!(
        list.flag("1-02-0-001", CodelistColumn::PricatPreisangabe),
        Some(true)
    );
    assert_eq!(
        list.flag("1-08-4-004", CodelistColumn::InvoicPreisangabe),
        Some(true)
    );
}

#[test]
fn context_new_provides_embedded_codelist() {
    let external = MapExternalProvider::new(Default::default());
    let segments = vec![];
    let ctx = EvaluationContext::new("55218", &external, &segments);
    // The codelist field is always populated with the embedded list.
    assert_eq!(
        ctx.codelist.flag(
            "1-02-0-001",
            automapper_validation::eval::CodelistColumn::UtilmdPreisangabe
        ),
        Some(false),
    );
}