diff --git a/gerbil-manager-web/e2e/mock-api.ts b/gerbil-manager-web/e2e/mock-api.ts index 6219a76..9d22412 100644 --- a/gerbil-manager-web/e2e/mock-api.ts +++ b/gerbil-manager-web/e2e/mock-api.ts @@ -135,6 +135,19 @@ export async function installMockApi(page: Page): Promise { if (method === 'PUT') return json(route, 204) } + // SEARCH-2b: distinct Herkunft (originBreeder) values, sorted — vor der + // generischen /gerbils/:id-Route abfangen. + if (path === '/gerbils/breeders' && method === 'GET') { + const values = [ + ...new Set( + db.gerbils + .map((g) => g.originBreeder) + .filter((v): v is string => typeof v === 'string' && v.length > 0), + ), + ].sort() + return json(route, 200, values) + } + // Sonderrouten zuerst (FEAT-1b/FEAT-4-Verträge) let m = path.match(/^\/gerbils\/([^/]+)\/photos$/) if (m) { diff --git a/gerbil-manager-web/e2e/mock-data.ts b/gerbil-manager-web/e2e/mock-data.ts index 3a7ebb3..5b143f1 100644 --- a/gerbil-manager-web/e2e/mock-data.ts +++ b/gerbil-manager-web/e2e/mock-data.ts @@ -58,6 +58,9 @@ function gerbil( colorVarietyId, originContactId: null, receiverContactId: null, + originBreeder: null, + // SEARCH-2b: backend stores a normalized name (lowercase, [\s._-] stripped). + nameSearch: name.toLowerCase().replace(/[\s._-]/g, ''), genotype, notes: null, } @@ -70,8 +73,9 @@ export function seedDb(): MockDb { ...gerbil('kruemel', 'Krümel', 'female', '2025-03-12', 'w-kruemel', 'cv-agouti', 'Aa CC DD EE GG Pp spsp rere'), enclosureId: 'enc-gross', originContactId: 'con-meier', + originBreeder: 'Clan-Kleine-Chaoten', }, - { ...gerbil('fridolin', 'Fridolin', 'male', '2023-05-01', 'w-fridolin', 'cv-schwarz', 'aa CC DD EE GG PP spsp rere'), enclosureId: 'enc-gross' }, + { ...gerbil('fridolin', 'Fridolin', 'male', '2023-05-01', 'w-fridolin', 'cv-schwarz', 'aa CC DD EE GG PP spsp rere'), enclosureId: 'enc-gross', originBreeder: 'Zoohandlung Meier' }, gerbil('luna', 'Luna', 'female', '2023-08-15', 'w-luna', 'cv-gold', 'AA CC DD EE GG pp spsp rere'), gerbil('balu', 'Balu', 'male', '2021-04-20', 'w-balu', 'cv-agouti'), gerbil('maja', 'Maja', 'female', '2021-06-11', null, 'cv-schwarz-schecke', 'aa CC DD EE GG PP Spsp rere'), diff --git a/gerbil-manager-web/e2e/tiere.spec.ts b/gerbil-manager-web/e2e/tiere.spec.ts index ee7d4f0..10eb210 100644 --- a/gerbil-manager-web/e2e/tiere.spec.ts +++ b/gerbil-manager-web/e2e/tiere.spec.ts @@ -15,22 +15,33 @@ test('Liste lädt und die Namenssuche filtert', async ({ page }) => { await expect(page.getByRole('link', { name: /Fridolin/ })).toBeHidden() }) -test('Herkunft-Filter zeigt nur Tiere des gewählten Kontakts (SEARCH-2)', async ({ page }) => { +test('Herkunft-Filter (originBreeder) zeigt nur Tiere der gewählten Zucht (SEARCH-2b)', async ({ + page, +}) => { skipUnlessMock() await page.goto('/rennmaeuse') await expect(page.getByRole('link', { name: /Krümel/ })).toBeVisible() await expect(page.getByRole('link', { name: /Fridolin/ })).toBeVisible() - // Herkunft (originContactId) auf den Seed-Kontakt 'Zoohandlung Meier' (nur Krümel). + // Herkunft (originBreeder) auf die Seed-Zucht 'Clan-Kleine-Chaoten' (nur Krümel). await page .locator('label.field', { has: page.locator(`span:text-is("${t.fields.origin}")`) }) .locator('select') - .selectOption({ label: 'Zoohandlung Meier' }) + .selectOption({ label: 'Clan-Kleine-Chaoten' }) await expect(page.getByRole('link', { name: /Krümel/ })).toBeVisible() await expect(page.getByRole('link', { name: /Fridolin/ })).toBeHidden() }) +test('Namenssuche ist trennzeichen-unempfindlich (SEARCH-2b)', async ({ page }) => { + skipUnlessMock() + await page.goto('/rennmaeuse') + // 'Krü mel' (mit Leerzeichen) wird normalisiert zu 'krümel' -> matcht Krümel. + await page.getByPlaceholder(t.searchPlaceholder).first().fill('Krü mel') + await expect(page.getByRole('link', { name: /Krümel/ })).toBeVisible() + await expect(page.getByRole('link', { name: /Fridolin/ })).toBeHidden() +}) + test('Neue Rennmaus anlegen — Validierung + Erfolg', async ({ page }) => { await gotoSection(page, de.nav.gerbils) await page.getByRole('link', { name: t.newButton }).click()