QA-1: smoke specs - Navigation, Tiere CRUD+Tabs, Becken/Kontakte+409, Wuerfe+Jungtier, Probeverpaarung+SCHECKE-Warnung, Stammbaum re-root+print, Statistik (24 flows x 2 viewports, German assertions)
This commit is contained in:
87
gerbil-manager-web/e2e/becken-kontakte.spec.ts
Normal file
87
gerbil-manager-web/e2e/becken-kontakte.spec.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
/** 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)
|
||||
await page.getByLabel(tk.fields.contactInfo).fill('test@example.de')
|
||||
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()
|
||||
|
||||
acceptNextDialog(page)
|
||||
await page.getByRole('button', { name: tk.delete.action }).click()
|
||||
await expect(page.getByRole('heading', { name: tk.title, exact: true })).toBeVisible()
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user