Files
Investidor-V2/tests/frontend/irpc-investment-window.test.mjs
T
2026-11-10 15:35:24 +02:00

107 lines
4.2 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { investmentCase } from './helpers/irpc-investment-case.mjs';
import {
calculateAnnual,
recordAnnual,
saveAnnualBook,
annualBook,
annualCurrent,
annualHtml,
} from '../../resources/js/lib/irpc-annual-settlement.ts';
import { createProjectDossierReport } from '../../resources/js/lib/project-dossier-report.ts';
void test('CBF15 includes first through fifth civil fiscal exercises, including a late-year start', () => {
for (const [start, exercise] of [
['2026-06-01', 1],
['2025-12-31', 2],
['2024-12-31', 3],
['2023-12-31', 4],
['2022-12-31', 5],
]) {
const c = investmentCase();
c.b.investmentCredit.startDate = start;
const m = calculateAnnual(c.d, c.b);
assert.deepEqual(m.pending, []);
assert.equal(m.investmentCredit.window.exercise, exercise);
assert.equal(m.investmentCredit.window.status, 'active');
assert.equal(
m.investmentCredit.window.lastYear,
Number(start.slice(0, 4)) + 4,
);
assert.deepEqual(m.investmentCredit.deducted, {
numerator: '500',
denominator: '1',
});
}
});
void test('CBF15 sixth exercise expires without erasing actual investment or creating a carry/refund', () => {
const c = investmentCase();
c.b.investmentCredit.startDate = '2021-12-31';
const m = calculateAnnual(c.d, c.b);
assert.deepEqual(m.pending, []);
assert.equal(m.investmentCredit.window.exercise, 6);
assert.equal(m.investmentCredit.window.status, 'expired');
assert.deepEqual(m.investmentCredit.deducted, {
numerator: '0',
denominator: '1',
});
assert.deepEqual(m.arithmeticBalance, {
numerator: '700',
denominator: '1',
});
assert.equal(m.investmentCredit.rows[0].input.amount, '10000');
assert.match(m.investmentCredit.rows[0].reason, /quinto/);
assert.equal(m.investmentCredit.carryCreated, false);
});
void test('CBF15 does not admit future/invalid start dates or import older assets as current-year investments', () => {
for (const start of ['2027-01-01', '2025-02-29', '0000-01-01', '']) {
const c = investmentCase();
c.b.investmentCredit.startDate = start;
assert.equal(calculateAnnual(c.d, c.b).arithmeticBalance, null);
}
const c = investmentCase();
c.b.investmentCredit.startDate = '2022-01-01';
c.b.investmentCredit.assets[0].date = '2025-12-31';
assert.equal(calculateAnnual(c.d, c.b).arithmeticBalance, null);
});
void test('CBF15 existing project uses procedural start; new project can invest before operations within the same window', () => {
const c = investmentCase();
c.b.investmentCredit.startKind = 'existing';
c.b.investmentCredit.startDate = '2022-12-31';
assert.deepEqual(calculateAnnual(c.d, c.b).pending, []);
c.b.investmentCredit.startDate = '2026-06-01';
assert.equal(calculateAnnual(c.d, c.b).arithmeticBalance, null);
c.b.investmentCredit.startKind = 'new';
assert.deepEqual(calculateAnnual(c.d, c.b).pending, []);
});
void test('CBF15 fifth-year then expiry recovers and reports window while preserving earlier result', () => {
const c = investmentCase();
c.b.investmentCredit.startDate = '2022-12-31';
let b = recordAnnual(c.d, c.b, '2026-11-10T14:00:00Z');
b.investmentCredit.startDate = '2021-12-31';
b = recordAnnual(c.d, b, '2026-11-10T14:01:00Z');
const d = { ...c.d, modelo_a_snapshot: saveAnnualBook(c.d, b) },
back = annualBook(d);
assert.equal(annualCurrent(d, back), true);
assert.equal(back.history.length, 1);
assert.deepEqual(back.history[0].model.investmentCredit.deducted, {
numerator: '500',
denominator: '1',
});
assert.deepEqual(
calculateAnnual(d, back).investmentCredit,
back.result.model.investmentCredit,
);
assert.match(annualHtml(d), /JanelaCBF15\/1/);
assert.match(annualHtml(d), /prazo expirado/);
assert.match(
JSON.stringify(
createProjectDossierReport(d, {
selectedSections: new Set(['finance']),
generatedAt: '2026-11-10T14:01:00Z',
}),
),
/JanelaCBF15/,
);
});