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:
Sergio
2026-05-10 09:49:20 +00:00
parent d5ef7144b5
commit 3e4278d766
8 changed files with 759 additions and 105 deletions
+82
View File
@@ -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