@accounter/shaam6111-generator
Version:
Fully typed application that generates, parses, and validates SHAAM 6111 tax reports.
102 lines (94 loc) • 3.66 kB
text/typescript
import { describe, expect, it } from 'vitest';
import { profitLossArraySchema } from '../src/schemas/profit-and-loss.js';
// Valid profit and loss records example
const validProfitLossRecords = [
{ code: 1052, amount: 5000 },
{ code: 1000, amount: 5000 },
{ code: 1300, amount: 3000 },
{ code: 1350, amount: 1000 },
{ code: 1390, amount: 2000 },
{ code: 2000, amount: 2000 },
{ code: 2011, amount: 500 },
{ code: 2012, amount: 1500 },
{ code: 2500, amount: 1000 },
{ code: 2510, amount: 1000 },
{ code: 3000, amount: 1500 },
{ code: 3020, amount: 1000 },
{ code: 3025, amount: 500 },
{ code: 3530, amount: 2500 },
{ code: 3500, amount: 2500 },
{ code: 5000, amount: 1000 },
{ code: 5030, amount: 200 },
{ code: 5040, amount: 400 },
{ code: 5050, amount: 400 },
{ code: 5122, amount: 500 },
{ code: 5100, amount: 500 },
{ code: 5200, amount: 700 },
{ code: 5210, amount: 100 },
{ code: 5220, amount: 100 },
{ code: 5230, amount: 100 },
{ code: 5236, amount: 100 },
{ code: 5237, amount: 100 },
{ code: 5240, amount: 100 },
{ code: 5250, amount: 100 },
{ code: 5300, amount: 300 },
{ code: 5390, amount: 300 },
{ code: 6666, amount: -3100 },
];
describe('profitLossArraySchema', () => {
it('should validate valid profit and loss records', () => {
const result = profitLossArraySchema.safeParse(validProfitLossRecords);
expect(result.success).toBe(true);
});
it('should fail validation for an invalid code', () => {
const invalidRecords = [...validProfitLossRecords, { code: 9999, amount: 1000 }];
const result = profitLossArraySchema.safeParse(invalidRecords);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toBe('Invalid profit and loss code');
}
});
it('should fail validation for duplicate codes', () => {
const duplicateRecords = [...validProfitLossRecords, { code: 1000, amount: 2000 }];
const result = profitLossArraySchema.safeParse(duplicateRecords);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toContain('Duplicate code');
}
});
it('should fail validation for negative amounts on non-negative codes', () => {
const invalidRecords = validProfitLossRecords.map(record =>
[1000, 1052].includes(record.code) ? { code: record.code, amount: -500 } : record,
);
const result = profitLossArraySchema.safeParse(invalidRecords);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toContain('does not allow negative amounts');
}
});
it('should validate records with optional fields and correct summary calculations', () => {
const validRecordsWithSummary = [
{ code: 1000, amount: 5000 },
{ code: 1010, amount: 5000 },
{ code: 1300, amount: 3000 },
{ code: 1306, amount: 3000 },
{ code: 6666, amount: 2000 },
];
const result = profitLossArraySchema.safeParse(validRecordsWithSummary);
expect(result.success).toBe(true);
});
it('should fail validation for incorrect summary calculations', () => {
const invalidSummaryRecords = [
{ code: 1000, amount: 5000 },
{ code: 1010, amount: 5000 },
{ code: 1300, amount: 3000 },
{ code: 1306, amount: 3000 },
{ code: 6666, amount: 1000 }, // Incorrect summary
];
const result = profitLossArraySchema.safeParse(invalidSummaryRecords);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toContain('should equal the sum');
}
});
});