Finanzmanager/tests/e2e/specs/depotbuchung.spec.js
fds2610-bot 9d771df028 Fix #129: Stück, Kurs und Betrag in der Depotbuchung automatisch berechnen
In „Depotbuchung erfassen“ ergibt sich bei Kauf und Verkauf aus zwei der drei
Felder Betrag, Stück und Kurs das dritte (Betrag = Stück × Kurs). Der
ausgerechnete Wert ist hervorgehoben und zieht nach, wenn sich die anderen
Felder ändern. Serverseitig rechnet Depotbuchung::dritterWert() dieselbe
Regel für den Weg ohne JavaScript.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:41:29 +02:00

79 lines
2.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// @ts-check
const { test, expect } = require('@playwright/test')
/*
* Fix #129: In „Depotbuchung erfassen“ hängen bei Kauf und Verkauf Stück, Kurs
* und Betrag zusammen – Betrag = Stück × Kurs. Sobald zwei Felder eingetragen
* sind, rechnet die Maske das dritte aus.
*/
const BENUTZER = process.env.E2E_USER || 'e2e'
const PASSWORT = process.env.E2E_PASSWORD || 'e2e-testpasswort'
async function anmelden(page) {
await page.goto('/login')
if (page.url().includes('/einrichtung')) {
throw new Error(
'Instanz ist noch nicht eingerichtet: ' +
'docker compose exec -u www-data php php scripts/e2e-benutzer.php'
)
}
await page.fill('#benutzername', BENUTZER)
await page.fill('#passwort', PASSWORT)
await page.click('button[type="submit"]')
await expect(page).toHaveURL(/\/$/)
}
test.describe('Depotbuchung erfassen: Stück, Kurs und Betrag', () => {
test.beforeEach(async ({ page }) => {
await anmelden(page)
await page.goto('/wertpapiere/buchungen/neu')
})
test('Aus Stück und Kurs ergibt sich der Betrag', async ({ page }) => {
await page.selectOption('#vorgang', 'kauf')
await page.fill('#stueck', '12')
await page.fill('#kurs', '45,67')
await expect(page.locator('#betrag')).toHaveValue('548,04')
await expect(page.locator('#betrag')).toHaveClass(/berechnet/)
// Der ausgerechnete Betrag zieht nach, wenn sich ein Feld ändert.
await page.fill('#stueck', '10')
await expect(page.locator('#betrag')).toHaveValue('456,70')
// Wird ein Feld geleert, steht hinter dem Betrag nichts mehr.
await page.fill('#kurs', '')
await expect(page.locator('#betrag')).toHaveValue('')
})
test('Aus Betrag und Stück ergibt sich der Kurs', async ({ page }) => {
await page.selectOption('#vorgang', 'verkauf')
await page.fill('#betrag', '1.000,00')
await page.fill('#stueck', '8')
await expect(page.locator('#kurs')).toHaveValue('125')
})
test('Aus Betrag und Kurs ergibt sich die Stückzahl', async ({ page }) => {
await page.selectOption('#vorgang', 'kauf')
await page.fill('#kurs', '3')
await page.fill('#betrag', '100')
await expect(page.locator('#stueck')).toHaveValue('33,333333')
// Selbst eingetragen gilt der Wert als fest und wird nicht mehr überschrieben.
await page.fill('#stueck', '30')
await page.fill('#kurs', '4')
await expect(page.locator('#stueck')).toHaveValue('30')
await expect(page.locator('#betrag')).toHaveValue('100')
})
test('Bei einer Dividende wird nichts gerechnet', async ({ page }) => {
await page.selectOption('#vorgang', 'dividende')
await page.fill('#stueck', '12')
await page.fill('#kurs', '2')
await expect(page.locator('#betrag')).toHaveValue('')
// Wechselt der Vorgang auf Kauf, rechnet die Maske nach.
await page.selectOption('#vorgang', 'kauf')
await expect(page.locator('#betrag')).toHaveValue('24,00')
})
})