import assert from "node:assert/strict"; import { test } from "node:test"; import { catalogKeys, inventoryKeys } from "@metis/assets/client"; import { companyKeys } from "@metis/companies/client"; import { identityKeys } from "@metis/identity/client"; import type { SessionResponseDTO, UserDTO } from "@metis/identity/common"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { renderToStaticMarkup } from "react-dom/server"; import { I18nextProvider } from "react-i18next"; import { App } from "./app"; import { createAppI18n } from "./i18n"; import { workspaceAssets, workspaceCatalog, workspaceCompany } from "./test-fixtures/workspace"; const user: UserDTO = { id: "c90b4d83-b06a-4d27-a402-e64899a2dfc2", name: "Usuario de prueba", email: "user@example.test", active: true, isInitialAdmin: false, }; async function renderPage( language: string, session?: SessionResponseDTO, seed?: (client: QueryClient) => void ) { const { instance, initialization } = createAppI18n(language); await initialization; const client = new QueryClient({ defaultOptions: { queries: { retry: false, staleTime: Number.POSITIVE_INFINITY } }, }); if (session) { client.setQueryData(identityKeys.session, session); } seed?.(client); try { return renderToStaticMarkup( ); } finally { client.clear(); } } test("el acceso protege el contenido y traduce la carga de sesión", async () => { for (const [language, pending] of [ ["es", "Comprobando acceso"], ["en", "Checking access"], ] as const) { const markup = await renderPage(language); assert.equal(markup.includes("Tu espacio de soporte"), false); assert.equal(markup.includes("Your support workspace"), false); assert.match(markup, /role="combobox"/); assert.ok(markup.includes(language === "es" ? "Español" : "English")); assert.ok(markup.includes(pending)); assert.ok(markup.includes('role="status"')); } }); test("la configuración única y el login presentan sus formularios traducidos sin acceso al contenido", async () => { for (const [language, setupTitle, loginTitle] of [ ["es", "Configura Metis Desk", "Accede a Metis Desk"], ["en", "Set up Metis Desk", "Sign in to Metis Desk"], ] as const) { const snapshot = { user: null, csrfToken: "a".repeat(64), setupRequired: true }; const setup = await renderPage(language, snapshot); assert.ok(setup.includes(setupTitle)); assert.match(setup, /autoComplete="new-password"/); assert.match(setup, /minLength="8"/); assert.equal(setup.includes("Tu espacio de soporte"), false); const login = await renderPage(language, { ...snapshot, setupRequired: false }); assert.ok(login.includes(loginTitle)); assert.match(login, /autoComplete="current-password"/); assert.match(login, /minLength="1"/); assert.equal(login.includes('autoComplete="name"'), false); } }); test("solo el administrador inicial ve la navegación de gestión de usuarios", async () => { const snapshot = { user, csrfToken: "a".repeat(64), setupRequired: false }; const normal = await renderPage("es", snapshot); assert.ok(normal.includes("Tu espacio de soporte")); assert.ok(normal.includes("Mi contraseña")); assert.ok(normal.includes("Salir")); assert.equal(normal.includes(">Usuarios"), false); const admin = await renderPage("es", { ...snapshot, user: { ...user, isInitialAdmin: true } }); assert.ok(admin.includes(">Usuarios")); }); test("el espacio mantiene compañía, secciones y ficha del primer activo sin formularios visibles", async () => { for (const [language, spaces, panel] of [ ["es", "Espacios de compañías", "Ficha del activo seleccionado"], ["en", "Company spaces", "Selected asset details"], ]) { const html = await renderPage( language ?? "es", { user, csrfToken: "a".repeat(64), setupRequired: false }, (client) => { client.setQueryData(companyKeys.list, { companies: [workspaceCompany] }); client.setQueryData(companyKeys.detail(workspaceCompany.id), { company: workspaceCompany }); client.setQueryData(inventoryKeys.company(workspaceCompany.id), { assets: workspaceAssets, }); client.setQueryData(catalogKeys.scope(workspaceCompany.id), workspaceCatalog); } ); assert.ok(html.includes(`aria-label="${spaces}"`)); assert.ok(html.includes(`aria-label="${panel}"`)); assert.ok(html.includes("PORT-ANA-01")); assert.ok(html.includes("PORT-RESERVA")); assert.ok(html.includes("Ana López")); assert.ok(html.includes("Lenovo")); assert.ok(html.includes(language === "es" ? "Ficha e historial" : "Details and history")); assert.equal(html.includes("