oca-rust 0.1.23

Rust implementation of Overlays Capture Architecture
Documentation
use maplit::hashmap;
use oca_rust::state::{
    attribute::{AttributeBuilder, AttributeType, Entries, Entry},
    encoding::Encoding,
    entry_codes::EntryCodes,
    oca::OCABuilder,
    validator::Validator,
};

use oca_rust::controller::load_oca;

#[test]
fn create_oca() {
    let oca_builder = OCABuilder::new(Encoding::Utf8)
        .add_name(hashmap! {
            "en_EN".to_string() => "Driving Licence".to_string(),
            "pl_PL".to_string() => "Prawo Jazdy".to_string(),
        })
        .add_description(hashmap! {
            "en_EN".to_string() => "OCA representing driving licence".to_string(),
            "pl_PL".to_string() => "OCA reprezentująca prawo jazdy".to_string(),
        });

    let first_name_attr = AttributeBuilder::new("first_name".to_string(), AttributeType::Text)
        .add_label(hashmap! {
            "en_EN".to_string() => "First name: ".to_string(),
            "pl_PL".to_string() => "Imię: ".to_string(),
        })
        .build();

    let last_name_attr = AttributeBuilder::new(String::from("last_name"), AttributeType::Text)
        .set_pii()
        .add_label(hashmap! {
            "en_EN".to_string() => "Last name: ".to_string(),
            "pl_PL".to_string() => "Nazwisko: ".to_string(),
        })
        .build();

    let gender_attr = AttributeBuilder::new(String::from("gender"), AttributeType::Text)
        .add_label(hashmap! {
            "en_EN".to_string() => "Gender: ".to_string(),
            "pl_PL".to_string() => "Płeć: ".to_string(),
        })
        .add_entry_codes(EntryCodes::Array(vec![
            "male".to_string(),
            "female".to_string(),
        ]))
        .add_entries(Entries::Object(vec![
            Entry::new(
                "male".to_string(),
                hashmap! {
                    "en_EN".to_string() => "Male".to_string(),
                    "pl_PL".to_string() => "Mężczyzna".to_string(),
                },
            ),
            Entry::new(
                "female".to_string(),
                hashmap! {
                    "en_EN".to_string() => "Female".to_string(),
                    "pl_PL".to_string() => "Kobieta".to_string(),
                },
            ),
        ]))
        .build();

    let oca = oca_builder
        .add_attribute(first_name_attr)
        .add_attribute(last_name_attr)
        .add_attribute(gender_attr)
        .finalize();
    assert_eq!(oca.capture_base.attributes.len(), 3);
    assert_eq!(oca.capture_base.pii.len(), 1);

    let validator =
        Validator::new().enforce_translations(vec!["en_EN".to_string(), "pl_PL".to_string()]);
    let validation_result = validator.validate(&oca);
    assert!(validation_result.is_ok());

    let oca_json = serde_json::to_string_pretty(&serde_json::to_value(&oca).unwrap()).unwrap();
    let loaded_oca_builder = load_oca(&mut oca_json.as_bytes()).unwrap();

    let birth_date_attr = AttributeBuilder::new(String::from("birth_date"), AttributeType::Date)
        .set_pii()
        .add_label(hashmap! {
            "en_EN".to_string() => "Birth date: ".to_string(),
            "pl_PL".to_string() => "Data urodzenia: ".to_string(),
        })
        .add_format("DD/MM/YYYY".to_string())
        .build();

    let loaded_oca = loaded_oca_builder.add_attribute(birth_date_attr).finalize();

    assert_eq!(loaded_oca.capture_base.attributes.len(), 4);
    assert_eq!(loaded_oca.capture_base.pii.len(), 2);
}