Files
GerbilManager/gerbil-manager-web/e2e/becken-kontakte.spec.ts

104 lines
5.0 KiB
TypeScript

/** QA-1: Becken + Kontakte (FEAT-2) — CRUD, Belegung, 409-Konfliktpfad. */
import { acceptNextDialog, de, expect, gotoSection, skipUnlessMock, test, uniqueName } from './fixtures'
const tb = de.pages.becken
const tk = de.pages.kontakte
test.describe('Becken', () => {
test('Belegung: Detail zeigt Bewohner mit Link zur Tierakte', async ({ page }) => {
skipUnlessMock()
await page.goto('/becken')
await page.getByRole('link', { name: /Großbecken/ }).click()
await expect(page.getByRole('heading', { name: 'Großbecken' })).toBeVisible()
await expect(page.getByText(`2 ${tb.occupancy.countMany}`)).toBeVisible()
await expect(page.getByText(tb.occupancy.title)).toBeVisible()
await page.getByRole('link', { name: /Krümel/ }).click()
await expect(page.getByText(de.pages.gerbils.detail.masterData)).toBeVisible()
})
test('Löschen eines belegten Beckens meldet den 409-Konflikt auf Deutsch', async ({ page }) => {
skipUnlessMock()
await page.goto('/becken')
await page.getByRole('link', { name: /Großbecken/ }).click()
acceptNextDialog(page)
await page.getByRole('button', { name: tb.delete.action }).click()
await expect(page.getByText(tb.delete.conflict)).toBeVisible()
})
test('Becken anlegen, bearbeiten und (leer) löschen', async ({ page }) => {
await gotoSection(page, de.nav.enclosures)
await page.getByRole('link', { name: tb.newButton }).click()
// Pflichtfeld-Validierung
await page.getByRole('button', { name: tb.form.save, exact: true }).click()
await expect(page.getByText(tb.validation.nameRequired)).toBeVisible()
const name = uniqueName('Becken')
await page.getByLabel(`${tb.fields.name} *`).fill(name)
await page.getByLabel(tb.fields.notes).fill('Übergangsbecken')
await page.getByRole('button', { name: tb.form.save, exact: true }).click()
await expect(page.getByRole('heading', { name })).toBeVisible()
await expect(page.getByText(tb.occupancy.empty)).toBeVisible()
// Leeres Becken löschen -> zurück zur Liste
acceptNextDialog(page)
await page.getByRole('button', { name: tb.delete.action }).click()
await expect(page.getByRole('heading', { name: tb.title, exact: true })).toBeVisible()
await expect(page.getByRole('link', { name })).toBeHidden()
})
})
test.describe('Kontakte', () => {
test('Detail zeigt verknüpfte Tiere mit Rollen-Beschriftung', async ({ page }) => {
skipUnlessMock()
await page.goto('/kontakte')
await page.getByRole('link', { name: /Zoohandlung Meier/ }).click()
await expect(page.getByRole('heading', { name: 'Zoohandlung Meier' })).toBeVisible()
await expect(page.getByText(tk.linked.title)).toBeVisible()
// "Herkunft von Krümel"
await expect(page.getByText(`${tk.linked.originRole} Krümel`)).toBeVisible()
})
test('Löschen eines referenzierten Kontakts meldet den 409-Konflikt auf Deutsch', async ({ page }) => {
skipUnlessMock()
await page.goto('/kontakte')
await page.getByRole('link', { name: /Familie Huber/ }).click()
// Pauli (abgegeben) referenziert Familie Huber als Abnehmer
await expect(page.getByText(`${tk.linked.receiverRole} Pauli`)).toBeVisible()
acceptNextDialog(page)
await page.getByRole('button', { name: tk.delete.action }).click()
await expect(page.getByText(tk.delete.conflict)).toBeVisible()
})
test('Kontakt anlegen und (unverknüpft) wieder löschen', async ({ page }) => {
await gotoSection(page, de.nav.contacts)
await page.getByRole('link', { name: tk.newButton }).click()
const name = uniqueName('Kontakt')
await page.getByLabel(`${tk.fields.name} *`).fill(name)
// FEAT-13: strukturierte Felder statt Freitext-Kontaktdaten
await page.getByLabel(tk.fields.email).fill('test@example.de')
await page.getByLabel(tk.fields.phone).fill('0151 9876543')
await page.getByRole('button', { name: tk.form.save, exact: true }).click()
await expect(page.getByRole('heading', { name })).toBeVisible()
await expect(page.getByText(tk.linked.empty)).toBeVisible()
// die gespeicherten Felder erscheinen auf der Detailseite
await expect(page.getByText('test@example.de')).toBeVisible()
await expect(page.getByText('0151 9876543')).toBeVisible()
acceptNextDialog(page)
await page.getByRole('button', { name: tk.delete.action }).click()
await expect(page.getByRole('heading', { name: tk.title, exact: true })).toBeVisible()
})
// FEAT-13: Abdeckung der neuen strukturierten Kontaktfelder
test('Detail zeigt E-Mail, Telefon und Adresse mit deutschen Beschriftungen', async ({ page }) => {
skipUnlessMock()
await page.goto('/kontakte')
await page.getByRole('link', { name: /Zoohandlung Meier/ }).click()
await expect(page.getByText(tk.fields.email, { exact: true })).toBeVisible()
await expect(page.getByText('meier@example.de')).toBeVisible()
await expect(page.getByText(tk.fields.address, { exact: true })).toBeVisible()
await expect(page.getByText('Hauptstraße 1, 12345 Musterstadt')).toBeVisible()
})
})