gioser

tawasuyu/brahman

Rust 307TOML 110JSON 14Markdown 113941 Definiciones

⎇ 932e7464d7574f32694619763f4561f17b63e5e7 crates/modules/nakui/ui-schema/tests/example_modules.rs Rust · 116 líneas · 3.8 KB Historia Quién tocó qué crudo

feat(nakui-ui): Action::Morphism wired al pipeline real (compute -> log -> apply) 932e7464d · Sergio ·

1//! Validación de los 6 módulos demo en `examples/nakui-modules/`.
2//!
3//! Si esto verde, garantizamos que un usuario que clone el repo y
4//! corra `NAKUI_MODULES_DIR=examples/nakui-modules cargo run -p nakui-ui`
5//! va a obtener los 6 módulos cargados sin tocar nada.
6
7use nakui_ui_schema::{load_modules_from_dir, FieldKind, View};
8
9fn examples_dir() -> std::path::PathBuf {
10    // Tests corren desde el dir del crate; el repo root está dos
11    // niveles arriba: crates/modules/nakui/ui-schema → repo.
12    let here = std::path::Path::new(env!("CARGO_MANIFEST_DIR"));
13    here.join("../../../..").join("examples/nakui-modules")
14}
15
16#[test]
17fn loads_all_demo_modules() {
18    let dir = examples_dir();
19    let mods = load_modules_from_dir(&dir).unwrap_or_else(|e| {
20        panic!("load failed for {}: {e}", dir.display());
21    });
22    let ids: Vec<&str> = mods.iter().map(|m| m.id.as_str()).collect();
23    assert_eq!(
24        ids,
25        vec![
26            "customers",
27            "inventory_movements",
28            "invoices",
29            "products",
30            "sales_engine",
31            "sales_orders",
32            "suppliers",
33        ],
34        "expected 7 modules in alphabetical order \
35         (sales_engine se sumó al wirear Action::Morphism)"
36    );
37}
38
39#[test]
40fn sales_engine_declares_nakui_module_dir_and_morphism() {
41    // Sanity del módulo demo de morphism: nakui_module_dir set,
42    // y al menos una vista con Action::Morphism en su on_submit.
43    let mods = load_modules_from_dir(examples_dir()).unwrap();
44    let sales = mods
45        .iter()
46        .find(|m| m.id == "sales_engine")
47        .expect("sales_engine debe estar");
48    assert!(
49        sales.nakui_module_dir.is_some(),
50        "sales_engine debería declarar nakui_module_dir"
51    );
52    let has_morphism_view = sales.views.values().any(|v| match v {
53        nakui_ui_schema::View::Form(form) => {
54            matches!(form.on_submit, nakui_ui_schema::Action::Morphism { .. })
55        }
56        _ => false,
57    });
58    assert!(
59        has_morphism_view,
60        "sales_engine debería tener al menos una Form con Action::Morphism"
61    );
62}
63
64#[test]
65fn every_demo_module_has_list_and_form_views() {
66    let mods = load_modules_from_dir(examples_dir()).unwrap();
67    for m in &mods {
68        let mut has_list = false;
69        let mut has_form = false;
70        for v in m.views.values() {
71            match v {
72                View::List(_) => has_list = true,
73                View::Form(_) => has_form = true,
74            }
75        }
76        assert!(
77            has_list && has_form,
78            "module {} should expose at least one list + one form view",
79            m.id
80        );
81    }
82}
83
84#[test]
85fn every_demo_form_field_kind_is_recognized() {
86    // Sanity: ningún módulo demo usa un kind que no esté en el enum
87    // (sería rechazado al parsear, pero check explícito no daña).
88    let mods = load_modules_from_dir(examples_dir()).unwrap();
89    for m in &mods {
90        for v in m.views.values() {
91            if let View::Form(form) = v {
92                for f in &form.fields {
93                    let _ok = matches!(
94                        f.kind,
95                        FieldKind::Text
96                            | FieldKind::Multiline
97                            | FieldKind::Number
98                            | FieldKind::Boolean
99                            | FieldKind::Date
100                    );
101                }
102            }
103        }
104    }
105}
106
107#[test]
108fn every_module_validates_clean() {
109    // validate() chequea que cada MenuItem.view exista en views.
110    // Un typo en cualquiera de los 6 módulos haría fallar este test.
111    let mods = load_modules_from_dir(examples_dir()).unwrap();
112    for m in &mods {
113        m.validate()
114            .unwrap_or_else(|e| panic!("module {} failed validate: {e}", m.id));
115    }
116}