diff --git a/frontend/src/lib/person/genealogy/StammbaumTree.svelte.test.ts b/frontend/src/lib/person/genealogy/StammbaumTree.svelte.test.ts index 073e7acb..7b1bc107 100644 --- a/frontend/src/lib/person/genealogy/StammbaumTree.svelte.test.ts +++ b/frontend/src/lib/person/genealogy/StammbaumTree.svelte.test.ts @@ -54,10 +54,12 @@ describe('StammbaumTree viewBox', () => { expect(w).toBe(1200); expect(h).toBe(800); - // …but the origin is shifted by the pan offset. - const unpannedX = -(1200 / 2 - 160 / 2); // single 160-wide node centred - expect(x).toBeCloseTo(unpannedX + 100, 6); - expect(y).toBeCloseTo(-(800 / 2 - 56 / 2) + 40, 6); + // …but the viewBox centre is the content centroid shifted by the pan + // offset (at pan {0,0} the centre sits on the centroid — see the test + // below). This avoids hard-coding the layout's absolute coordinates. + const c = rectsCentroid(svg); + expect(x + w / 2 - c.x).toBeCloseTo(100, 6); + expect(y + h / 2 - c.y).toBeCloseTo(40, 6); }); it('uses the minimum size and centers a single node', async () => { diff --git a/frontend/src/routes/stammbaum/page.svelte.test.ts b/frontend/src/routes/stammbaum/page.svelte.test.ts index 839f66c9..b9f58e20 100644 --- a/frontend/src/routes/stammbaum/page.svelte.test.ts +++ b/frontend/src/routes/stammbaum/page.svelte.test.ts @@ -17,7 +17,11 @@ vi.mock('$app/state', () => ({ const replaceState = vi.fn(); vi.mock('$app/navigation', () => ({ - replaceState: (...args: unknown[]) => replaceState(...args) + replaceState: (...args: unknown[]) => replaceState(...args), + // StammbaumSidePanel (rendered transitively) imports invalidateAll/goto, so + // the mock must provide every export the module graph uses. + invalidateAll: vi.fn(), + goto: vi.fn() })); afterEach(cleanup);