Testing
Suite unitaria de Targ-Apps-Finance, plugin Chroma-t2t y comprobaciones de persistencia en dev.
Targ-Apps-Finance mantiene la lógica crítica en módulos puros bajo logic/. Los tests viven en test/ (espejo de logic/ y src/components/). La suite corre con node --test (sin navegador) y el plugin chroma-t2t (@chroma/t2t) expone utilidades equivalentes en dev sobre Chroma.
Suite Node (npm test)
Desde la raíz del proyecto:
cd Targ-Apps-Finance
npm testTambién vía el bridge del plugin:
npm run test:plugin
# equivalente a:
node plugins/chroma-t2t/node/run-tests.mjsMódulos cubiertos
| Área | Archivo de test |
|---|---|
| Persistencia / Chroma-Fs | test/logic/persist.test.js |
| Auth local (perfil + sesión) | test/logic/auth.test.js |
| Onboarding (cuenta financiera) | test/logic/onboarding.test.js |
Ajustes (settings.js) | test/logic/settings.test.js |
| Exportación | test/logic/export.test.js |
| Importación + round-trip | test/logic/import.test.js |
| Recurrencia | test/logic/recurrence.test.js |
| Reportes / gráficos | test/logic/reportCalculations.test.js |
| Integración E2E | test/logic/integration.test.js |
| Formato multi-moneda | test/logic/utils/currency.test.js |
| Cuentas | test/logic/store/accountDomain.test.js |
| Defaults de cuenta | test/logic/store/accountDefaults.test.js |
| Ledger / balances | test/logic/store/ledger.test.js |
| Transacciones | test/logic/store/transactions.test.js |
| Filtros | test/logic/utils/filterTransactions.test.js |
| Select (utilidades) | test/components/Select.test.js |
| DatePicker (utilidades) | test/components/DatePicker.test.js |
Los tests de import/export validan que un backup JSON exportado se reimporta sin pérdida y que payloads inválidos se rechazan antes de sobrescribir el snapshot.
Lógica de export/import
| Módulo | Rol |
|---|---|
logic/export.js | buildExportPayload(), serializeExportPayload() — sin DOM |
logic/import.js | parseImportText(), validateImportPayload(), applyImportPayload() |
logic/persistence/exportImport.js | Descarga de archivo e importData(file) en la UI |
logic/format.js | Re-export de formatCurrency y COMMON_CURRENCIES |
La UI en pages/Settings.js pide confirmación explícita antes de importar y refresca el store con finance.refreshFromStorage() tras un import válido.
Plugin chroma-t2t
Fuente canónica: Chroma-t2t/ (workspace root, paquete @chroma/t2t).
Copia vendoreada para dev: Targ-Apps-Finance/plugins/chroma-t2t/ — mismo patrón que plugins/chroma-fs/ (build/código copiado desde el repo del plugin, no symlink).
Registrado en chroma.json:
"plugins": ["chroma-fs", "chroma-t2t"]Arranque en dev
En localhost (o con ?test=1 en la URL), src/main.js carga plugins/loader.js y ejecuta el hook bootstrapT2t del plugin. El API queda en:
globalThis.__chromaT2tplugins/loader.js resuelve rutas de forma distinta según el mecanismo: fetch() usa la raíz del documento (./plugins/<name>/chroma.plugin.json), mientras que import() usa import.meta.url del propio loader (plugins/<name>/index.js como hermano del archivo). Esto evita el prefijo duplicado plugins/plugins/ que aparecía al mezclar ambas resoluciones.
Los plugins vendoreados viven en plugins/chroma-fs/ (build de Chroma-Fs, sin chroma.plugin.json — ruta legacy) y plugins/chroma-t2t/ (con manifest + wiring Finance en finance.js).
API expuesta
| Método | Descripción |
|---|---|
smokeFinanceSnapshot() | Comprueba que transactions, categories, accounts y budgets son arrays en el snapshot actual |
smokeSnapshot(snapshot?) | Variante genérica sobre las mismas colecciones |
assertPersistRoundTrip() | Escribe cuentas/settings, exporta JSON, reinicia cache y reimporta; falla si hay pérdida |
runAll() | Ejecuta smoke + round-trip en secuencia |
desktopSmokeNote | Recordatorio para verificar persistencia tras reiniciar Chroma Desktop |
npmTestCommand | "npm test" — referencia para la suite Node |
npmTestScript | Ruta al runner Node del plugin |
Ejemplo en consola del navegador (con chroma dev):
await __chromaT2t.runAll()Smoke en Chroma Desktop (Tauri)
Tras crear una cuenta en develop mode, reiniciá Chroma Desktop y confirmá que los datos persisten. En consola del iframe:
getPersistBackend() // debe ser "chroma-fs"
__tafPersist.resolveChromaFsConfigPath()
await __chromaT2t.runAll()Ver Persistence — Web vs Desktop.
Wiring Finance
| Archivo | Rol |
|---|---|
plugins/chroma-t2t/helpers.js | Helpers genéricos @chroma/t2t (copiados desde Chroma-t2t/) |
plugins/chroma-t2t/finance.js | Adaptadores persist/export/import de Finance |
plugins/chroma-t2t/index.js | bootstrapT2t — expone globalThis.__chromaT2t |
plugins/chroma-t2t/chroma.plugin.json declara loadAs: "t2t" y el hook bootstrap: "bootstrapT2t". La lógica de negocio no se duplica: finance.js importa logic/persist.js, logic/export.js y logic/import.js.
Migración desde chroma-test
Antes (chroma-test) | Ahora (chroma-t2t) |
|---|---|
globalThis.__chromaTest | globalThis.__chromaT2t |
plugins/chroma-test/ | plugins/chroma-t2t/ (+ fuente Chroma-t2t/) |
| Helpers acoplados a Finance | Helpers genéricos + finance.js |
loadAs: "test" | loadAs: "t2t" |
Ajustes y moneda
logic/settings.js— reglas puras:normalizeSettings,validateSettings, defaults (defaultCurrency,locale,weekStartsOn,theme).logic/store/settingsStore.js— persistencia bajo la clavesettingsdel snapshot.logic/utils/currency.js—formatCurrencyconIntl.NumberFormat; balances totales agrupados por moneda víacomputeTotalBalanceByCurrencyen el ledger.
Ver también Persistence para el formato del snapshot y el flujo de backup.