Files
Investidor-V2/tests/frontend/cluster-editorial.test.mjs
T
2026-11-14 12:04:52 +02:00

113 lines
3.6 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import fs from 'node:fs';
import { createRequire } from 'node:module';
import React from 'react';
import { renderToStaticMarkup } from 'react-dom/server';
import ts from 'typescript';
const require = createRequire(import.meta.url);
function load(path, dependencies = {}) {
const source = fs.readFileSync(new URL(path, import.meta.url), 'utf8');
const code = ts.transpileModule(source, {
compilerOptions: {
module: ts.ModuleKind.CommonJS,
target: ts.ScriptTarget.ES2022,
jsx: ts.JsxEmit.ReactJSX,
},
}).outputText;
const module = { exports: {} };
new Function('require', 'module', 'exports', code)(
(name) => dependencies[name] ?? require(name),
module,
module.exports,
);
return module.exports;
}
const lib = load('../../resources/js/lib/cluster-competitiveness.ts');
const Page = load('../../resources/js/pages/structures/competitiveness.tsx', {
'@/lib/cluster-competitiveness': lib,
'@/lib/portal-api': {
portalRequest() {
throw new Error('SSR must not send requests');
},
PortalApiError: Error,
},
'../management/shared': { button: '', control: '' },
'@/lib/editorial-states': {
states: {
draft: 'Rascunho',
approved: 'Aprovado',
published: 'Publicado',
},
},
}).default;
const draft = lib.newCompetitivenessDraft('qa-cluster', 'Energia');
draft.region = 'Local sintético';
for (const force of lib.forces) {
draft.forces[force] = {
pressure: 'medium',
evidence: 'Dado sintético',
source: 'Fonte QA',
period: '2026',
rationale: 'Hipótese',
limitations: 'Exemplo',
opportunity: 'Ideia',
};
}
const initial = {
version: 4,
draft,
approved: { draft, version: 4, at: '2026-11-13' },
published: null,
editorial_enabled: true,
history: [],
workflow: {
state: 'approved',
edition: 1,
hash: 'a'.repeat(64),
fresh: true,
contributors: [1],
independent_required: true,
},
};
const render = (state = initial, viewerId = 2) =>
renderToStaticMarkup(
React.createElement(Page, {
clusterId: 'qa-cluster',
sector: 'Energia',
initial: state,
viewerId,
}),
);
test('approved cluster edition requires explicit publication and retains a prior public version', () => {
const html = render();
assert.match(html, /Publicar edição aprovada/);
assert.doesNotMatch(html, /Aprovar torna a versão guardada/);
assert.match(html, /Sem análise aprovada para consulta pública/);
const later = render({
...initial,
published: { draft, version: 2, at: '2026-11-13' },
workflow: { ...initial.workflow, state: 'draft' },
});
assert.match(later, /Consulta pública: versão 2/);
assert.doesNotMatch(later, /Publicar edição aprovada/);
assert.match(later, /Submeter para revisão/);
});
test('changed context disables publication and a disabled workflow remains read only', () => {
const stale = render({
...initial,
workflow: { ...initial.workflow, fresh: false },
});
assert.match(stale, /O contexto do cluster mudou/);
assert.match(
stale,
/<button[^>]*disabled=""[^>]*>Publicar edição aprovada<\/button>/,
);
const disabled = render({ ...initial, editorial_enabled: false });
assert.match(disabled, /<fieldset disabled=""/);
assert.match(disabled, /temporariamente só para consulta/);
});