Files
Investidor-V2/tests/frontend/fiscal-form-entry.test.mjs
T

78 lines
3.0 KiB
JavaScript

import { compileFunction } from 'node:vm';
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';
import * as forms from '../../resources/js/lib/fiscal-form-preparation.ts';
const require = createRequire(import.meta.url);
const source = fs.readFileSync(
new URL(
'../../resources/js/pages/portal/fiscal-forms.tsx',
import.meta.url,
),
'utf8',
);
const compiled = ts.transpileModule(source, {
compilerOptions: {
module: ts.ModuleKind.CommonJS,
target: ts.ScriptTarget.ES2022,
jsx: ts.JsxEmit.ReactJSX,
},
}).outputText;
const module = { exports: {} };
compileFunction(compiled, ['require', 'module', 'exports'])(
(name) =>
name === '@inertiajs/react'
? {
Head: () => null,
Link: ({ href, children, ...props }) =>
React.createElement('a', { href, ...props }, children),
router: { on: () => () => {} },
}
: name === '@/layouts/portal-navigation'
? { PortalMenu: () => null }
: name === '@/lib/fiscal-form-preparation'
? forms
: require(name),
module,
module.exports,
);
void test('fiscal entry renders labelled editable fields and a guided preparation rather than legislation', () => {
const html = renderToStaticMarkup(
React.createElement(module.exports.default),
);
for (const label of [
'Identificação e período',
'Nome ou designação social',
'NUIT',
'Período — ano e mês',
'Conferir e guardar',
'Guardar ficheiro para continuar',
'Recuperar ficheiro guardado',
'Confirmar recuperação',
]) {
// Confirmation appears only after a compatible file is selected.
if (label !== 'Confirmar recuperação')
assert.ok(html.includes(label), label);
}
assert.equal((html.match(/inputMode="decimal"/g) ?? []).length, 27);
assert.match(html, /sem submissão à Autoridade Tributária/);
assert.match(html, /Não há gravação automática/);
assert.doesNotMatch(html, /value="0"/);
});
void test('IRPC entry opens the requested form directly and keeps its partial coverage explicit', () => {
const html = renderToStaticMarkup(
React.createElement(module.exports.default, { initialTax: 'irpc' }),
);
assert.match(html, /IRPC — Modelo 22/);
assert.match(html, /L8 permanece parcial/);
assert.match(html, /303 — Dupla tributação económica/);
assert.match(html, /304 — Dupla tributação internacional/);
assert.match(html, /Não utilize a mesma parcela/);
assert.equal((html.match(/inputMode="decimal"/g) ?? []).length, 24);
assert.doesNotMatch(html, /01 — Base das operações/);
});