@accounter/shaam6111-generator
Version:
Fully typed application that generates, parses, and validates SHAAM 6111 tax reports.
136 lines (124 loc) • 5.02 kB
text/typescript
import { describe, expect, it } from 'vitest';
import { headerSchema } from '../src/schemas/index.js';
// Valid HeaderRecord example
const validHeaderRecord = {
taxFileNumber: '123456782',
taxYear: '2025',
idNumber: '987654324',
industryCode: '1234',
businessType: 1, // INDUSTRIAL
reportingMethod: 1, // CASH
accountingMethod: 1, // SINGLE_ENTRY
accountingSystem: 1, // MANUAL
includesProfitLoss: 1, // YES
includesTaxAdjustment: 1, // YES
includesBalanceSheet: 1, // YES
profitLossEntryCount: 10,
currencyType: 1, // SHEKELS
amountsInThousands: 1, // YES
};
describe('headerSchema', () => {
it('should validate a valid HeaderRecord', () => {
const result = headerSchema.safeParse(validHeaderRecord);
expect(result.success).toBe(true);
});
it('should fail validation for an invalid taxFileNumber', () => {
const invalidRecord = { ...validHeaderRecord, taxFileNumber: '123' };
const result = headerSchema.safeParse(invalidRecord);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toBe('Tax file number must include at least 5 digits');
}
});
it('should fail validation for a missing required field', () => {
const { taxYear: _unused, ...invalidRecord } = validHeaderRecord;
const result = headerSchema.safeParse(invalidRecord);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toBe(
'Invalid input: expected string, received undefined',
);
}
});
it('should fail validation for an invalid enum value', () => {
const invalidRecord = { ...validHeaderRecord, businessType: 55 };
const result = headerSchema.safeParse(invalidRecord);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toContain('Invalid option: expected one of ');
}
});
it('should fail validation for an invalid idNumber', () => {
const invalidRecord = { ...validHeaderRecord, idNumber: '123456789' };
const result = headerSchema.safeParse(invalidRecord);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toBe('Invalid ID number');
}
});
it('should validate optional fields when provided', () => {
const recordWithOptionalFields = {
...validHeaderRecord,
vatFileNumber: '123456782',
withholdingTaxFileNumber: '987654324',
businessDescription: 'Industrial business',
ifrsImplementationYear: '2025',
ifrsReportingOption: 1, // OPTION_1
softwareRegistrationNumber: '12345678',
partnershipCount: 2,
partnershipProfitShare: 50,
auditOpinionType: 1, // UNQUALIFIED
};
const result = headerSchema.safeParse(recordWithOptionalFields);
expect(result.success).toBe(true);
if (result.success) {
const data = result.data;
expect(data.vatFileNumber).toBe('123456782');
expect(data.withholdingTaxFileNumber).toBe('987654324');
expect(data.businessDescription).toBe('Industrial business');
expect(data.ifrsImplementationYear).toBe('2025');
expect(data.ifrsReportingOption).toBe(1);
expect(data.softwareRegistrationNumber).toBe('12345678');
expect(data.partnershipCount).toBe(2);
expect(data.partnershipProfitShare).toBe(50);
expect(data.auditOpinionType).toBe(1);
}
});
it('should fail validation for an invalid partnershipCount', () => {
const invalidRecord = { ...validHeaderRecord, partnershipCount: -1 };
const result = headerSchema.safeParse(invalidRecord);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toBe('Partnership count cannot be negative');
}
});
it('should fail validation for an invalid tax year', () => {
const invalidRecord = { ...validHeaderRecord, taxYear: '20X5' };
const result = headerSchema.safeParse(invalidRecord);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toBe('Tax year must contain only digits');
}
});
it('should fail validation for an industry code not exactly 4 digits', () => {
const invalidRecord = { ...validHeaderRecord, industryCode: '123' };
const result = headerSchema.safeParse(invalidRecord);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toBe('Industry code must be exactly 4 digits');
}
});
it('should fail validation for a business description exceeding 50 characters', () => {
const invalidRecord = {
...validHeaderRecord,
businessDescription: 'A'.repeat(51),
};
const result = headerSchema.safeParse(invalidRecord);
expect(result.success).toBe(false);
if (!result.success) {
expect(result.error.issues[0].message).toBe(
'Business description cannot exceed 50 characters',
);
}
});
});