gioser

tawasuyu/brahman

Rust 476TOML 190Markdown 50JSON 176602 Definiciones

⎇ 170d1f890abd3566703fc33ab44a1bb743e7e6c1 crates/modules/nakui/ui-schema/tests/example_modules.rs Rust · 89 líneas · 2.8 KB Historia Quién tocó qué crudo

feat(nakui): metainterfaz declarativa + 6 modulos ERP estandar 06c4fb913 · 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_six_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_orders",
31            "suppliers",
32        ],
33        "expected 6 modules in alphabetical order"
34    );
35}
36
37#[test]
38fn every_demo_module_has_list_and_form_views() {
39    let mods = load_modules_from_dir(examples_dir()).unwrap();
40    for m in &mods {
41        let mut has_list = false;
42        let mut has_form = false;
43        for v in m.views.values() {
44            match v {
45                View::List(_) => has_list = true,
46                View::Form(_) => has_form = true,
47            }
48        }
49        assert!(
50            has_list && has_form,
51            "module {} should expose at least one list + one form view",
52            m.id
53        );
54    }
55}
56
57#[test]
58fn every_demo_form_field_kind_is_recognized() {
59    // Sanity: ningún módulo demo usa un kind que no esté en el enum
60    // (sería rechazado al parsear, pero check explícito no daña).
61    let mods = load_modules_from_dir(examples_dir()).unwrap();
62    for m in &mods {
63        for v in m.views.values() {
64            if let View::Form(form) = v {
65                for f in &form.fields {
66                    let _ok = matches!(
67                        f.kind,
68                        FieldKind::Text
69                            | FieldKind::Multiline
70                            | FieldKind::Number
71                            | FieldKind::Boolean
72                            | FieldKind::Date
73                    );
74                }
75            }
76        }
77    }
78}
79
80#[test]
81fn every_module_validates_clean() {
82    // validate() chequea que cada MenuItem.view exista en views.
83    // Un typo en cualquiera de los 6 módulos haría fallar este test.
84    let mods = load_modules_from_dir(examples_dir()).unwrap();
85    for m in &mods {
86        m.validate()
87            .unwrap_or_else(|e| panic!("module {} failed validate: {e}", m.id));
88    }
89}