import assert from "node:assert/strict"; import { test } from "node:test"; import { UniqueID } from "@repo/rdx-ddd"; import { Maybe } from "@repo/rdx-utils"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { createInstance } from "i18next"; import type { ReactNode } from "react"; import { renderToStaticMarkup } from "react-dom/server"; import { I18nextProvider } from "react-i18next"; import { buildCatalogResponse } from "../api/application/asset-catalog-response.builder"; import { AssetCatalog } from "../api/domain/asset-catalog.aggregate"; import { seedAssetCatalog } from "../api/domain/asset-catalog-seed"; import type { RelationshipDTO } from "../common"; import { AssetForm } from "./asset-form"; import { AssetRelationships } from "./asset-relationships"; import { catalogKeys } from "./catalog-api"; import { CatalogRelationForm } from "./catalog-relation-form"; import { CatalogTemplateForm } from "./catalog-template-form"; import { assetsEnglish, assetsSpanish } from "./i18n"; import { inventoryKeys } from "./inventory-api"; import { AssetInventoryPage } from "./inventory-page"; import { WorkstationForm } from "./workstation-form"; import { WorkstationsPage } from "./workstations-page"; const companyId = UniqueID.generateNewID().toPrimitive(); const lookups = { sites: [], people: [], onCreateSite: () => undefined, onCreatePerson: () => undefined, }; async function render(language: string, node: ReactNode, relationships: RelationshipDTO[] = []) { const i18n = createInstance(); await i18n.init({ lng: language, resources: { es: { assets: assetsSpanish }, en: { assets: assetsEnglish } }, }); const client = new QueryClient(); client.setQueryData(inventoryKeys.company(companyId), { assets: [], relationships, workstations: [], }); client.setQueryData( catalogKeys.scope(companyId), buildCatalogResponse(seedAssetCatalog(AssetCatalog.create()), Maybe.none()) ); try { return renderToStaticMarkup( {node} ); } finally { client.clear(); } } test("Inventario traducido con alta de cabecera y sin formulario junto al listado", async () => { for (const language of ["es", "en"]) { const html = await render( language, ); assert.equal(html.includes(" { const html = await render( "es", undefined} /> ); for (const label of ["Nueva plantilla", "Nueva sede", "Nueva persona"]) { assert.ok(html.includes(`aria-label="${label}"`)); } assert.ok(html.indexOf('name="notes"') < html.indexOf(" undefined} scope={companyId} /> ); assert.equal(child.includes('aria-label="Nuevo campo"'), false); }); test("Las fichas leen ambos sentidos y conservan la auditoría de relaciones retiradas", async () => { const sourceId = UniqueID.generateNewID().toPrimitive(); const targetId = UniqueID.generateNewID().toPrimitive(); const link: RelationshipDTO = { id: UniqueID.generateNewID().toPrimitive(), companyId, values: { sourceId, targetId, typeId: UniqueID.generateNewID().toPrimitive(), name: "Alojado en", inverseName: "Aloja", symmetric: false, notes: "Rack 1", }, createdBy: UniqueID.generateNewID().toPrimitive(), createdByName: "Técnico", createdAt: "2026-10-04T10:00:00.000Z", endedBy: null, endedByName: null, endedAt: null, }; const source = await render( "es", , [link] ); const target = await render( "es", , [link] ); assert.ok(source.includes("Alojado en")); assert.ok(target.includes("Aloja")); assert.ok(source.includes("Creada por Técnico")); assert.ok(source.includes("Retirar relación")); const ended = await render( "es", , [ { ...link, endedBy: link.createdBy, endedByName: "Técnico", endedAt: "2026-10-04T11:00:00.000Z", }, ] ); assert.ok(ended.includes("Relaciones retiradas")); assert.ok(ended.includes("Retirada por Técnico")); assert.ok(!ended.includes(">Retirar relación<")); }); test("El formulario de tipo de relación presenta ayuda justo antes de sus operaciones", async () => { for (const language of ["es", "en"]) { const html = await render( language, undefined} scope={companyId} /> ); assert.ok(html.indexOf('name="description"') < html.indexOf(" { for (const language of ["es", "en"]) { const html = await render( language, ); assert.ok(html.includes(language === "es" ? "Nuevo puesto" : "New workstation")); assert.ok( html.includes( language === "es" ? "Esta compañía todavía no tiene puestos de trabajo." : "This company has no workstations yet." ) ); assert.equal(html.includes(" { const html = await render( "es", undefined} /> ); for (const label of ["Nueva sede", "Nueva persona", "Nuevo activo"]) { assert.ok(html.includes(`aria-label="${label}"`)); } assert.ok(html.indexOf('name="active"') < html.indexOf(" undefined} /> ); for (const label of ["Nueva sede", "Nueva persona", "Nueva plantilla"]) { assert.ok(!nested.includes(`aria-label="${label}"`)); } });