diff --git a/frontend/src/routes/persons/[id]/PersonMergePanel.svelte b/frontend/src/routes/persons/[id]/PersonMergePanel.svelte index 92af8bb9..27447b38 100644 --- a/frontend/src/routes/persons/[id]/PersonMergePanel.svelte +++ b/frontend/src/routes/persons/[id]/PersonMergePanel.svelte @@ -15,7 +15,7 @@ let mergeTargetId = $state(''); let showMergeConfirm = $state(false); -
diff --git a/frontend/src/routes/persons/[id]/PersonMergePanel.svelte.spec.ts b/frontend/src/routes/persons/[id]/PersonMergePanel.svelte.spec.ts
new file mode 100644
index 00000000..4cfe9898
--- /dev/null
+++ b/frontend/src/routes/persons/[id]/PersonMergePanel.svelte.spec.ts
@@ -0,0 +1,55 @@
+import { describe, it, expect, vi, afterEach } from 'vitest';
+import { cleanup, render } from 'vitest-browser-svelte';
+import { page } from 'vitest/browser';
+import PersonMergePanel from './PersonMergePanel.svelte';
+
+vi.mock('$app/forms', () => ({ enhance: () => () => {} }));
+vi.mock('$lib/components/PersonTypeahead.svelte', () => ({
+ default: () => null
+}));
+
+afterEach(cleanup);
+
+const makePerson = (overrides = {}) => ({
+ displayName: 'Hans Müller',
+ ...overrides
+});
+
+// ─── Danger indicator ────────────────────────────────────────────────────────
+
+describe('PersonMergePanel — danger indicator', () => {
+ it('renders outer container with red border class', () => {
+ const { container } = render(PersonMergePanel, {
+ props: { person: makePerson(), form: null }
+ });
+ const panel = container.firstElementChild as HTMLElement;
+ expect(panel?.classList.contains('border-red-200')).toBe(true);
+ });
+});
+
+// ─── Initial state ────────────────────────────────────────────────────────────
+
+describe('PersonMergePanel — initial state', () => {
+ it('renders merge heading', async () => {
+ render(PersonMergePanel, { props: { person: makePerson(), form: null } });
+ const heading = page.getByRole('heading', { level: 2 });
+ await expect.element(heading).toBeInTheDocument();
+ });
+
+ it('merge button is disabled when no target selected', async () => {
+ render(PersonMergePanel, { props: { person: makePerson(), form: null } });
+ const mergeBtn = page.getByRole('button', { name: /zusammenführen/i });
+ await expect.element(mergeBtn).toBeDisabled();
+ });
+});
+
+// ─── Error state ──────────────────────────────────────────────────────────────
+
+describe('PersonMergePanel — error state', () => {
+ it('renders mergeError when form contains error', async () => {
+ render(PersonMergePanel, {
+ props: { person: makePerson(), form: { mergeError: 'Zielperson nicht gefunden.' } }
+ });
+ await expect.element(page.getByText('Zielperson nicht gefunden.')).toBeInTheDocument();
+ });
+});
diff --git a/frontend/src/routes/persons/[id]/edit/+page.svelte b/frontend/src/routes/persons/[id]/edit/+page.svelte
index 43701e13..b49dc471 100644
--- a/frontend/src/routes/persons/[id]/edit/+page.svelte
+++ b/frontend/src/routes/persons/[id]/edit/+page.svelte
@@ -5,7 +5,7 @@ import BackButton from '$lib/components/BackButton.svelte';
import PersonEditForm from './PersonEditForm.svelte';
import PersonEditSaveBar from './PersonEditSaveBar.svelte';
import NameHistoryEditCard from './NameHistoryEditCard.svelte';
-import PersonDangerZone from './PersonDangerZone.svelte';
+import PersonMergePanel from '../PersonMergePanel.svelte';
let { data, form } = $props();
const person = $derived(data.person);
@@ -35,7 +35,9 @@ const person = $derived(data.person);