Files
Investidor-V2/tests/frontend/protected-supply-aggregate.test.mjs
T

153 lines
5.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import test from 'node:test';
import assert from 'node:assert/strict';
import fs from 'node:fs';
import { compileFunction } from 'node:vm';
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);
const file = new URL(
'../../resources/js/components/investment-supply-aggregate.tsx',
import.meta.url,
);
const code = ts.transpileModule(fs.readFileSync(file, 'utf8'), {
compilerOptions: {
jsx: ts.JsxEmit.ReactJSX,
module: ts.ModuleKind.CommonJS,
},
}).outputText;
const module = { exports: {} };
compileFunction(code, ['require', 'module', 'exports'])(
(name) => {
if (name === '@inertiajs/react') return { router: { reload() {} } };
if (name === '@/lib/investor-context') return { contextApi() {} };
if (name === '@/lib/operation-key')
return { createOperationKey: () => 'SYNTHETIC' };
if (name === './catalogue-choice-select')
return {
default: ({ label, options }) =>
React.createElement(
'label',
null,
label,
React.createElement(
'select',
null,
options.map((o) =>
React.createElement(
'option',
{ key: o.value },
o.label,
),
),
),
),
};
return require(name);
},
module,
module.exports,
);
const Component = module.exports.default;
const fixture = () => ({
privacy_version: 1,
privacy_policy: 'fixed_district_cae_division_v1',
context_revision: 1,
recorded_at: '2026-11-15',
requested_territory: { id: 'local', name: 'Local conhecido' },
scope: { id: 'district', name: 'Distrito conhecido', level: 'district' },
broader_context: true,
entities: 987654321,
repeated: 987654321,
uncertain: 987654321,
source_summary: {
label: 'Originais reservados à equipa',
period: '2020',
incomplete_periods: true,
},
filters: {
sector_id: 1,
activity_id: 'published-activity',
activity_label: 'Agricultura',
division_code: '01',
},
groups: [
{
code: '01',
label: 'Agricultura',
total: 987654321,
entities_band: '5–9',
observations_band: '10–14',
scope: {
id: 'district',
name: 'Distrito conhecido',
level: 'district',
},
first_year: 'PRIVATE-DATE',
last_year: null,
},
],
interpretation: 'Não somar grupos nem inferir procura.',
limitations: 'Cobertura desconhecida.',
privacy_notice: 'Grupos pequenos não divulgados.',
});
const render = (history) =>
renderToStaticMarkup(
React.createElement(Component, {
caseId: 'synthetic',
version: 1,
revision: 2,
history,
protectedMode: true,
activityOptions: [
{
id: 'published-activity',
code: '01110',
label: 'Agricultura',
},
],
}),
);
void test('protected presentation shows documentary identities and observations as separate bands, not raw marginal totals or dates', () => {
const html = render([fixture()]);
assert.match(html, /5–9/);
assert.match(html, /10–14/);
assert.match(html, /Identidades documentais/);
assert.match(html, /Observações consolidadas/);
assert.match(html, /Contexto distrital/);
assert.match(html, /Local conhecido/);
assert.match(html, /2020/);
assert.match(html, /períodos não indicados/);
assert.match(html, /O contexto mudou/);
assert.match(html, /Actividade a comparar/);
assert.ok(!html.includes('987654321'));
assert.ok(!html.includes('PRIVATE-DATE'));
});
void test('suppressed and absent results use the same non-inference message, never zero businesses', () => {
const row = fixture();
row.groups = [];
const html = render([row]);
assert.match(html, /podem faltar registos ou existir grupos protegidos/);
assert.match(html, /não significa ausência de empresas/);
assert.ok(!html.includes('987654321'));
});
void test('legacy exact QA snapshots are not displayed in protected mode and current protected history is recoverable', () => {
const legacy = {
...fixture(),
privacy_version: undefined,
entities: 987654321,
};
const html = render([
legacy,
fixture(),
{ ...fixture(), recorded_at: '2026-11-16' },
]);
assert.match(html, /Análise guardada/);
assert.match(html, /2026-11-16/);
assert.ok(!html.includes('987654321'));
assert.ok(!render([legacy]).includes('Identidades documentais'));
});