From 0e9fa157e57605fdc21822d538a93fdf4912d567 Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 28 Apr 2026 17:33:31 +0200 Subject: [PATCH] =?UTF-8?q?fix(stammbaum):=20add=20=C3=97=20dismiss=20butt?= =?UTF-8?q?on=20with=20aria-label=20to=20StammbaumSidePanel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- .../lib/components/StammbaumSidePanel.svelte | 33 ++++++++++--- .../StammbaumSidePanel.svelte.spec.ts | 46 +++++++++++++++++++ 2 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 frontend/src/lib/components/StammbaumSidePanel.svelte.spec.ts diff --git a/frontend/src/lib/components/StammbaumSidePanel.svelte b/frontend/src/lib/components/StammbaumSidePanel.svelte index 1c001825..fb73c952 100644 --- a/frontend/src/lib/components/StammbaumSidePanel.svelte +++ b/frontend/src/lib/components/StammbaumSidePanel.svelte @@ -139,13 +139,32 @@ const topDerived = $derived(
-
-

{node.displayName}

- {#if node.birthYear || node.deathYear} -

- {node.birthYear ?? '?'}–{node.deathYear ?? ''} -

- {/if} +
+
+

{node.displayName}

+ {#if node.birthYear || node.deathYear} +

+ {node.birthYear ?? '?'}–{node.deathYear ?? ''} +

+ {/if} +
+
{#if error} diff --git a/frontend/src/lib/components/StammbaumSidePanel.svelte.spec.ts b/frontend/src/lib/components/StammbaumSidePanel.svelte.spec.ts new file mode 100644 index 00000000..f924bbd4 --- /dev/null +++ b/frontend/src/lib/components/StammbaumSidePanel.svelte.spec.ts @@ -0,0 +1,46 @@ +import { describe, it, expect, afterEach, vi, beforeEach } from 'vitest'; +import { cleanup, render } from 'vitest-browser-svelte'; +import { page } from 'vitest/browser'; +import StammbaumSidePanel from './StammbaumSidePanel.svelte'; + +vi.mock('$app/navigation', () => ({ invalidateAll: vi.fn() })); +vi.mock('$lib/components/PersonTypeahead.svelte', () => ({ default: () => null })); + +const makeNode = () => ({ + id: 'person-1', + displayName: 'Alice Müller', + birthYear: 1900, + deathYear: null, + familyMember: true +}); + +function stubFetch(directRels: unknown[] = [], inferredRels: unknown[] = []) { + let callCount = 0; + vi.stubGlobal( + 'fetch', + vi.fn().mockImplementation(() => { + callCount++; + const body = callCount % 2 === 1 ? directRels : inferredRels; + return Promise.resolve({ ok: true, json: () => Promise.resolve(body) }); + }) + ); +} + +beforeEach(() => stubFetch()); +afterEach(() => { + cleanup(); + vi.unstubAllGlobals(); +}); + +describe('StammbaumSidePanel', () => { + it('calls onClose when dismiss button is clicked', async () => { + const onClose = vi.fn(); + render(StammbaumSidePanel, { node: makeNode(), onClose, canWrite: false }); + await expect.element(page.getByRole('button', { name: 'Schließen' })).toBeInTheDocument(); + const btn = [...document.querySelectorAll('button')].find( + (b) => b.getAttribute('aria-label') === 'Schließen' + ); + btn!.click(); + expect(onClose).toHaveBeenCalledOnce(); + }); +});