UNPKG

@accounter/shaam6111-generator

Version:

Fully typed application that generates, parses, and validates SHAAM 6111 tax reports.

122 lines (115 loc) 4.36 kB
import { generateReport } from '../../src/index.js'; import { IndividualOrCompanyEnum, ReportData, ValidationError } from '../../src/types/index.js'; describe('Integration Test: generateReport', () => { it('should generate a full report string of the correct length and format', () => { const mockReportData: ReportData = { header: { taxFileNumber: '123456782', taxYear: '2025', idNumber: '987654324', industryCode: '1234', businessType: 1, reportingMethod: 1, accountingMethod: 1, accountingSystem: 1, includesProfitLoss: 1, includesTaxAdjustment: 1, includesBalanceSheet: 1, profitLossEntryCount: 5, taxAdjustmentEntryCount: 4, balanceSheetEntryCount: 12, currencyType: 1, amountsInThousands: 1, }, profitAndLoss: [ { code: 1000, amount: 100_000 }, { code: 1040, amount: 100_000 }, { code: 1300, amount: 30_000 }, { code: 1371, amount: 30_000 }, { code: 6666, amount: 70_000 }, ], taxAdjustment: [ { code: 100, amount: 70_000 }, { code: 104, amount: 70_000 }, { code: 110, amount: 5000 }, { code: 120, amount: 3000 }, ], balanceSheet: [ { code: 7000, amount: 10_000 }, { code: 7700, amount: 6000 }, { code: 7711, amount: 6000 }, { code: 7100, amount: 4000 }, { code: 7150, amount: 4000 }, { code: 8888, amount: 10_000 }, { code: 9000, amount: 10_000 }, { code: 9100, amount: 5000 }, { code: 9140, amount: 5000 }, { code: 9360, amount: 5000 }, { code: 9400, amount: 5000 }, { code: 9999, amount: 10_000 }, ], individualOrCompany: IndividualOrCompanyEnum.COMPANY, }; const result = generateReport(mockReportData); // Validate the length of the generated report expect(result.length).toBe(8612); // Validate specific sections of the report expect(result.startsWith('1234567822025987654324')).toBe(true); // Header section expect( result.includes( '010000000000100000010400000000100000013000000000030000013710000000030000066660000000070000000000000000000000', ), ).toBe(true); // Profit and Loss section expect(result.includes('001100000000005000001200000000003000000000000000000000')).toBe(true); // Tax Adjustment section expect( result.includes( '070000000000010000077000000000006000077110000000006000071000000000004000071500000000004000088880000000010000090000000000010000091000000000005000091400000000005000093600000000005000094000000000005000099990000000010000000000000000000000', ), ).toBe(true); // Balance Sheet section }); it('should throw an error for invalid report data', () => { const invalidReportData = { header: { taxFileNumber: '123', // Invalid length taxYear: '20', // Invalid length idNumber: '987654324', industryCode: '1234', businessType: 1, reportingMethod: 1, accountingMethod: 1, accountingSystem: 1, includesProfitLoss: 1, includesTaxAdjustment: 1, includesBalanceSheet: 1, profitLossEntryCount: 2, taxAdjustmentEntryCount: 2, balanceSheetEntryCount: 2, }, profitAndLoss: [{ code: 1000, amount: 12_345 }], taxAdjustment: [{ code: 100, amount: 56_789 }], balanceSheet: [ { code: 3001, amount: 34_567 }, { code: 3002, amount: 12_345 }, ], individualOrCompany: IndividualOrCompanyEnum.INDIVIDUAL, // Corrected enum value } as ReportData; try { generateReport(invalidReportData); // If we reach here, validation didn't throw as expected assert.fail('Expected ValidationError to be thrown'); } catch (error) { expect(error).toBeInstanceOf(ValidationError); // Validate specific validation errors expect((error as ValidationError).errors).toContainEqual( expect.objectContaining({ path: expect.stringContaining('header.taxFileNumber'), }), ); expect((error as ValidationError).errors).toContainEqual( expect.objectContaining({ path: expect.stringContaining('header.taxYear'), }), ); } }); });