Merge branch 'worktree-agent-a1dfa0392b5ace900'
# Conflicts: # gerbil-manager-web/e2e/mock-data.ts # gerbil-manager-web/src/App.tsx
This commit is contained in:
@@ -508,6 +508,15 @@ export async function installMockApi(page: Page): Promise<MockDb> {
|
||||
return json(route, 405)
|
||||
}
|
||||
|
||||
// RPRO3: RennmausPro-III-Backup-Import (multipart-Upload). Mock liefert eine feste
|
||||
// Auswertung bzw. ein Import-Ergebnis — keine echte Datei-Verarbeitung.
|
||||
if (path === '/import/rpro3/analyze' && method === 'POST') {
|
||||
return json(route, 200, db.rpro3.analyze)
|
||||
}
|
||||
if (path === '/import/rpro3/execute' && method === 'POST') {
|
||||
return json(route, 200, db.rpro3.execute)
|
||||
}
|
||||
|
||||
// Generische Kollektionen: /<resource> und /<resource>/<id>
|
||||
m = path.match(/^\/([a-z-]+)(?:\/([^/]+))?$/)
|
||||
const col = m ? collections[m[1]] : undefined
|
||||
|
||||
@@ -80,6 +80,11 @@ export interface MockDb {
|
||||
namesConfigured: boolean
|
||||
// FEEDBACK: "Fehler melden" — gesammelte Berichte (POST /feedback)
|
||||
feedback: Record<string, unknown>[]
|
||||
// RPRO3: RennmausPro-III-Import — feste Auswertung + Import-Ergebnis für die UI-Specs.
|
||||
rpro3: {
|
||||
analyze: Record<string, unknown>
|
||||
execute: Record<string, unknown>
|
||||
}
|
||||
}
|
||||
|
||||
function gerbil(
|
||||
@@ -467,5 +472,54 @@ export function seedDb(): MockDb {
|
||||
thread: [],
|
||||
},
|
||||
],
|
||||
rpro3: {
|
||||
analyze: {
|
||||
counts: {
|
||||
ownAnimals: 303,
|
||||
externalRaw: 7427,
|
||||
externalAfterDedup: 3391,
|
||||
litters: 127,
|
||||
contacts: 750,
|
||||
genotypes: 7732,
|
||||
duplicatesMerged: 4036,
|
||||
mergeClusters: 782,
|
||||
},
|
||||
newVsCurrentNew: 280,
|
||||
newVsCurrentExisting: 23,
|
||||
topMerges: [
|
||||
{ name: 'Alice', recordCount: 30, dob: '2010-07-19', farbe: 'Schimmel', origin: 'Clan of Kleine Füchse' },
|
||||
{ name: 'BlackEye', recordCount: 28, dob: '', farbe: 'Silberschimmel', origin: 'Clan of Desert' },
|
||||
],
|
||||
ambiguousNames: [
|
||||
{
|
||||
name: 'Merlin',
|
||||
bareCount: 0,
|
||||
variants: [
|
||||
{ count: 4, dob: '2007-08-22', farbe: 'Blaufuchs', origin: 'Clan of the Yankees', isOwn: false },
|
||||
{ count: 3, dob: '—', farbe: 'Platin-Schecke', origin: '—', isOwn: false },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Bella',
|
||||
bareCount: 0,
|
||||
variants: [
|
||||
{ count: 2, dob: '2012-06-21', farbe: 'Blaufuchs', origin: 'Clan of Sunset Glow', isOwn: false },
|
||||
{ count: 1, dob: '2013-03-20', farbe: 'Algierfuchs, hell', origin: 'eigene Zucht', isOwn: true },
|
||||
],
|
||||
},
|
||||
],
|
||||
photosProvided: false,
|
||||
photoFilesAvailable: 0,
|
||||
},
|
||||
execute: {
|
||||
gerbilsImported: 3694,
|
||||
littersImported: 1678,
|
||||
contactsImported: 508,
|
||||
healthRecordsImported: 39,
|
||||
weightRecordsImported: 229,
|
||||
photosImported: 0,
|
||||
message: 'Import erfolgreich: 3694 Tiere, 1678 Würfe, 508 Kontakte.',
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
49
gerbil-manager-web/e2e/rennmauspro-import.spec.ts
Normal file
49
gerbil-manager-web/e2e/rennmauspro-import.spec.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
/** RPRO3: RennmausPro-III-Import-Rubrik unter „Hilfe" — Auswerten → Import durchführen. */
|
||||
import { de, expect, skipUnlessMock, test } from './fixtures'
|
||||
|
||||
const t = de.pages.rpro3Import
|
||||
const h = de.hilfe
|
||||
|
||||
test('Hilfe verlinkt auf den RennmausPro-Import', async ({ page }) => {
|
||||
skipUnlessMock()
|
||||
await page.goto('/hilfe')
|
||||
// Den Abschnitt aufklappen und dem Link folgen.
|
||||
await page.getByText(h.sections.rpro3Import).click()
|
||||
await page.getByRole('link', { name: new RegExp(h.rpro3Link.button) }).click()
|
||||
await expect(page).toHaveURL(/\/hilfe\/rennmauspro-import$/)
|
||||
await expect(page.getByRole('heading', { name: t.title })).toBeVisible()
|
||||
})
|
||||
|
||||
test('Auswerten zeigt die Übersicht, danach importiert "Import durchführen"', async ({ page }) => {
|
||||
skipUnlessMock()
|
||||
await page.goto('/hilfe/rennmauspro-import')
|
||||
|
||||
// Auswerten ohne Datei ist deaktiviert.
|
||||
const analyzeBtn = page.getByRole('button', { name: t.analyzeButton })
|
||||
await expect(analyzeBtn).toBeDisabled()
|
||||
|
||||
// Eine (Pseudo-).backup-Datei auswählen.
|
||||
await page.getByLabel(t.backupLabel).setInputFiles({
|
||||
name: 'RennmausPro.backup',
|
||||
mimeType: 'application/octet-stream',
|
||||
buffer: Buffer.from('PK fake-zip'),
|
||||
})
|
||||
await expect(analyzeBtn).toBeEnabled()
|
||||
await analyzeBtn.click()
|
||||
|
||||
// Auswertung erscheint (Zählungen + Abgleich).
|
||||
await expect(page.getByRole('heading', { name: t.step2Title })).toBeVisible()
|
||||
await expect(page.getByText(t.counts.ownAnimals)).toBeVisible()
|
||||
await expect(page.getByText('303')).toBeVisible()
|
||||
await expect(page.getByText(t.newCount(280))).toBeVisible()
|
||||
|
||||
// Mehrdeutige Namen sind aufklappbar.
|
||||
await page.getByText(t.ambiguousTitle).click()
|
||||
await expect(page.getByText('Merlin')).toBeVisible()
|
||||
|
||||
// Import durchführen.
|
||||
await page.getByRole('button', { name: t.executeButton }).click()
|
||||
await expect(page.getByRole('heading', { name: t.successTitle })).toBeVisible()
|
||||
await expect(page.getByText('3694')).toBeVisible()
|
||||
await expect(page.getByText(t.resultCounts.gerbils)).toBeVisible()
|
||||
})
|
||||
Reference in New Issue
Block a user