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("