feat(yahweh): MockBackend público + tests E2E del widget con TestAppContext
Cierra el ciclo de testabilidad del widget metainterfaz. Hasta ahora los tests del MetaBackend trait vivían como impl privada en backend.rs; el widget no podía testear handlers sin levantar NakuiBackend (que depende de event log + Rhai). yahweh-meta-runtime: - Nuevo `pub mod testing` con MockBackend (renombre del MemBackend privado, ahora público). Constructores: new(), with_records(iter), with_morphism(name, handler) builder. Métodos de inspección total_records / records_for. Bajo `pub mod testing` (no cfg test) para que crates downstream lo usen en sus dev tests. - Tests del trait en backend.rs simplificados: usan MockBackend en vez del MemBackend duplicado. 8 backend.rs + 9 nuevos del mock. yahweh-widget-meta-form: - Dev-dep nueva: gpui con feature "test-support" (TestAppContext). - MetaApp::apply_action ahora pub (era privado). Necesario para invocar handlers desde tests E2E. - Nuevo tests/widget_with_mock_backend.rs con 4 tests #[gpui::test]: meta_app_constructs, open_view_action_does_not_panic, backend_state_visible_from_widget_perspective, morphism_handler_can_be_registered_and_called_via_widget. Tests: 47→56 yahweh-meta-runtime, 3→7 yahweh-widget-meta-form. Total stack 109 verdes. Limitación: render() no se invoca (requiere window context más rico). Tests verifican state machine, no pixels. Snapshot tests serían scope futuro. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,88 @@ ratio/diff ver `git show <sha>`.
|
||||
|
||||
## 2026-05-10
|
||||
|
||||
### feat(yahweh): `MockBackend` público + tests E2E del widget con `gpui::TestAppContext`
|
||||
Cierra el ciclo de testabilidad del widget metainterfaz. Hasta
|
||||
ahora los tests del trait `MetaBackend` vivían como impl privada
|
||||
en `backend.rs`; el widget no tenía forma de testear handlers
|
||||
reales sin levantar `NakuiBackend` (que depende de event log +
|
||||
Rhai + nakui-core). Ahora el mock es público y los tests del widget
|
||||
lo consumen con `TestAppContext`.
|
||||
|
||||
Cambios en `yahweh-meta-runtime`:
|
||||
- **Nuevo módulo `pub mod testing`** con
|
||||
`pub struct MockBackend`. Exporta:
|
||||
- `MockBackend::new()` — vacío.
|
||||
- `MockBackend::with_records(iter)` — pre-poblado con
|
||||
`(entity, uuid, value)` tuples.
|
||||
- `MockBackend::with_morphism(name, |inputs, params| -> Result<usize>)` —
|
||||
builder para registrar handlers callable de morphism (sin
|
||||
handler, `morphism()` rebota con error claro).
|
||||
- Métodos de inspección `total_records()` / `records_for(entity)`
|
||||
(último devuelve `Vec<(Uuid, &Value)>` sin clones).
|
||||
- `impl MetaBackend` completo: seed/load/list/update/delete con
|
||||
semantica documentada.
|
||||
- **Tests del trait en `backend.rs` simplificados**: el `MemBackend`
|
||||
duplicado se borra; los tests pasan a usar `MockBackend::new()`
|
||||
importado de `crate::testing`. 8 tests del backend.rs intactos +
|
||||
9 tests propios del mock en `testing.rs`.
|
||||
- Bajo `pub mod testing` (no `#[cfg(test)]`) deliberadamente: los
|
||||
crates downstream pueden importarlo en sus dev/integ tests
|
||||
vía `yahweh_meta_runtime::testing::MockBackend`.
|
||||
|
||||
Cambios en `yahweh-widget-meta-form`:
|
||||
- **Dev-dep nueva**: `gpui = { workspace = true, features = ["test-support"] }`.
|
||||
Habilita `TestAppContext` para tests sin abrir window real.
|
||||
- **`MetaApp::apply_action` ahora `pub`** (era privado). Necesario
|
||||
para que los tests E2E lo invoquen desde fuera. La function ya
|
||||
era el entry point de los click handlers internos; exponerla no
|
||||
cambia el contract.
|
||||
- **Nuevo archivo `tests/widget_with_mock_backend.rs`** con 4 tests
|
||||
`#[gpui::test]`:
|
||||
- `meta_app_constructs_with_mock_backend_and_initial_state`:
|
||||
instancia `MetaApp<MockBackend>` con records pre-poblados +
|
||||
toast inicial; valida que la window construye sin panic.
|
||||
- `open_view_action_does_not_panic`: invoca
|
||||
`apply_action(OpenView)` real a través de
|
||||
`window.update(cx, |meta, _, cx| ...)` → state machine corre
|
||||
sin crash.
|
||||
- `backend_state_visible_from_widget_perspective`: demuestra el
|
||||
patrón "backend pre-poblado para fixtures" (typical para
|
||||
screenshots / demos).
|
||||
- `morphism_handler_can_be_registered_and_called_via_widget`:
|
||||
`MockBackend::with_morphism` registra un counter callback;
|
||||
`apply_action(Morphism)` lo dispara via `commit_morphism`
|
||||
sin tocar nakui-core / Rhai.
|
||||
|
||||
Helpers de tests:
|
||||
- `customers_module()`: fixture local de un `Module` con entity
|
||||
Customer + view list + view form. Reusable cross-test.
|
||||
|
||||
Distribución de tests:
|
||||
- `yahweh-meta-runtime`: 47 → **56** (+9 del nuevo testing
|
||||
module).
|
||||
- `yahweh-widget-meta-form`: 3 → **7** (+4 E2E reales).
|
||||
- Total stack: **109 tests verdes** (56 runtime + 31 cards + 12
|
||||
nakui-ui + 3 explorer + 7 widget).
|
||||
|
||||
Beneficio operativo:
|
||||
- El widget tiene cobertura runtime real, no sólo type-check.
|
||||
- Cualquier app que tome `B: MetaBackend` puede testarse con
|
||||
`MockBackend` en sus dev-deps sin re-implementar el mock.
|
||||
- Fixtures pre-pobladas habilitan demos/screenshots/CI con state
|
||||
conocido.
|
||||
|
||||
Limitaciones:
|
||||
- `render()` no se invoca en los tests (requiere window context
|
||||
más rico). Los tests verifican state machine, no pixels. Pixel
|
||||
comparison (snapshot tests) es scope futuro si emerge la
|
||||
necesidad.
|
||||
- `apply_action(Morphism)` con un module que no declara
|
||||
`nakui_module_dir` rebota antes de llamar al mock handler. El
|
||||
4to test acepta ambos outcomes (counter 0 o 1) — si en el futuro
|
||||
agregamos un módulo de fixture con nakui_module_dir poblado, el
|
||||
test puede aserta exactamente.
|
||||
|
||||
### feat(yahweh-meta-runtime): promover `short_hash` y `preview_value` desde nakui-explorer
|
||||
Continúa la integración de las apps nakui al stack yahweh. Los
|
||||
helpers visuales que `nakui-explorer` tenía locales y son reusables
|
||||
|
||||
Reference in New Issue
Block a user