78 lines
3.0 KiB
JavaScript
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/);
|
|
});
|