diff --git a/gerbil-manager-web/e2e/tiere.spec.ts b/gerbil-manager-web/e2e/tiere.spec.ts
index d60d1a3..052b865 100644
--- a/gerbil-manager-web/e2e/tiere.spec.ts
+++ b/gerbil-manager-web/e2e/tiere.spec.ts
@@ -108,6 +108,25 @@ test('Detailseite: Wurf-Feld ist ein Link zur Wurf-Detailseite (WURF-LINK)', asy
await expect(page.getByRole('heading', { name: 'Wurf K' })).toBeVisible()
})
+test('Detailseite: Herkunft zeigt originBreeder als Text wenn kein Kontakt (WURF-LINK-Addendum)', async ({ page }) => {
+ skipUnlessMock()
+ // Fridolin hat originContactId=null + originBreeder='Zoohandlung Meier' → plain text, kein Link
+ await page.goto('/rennmaeuse/fridolin')
+ await expect(page.getByRole('heading', { name: 'Fridolin' })).toBeVisible()
+ await expect(page.getByText('Zoohandlung Meier')).toBeVisible()
+ // Kein Link mit diesem Namen — es ist reiner Text
+ await expect(page.getByRole('link', { name: 'Zoohandlung Meier' })).toBeHidden()
+})
+
+test('Detailseite: Herkunft zeigt Kontaktlink wenn originContactId gesetzt (WURF-LINK-Addendum)', async ({ page }) => {
+ skipUnlessMock()
+ // Krümel hat originContactId='con-meier' → Link /kontakte/con-meier (Priorität vor originBreeder)
+ await page.goto('/rennmaeuse/kruemel')
+ const originLink = page.getByRole('link', { name: 'Zoohandlung Meier' })
+ await expect(originLink).toBeVisible()
+ await expect(originLink).toHaveAttribute('href', '/kontakte/con-meier')
+})
+
test('Tier bearbeiten — Notizen ändern', async ({ page }) => {
skipUnlessMock()
await page.goto('/rennmaeuse/kruemel/bearbeiten')
diff --git a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx
index e002df0..ad3dd66 100644
--- a/gerbil-manager-web/src/pages/GerbilDetailPage.tsx
+++ b/gerbil-manager-web/src/pages/GerbilDetailPage.tsx
@@ -181,7 +181,14 @@ export default function GerbilDetailPage() {
: lookup(litterName, g.litterId)
}
/>
-
+ {contactName.get(g.originContactId)}
+ : (g.originBreeder || null)
+ }
+ />