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:
55
gerbil-manager-web/e2e/stammbaum.spec.ts
Normal file
55
gerbil-manager-web/e2e/stammbaum.spec.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
/** QA-1: Stammbaum (FEAT-4) — interaktiver Viewer, Re-Root, Druckansicht. */
|
||||
import { de, expect, skipUnlessMock, test } from './fixtures'
|
||||
|
||||
const t = de.pages.stammbaum
|
||||
|
||||
test('Viewer rendert die Ahnen-Karten und re-rootet per Tipp aufs Elterntier', async ({ page }) => {
|
||||
skipUnlessMock()
|
||||
await page.goto('/rennmaeuse/kruemel/stammbaum')
|
||||
await expect(page.locator('.pedigree-card').first()).toBeVisible()
|
||||
await expect(page.getByRole('heading', { name: t.titleFor('Krümel') })).toBeVisible()
|
||||
|
||||
// Erst die Ansicht einpassen, damit alle Karten im SVG-Viewport liegen
|
||||
// (sonst tippt der Klick auf dem Laptop ins Leere).
|
||||
const fit = page.getByRole('button', { name: t.zoomFit })
|
||||
if (await fit.isVisible()) await fit.click()
|
||||
|
||||
// Tipp auf den Vater -> Stammbaum wurzelt neu auf Fridolin.
|
||||
// (force: die d3-Baum-Animation bewegt die Karten noch eine Weile —
|
||||
// Playwrights Stabilitäts-Check würde sonst dauerhaft warten.)
|
||||
await page.waitForTimeout(900)
|
||||
await page
|
||||
.locator('.pedigree-card:not(.pedigree-card--root):not(.pedigree-card--unknown)')
|
||||
.filter({ hasText: 'Fridolin' })
|
||||
.first()
|
||||
.click({ force: true })
|
||||
await page.waitForURL('**/rennmaeuse/fridolin/stammbaum')
|
||||
await expect(page.getByRole('heading', { name: t.titleFor('Fridolin') })).toBeVisible()
|
||||
})
|
||||
|
||||
test('Inzuchtkoeffizient wird angezeigt', async ({ page }) => {
|
||||
skipUnlessMock()
|
||||
await page.goto('/rennmaeuse/kruemel/stammbaum')
|
||||
const inzucht = page.locator('.stammbaum-inzucht')
|
||||
await expect(inzucht).toBeVisible()
|
||||
await expect(inzucht).toContainText(t.inbreeding.label)
|
||||
// 0.0625 -> de-DE mit max. 1 Nachkommastelle -> "6,3 %"
|
||||
await expect(inzucht).toContainText('6,3')
|
||||
})
|
||||
|
||||
test('Druckansicht (Ahnentafel) erscheint im Print-Medium', async ({ page }) => {
|
||||
skipUnlessMock()
|
||||
await page.goto('/rennmaeuse/kruemel/stammbaum')
|
||||
await expect(page.locator('.pedigree-card').first()).toBeVisible()
|
||||
|
||||
await page.emulateMedia({ media: 'print' })
|
||||
// Spaltenüberschriften der Ahnentafel + Erstellt-am-Zeile
|
||||
await expect(page.getByText(t.printView.generations[1], { exact: true })).toBeVisible()
|
||||
await expect(page.getByText(new RegExp(t.printView.createdOn))).toBeVisible()
|
||||
await page.emulateMedia({ media: 'screen' })
|
||||
})
|
||||
|
||||
test('unbekanntes Tier zeigt den deutschen Nicht-gefunden-Zustand', async ({ page }) => {
|
||||
await page.goto('/rennmaeuse/gibt-es-nicht/stammbaum')
|
||||
await expect(page.getByText(t.notFound).or(page.getByText(de.api.errors.notFound))).toBeVisible()
|
||||
})
|
||||
Reference in New Issue
Block a user