@x47base/ch-finance-engine
Version:
This package is an finance and accounting engine specificly made based on the swiss system.
99 lines (75 loc) • 4.05 kB
JavaScript
import React from 'react';
import { render, fireEvent, screen } from '@testing-library/react';
import '@testing-library/jest-dom';
import Buchung from '../src/ui/buchung';
import Engine from '../src/models/engine';
jest.mock('../src/models/engine');
describe('Buchung Component', () => {
let engine;
let task;
let correctSolution;
beforeEach(() => {
engine = new Engine();
engine.accounts = [
{ code: 1000, name: 'Warenaufwand', aliases: [] },
{ code: 2000, name: 'Verbindlichkeiten L+L', aliases: [] },
{ code: 3000, name: 'Vorsteuer 1170', aliases: [] },
];
Engine.mockImplementation(() => engine);
task = {
description: "Ein Lieferant stellt die Lieferung von verschiedenen Küchengeräten über CHF 3000 (inkl. 7,7 % Mehrwertsteuer) in Rechnung.",
account1: "Warenaufwand",
account2: "Verbindlichkeiten L+L",
amount: 3000,
currency: "CHF"
};
correctSolution = [
{ account1: "Warenaufwand", account2: "Verbindlichkeiten L+L", amount: 2785.71 },
{ account1: "Vorsteuer 1170", account2: "Verbindlichkeiten L+L", amount: 214.29 }
];
});
test('renders task description', () => {
render(<Buchung task={task} correctSolution={correctSolution} />);
expect(screen.getByText(task.description)).toBeInTheDocument();
});
test('adds and verifies correct buchungen', () => {
render(<Buchung task={task} correctSolution={correctSolution} />);
// Select account1
fireEvent.change(screen.getAllByPlaceholderText('Enter account name or alias')[0], { target: { value: 'Warenaufwand' } });
fireEvent.click(screen.getByText('Warenaufwand'));
// Select account2
fireEvent.change(screen.getAllByPlaceholderText('Enter account name or alias')[1], { target: { value: 'Verbindlichkeiten L+L' } });
fireEvent.click(screen.getByText('Verbindlichkeiten L+L'));
// Enter amount
fireEvent.change(screen.getByPlaceholderText('Betrag'), { target: { value: '2785.71' } });
// Add buchung
fireEvent.click(screen.getByText('Buchung hinzufügen'));
// Select account1
fireEvent.change(screen.getAllByPlaceholderText('Enter account name or alias')[0], { target: { value: 'Vorsteuer 1170' } });
fireEvent.click(screen.getByText('Vorsteuer 1170'));
// Select account2
fireEvent.change(screen.getAllByPlaceholderText('Enter account name or alias')[1], { target: { value: 'Verbindlichkeiten L+L' } });
fireEvent.click(screen.getByText('Verbindlichkeiten L+L'));
// Enter amount
fireEvent.change(screen.getByPlaceholderText('Betrag'), { target: { value: '214.29' } });
// Add buchung
fireEvent.click(screen.getByText('Buchung hinzufügen'));
// Verify feedback
expect(screen.getByText('Alle Buchungen sind korrekt.')).toBeInTheDocument();
});
test('detects incorrect buchungen', () => {
render(<Buchung task={task} correctSolution={correctSolution} />);
// Select account1
fireEvent.change(screen.getAllByPlaceholderText('Enter account name or alias')[0], { target: { value: 'Warenaufwand' } });
fireEvent.click(screen.getByText('Warenaufwand'));
// Select account2
fireEvent.change(screen.getAllByPlaceholderText('Enter account name or alias')[1], { target: { value: 'Verbindlichkeiten L+L' } });
fireEvent.click(screen.getByText('Verbindlichkeiten L+L'));
// Enter amount
fireEvent.change(screen.getByPlaceholderText('Betrag'), { target: { value: '9999' } });
// Add buchung
fireEvent.click(screen.getByText('Buchung hinzufügen'));
// Verify feedback
expect(screen.getByText(/Fehler in Buchung 1/)).toBeInTheDocument();
});
});