Files
skr/test/test.skr03.ts
Juergen Kunz 08d7803be2
Some checks failed
Default (tags) / security (push) Successful in 43s
Default (tags) / test (push) Failing after 4m4s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped
feat(validation): add SKR standard validation for account compliance
2025-08-11 11:06:49 +00:00

166 lines
5.2 KiB
TypeScript

import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as skr from '../ts/index.js';
import { getTestConfig } from './helpers/setup.js';
let api: skr.SkrApi;
let testConfig: Awaited<ReturnType<typeof getTestConfig>>;
tap.test('should initialize SKR03 API', async () => {
testConfig = await getTestConfig();
// Use timestamp to ensure unique database for each test run
const timestamp = Date.now();
api = new skr.SkrApi({
mongoDbUrl: testConfig.mongoDbUrl,
dbName: `${testConfig.mongoDbName}_skr03_${timestamp}`,
});
await api.initialize('SKR03');
expect(api.getSKRType()).toEqual('SKR03');
});
tap.test('should have SKR03 accounts initialized', async () => {
const accounts = await api.listAccounts();
expect(accounts.length).toBeGreaterThan(50);
// Check specific SKR03 accounts exist
const kasse = await api.getAccount('1000');
expect(kasse).not.toBeNull();
expect(kasse.accountName).toEqual('Kasse');
expect(kasse.accountType).toEqual('asset');
const umsatz = await api.getAccount('4000');
expect(umsatz).not.toBeNull();
expect(umsatz.accountName).toEqual('Umsatzerlöse');
expect(umsatz.accountType).toEqual('revenue');
});
tap.test('should verify SKR03 process structure principle', async () => {
// SKR03 organizes accounts by business process
// Class 4: Operating Income
// Class 5: Material Costs
// Class 6: Personnel Costs
// Class 7: Other Operating Expenses
const class4 = await api.getAccountsByClass(4);
expect(class4.length).toBeGreaterThan(0);
expect(class4[0].accountType).toEqual('revenue');
const class5 = await api.getAccountsByClass(5);
expect(class5.length).toBeGreaterThan(0);
expect(class5[0].accountType).toEqual('expense');
const class6 = await api.getAccountsByClass(6);
expect(class6.length).toBeGreaterThan(0);
expect(class6[0].accountType).toEqual('expense');
});
tap.test('should create custom SKR03 account', async () => {
const customAccount = await api.createAccount({
accountNumber: '4999',
accountName: 'Custom Revenue Account',
accountClass: 4,
accountType: 'revenue',
description: 'Test custom account',
});
expect(customAccount.accountNumber).toEqual('4999');
expect(customAccount.skrType).toEqual('SKR03');
expect(customAccount.isActive).toBeTrue();
});
tap.test('should post transaction in SKR03', async () => {
const transaction = await api.postTransaction({
date: new Date(),
debitAccount: '1200', // Bank
creditAccount: '4000', // Revenue
amount: 1000,
description: 'Test sale',
reference: 'INV-001',
skrType: 'SKR03',
});
expect(transaction.status).toEqual('posted');
expect(transaction.amount).toEqual(1000);
expect(transaction.skrType).toEqual('SKR03');
});
tap.test('should post journal entry in SKR03', async () => {
const journalEntry = await api.postJournalEntry({
date: new Date(),
description: 'Test journal entry',
reference: 'JE-001',
lines: [
{ accountNumber: '1000', debit: 500 }, // Cash
{ accountNumber: '1200', debit: 500 }, // Bank
{ accountNumber: '4000', credit: 1000 }, // Revenue
],
skrType: 'SKR03',
});
expect(journalEntry.status).toEqual('posted');
expect(journalEntry.isBalanced).toBeTrue();
expect(journalEntry.totalDebits).toEqual(1000);
expect(journalEntry.totalCredits).toEqual(1000);
});
tap.test('should generate trial balance for SKR03', async () => {
const trialBalance = await api.generateTrialBalance();
expect(trialBalance.skrType).toEqual('SKR03');
expect(trialBalance.entries.length).toBeGreaterThan(0);
expect(trialBalance.isBalanced).toBeTrue();
expect(trialBalance.totalDebits).toEqual(trialBalance.totalCredits);
});
tap.test('should generate income statement for SKR03', async () => {
const incomeStatement = await api.generateIncomeStatement();
expect(incomeStatement.skrType).toEqual('SKR03');
expect(incomeStatement.revenue.length).toBeGreaterThanOrEqual(0);
expect(incomeStatement.expenses.length).toBeGreaterThanOrEqual(0);
expect(incomeStatement.netIncome).toEqual(
incomeStatement.totalRevenue - incomeStatement.totalExpenses,
);
});
tap.test('should generate balance sheet for SKR03', async () => {
const balanceSheet = await api.generateBalanceSheet();
expect(balanceSheet.skrType).toEqual('SKR03');
expect(balanceSheet.assets.totalAssets).toBeGreaterThanOrEqual(0);
expect(balanceSheet.isBalanced).toBeTrue();
});
tap.test('should search accounts in SKR03', async () => {
const results = await api.searchAccounts('Bank');
expect(results.length).toBeGreaterThan(0);
const bankAccount = results.find((a) => a.accountNumber === '1200');
expect(bankAccount).not.toBeNull();
});
tap.test('should export SKR03 accounts to CSV', async () => {
const csv = await api.exportAccountsToCSV();
expect(csv).toInclude('"Account";"Name";"Description";"Type";"Active"');
expect(csv).toInclude('1000');
expect(csv).toInclude('Kasse');
});
tap.test('should close API connection', async () => {
await api.close();
// Verify API requires reinitialization
let errorThrown = false;
try {
await api.listAccounts();
} catch (error) {
errorThrown = true;
expect(error.message).toInclude('not initialized');
}
expect(errorThrown).toBeTrue();
});
export default tap.start();