39 lines
2.5 KiB
JavaScript
39 lines
2.5 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:{}};
|
|
new Function('require','module','exports',compiled)(name=>name==='@inertiajs/react'?{Head:()=>null,Link:({href,children,...props})=>React.createElement('a',{href,...props},children),router:{on:()=>()=>{}}}:name==='@/components/portal-menu'?{PortalMenu:()=>null}:name==='@/lib/fiscal-form-preparation'?forms:require(name),module,module.exports);
|
|
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/);
|
|
});
|