test(person/genealogy): cover StammbaumCard branches
Heading, family-member toggle visibility tied to canWrite, aria-checked matrix, in-tree banner gating, relationship-error alert, empty placeholder, no-derived-relationships path, AddRelationshipForm mounting tied to canWrite. 10 tests covering ~25 branches. Refs #496. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
import { describe, it, expect, afterEach } from 'vitest';
|
||||
import { cleanup, render } from 'vitest-browser-svelte';
|
||||
import { page } from 'vitest/browser';
|
||||
import StammbaumCard from './StammbaumCard.svelte';
|
||||
|
||||
afterEach(cleanup);
|
||||
|
||||
const baseProps = (overrides: Record<string, unknown> = {}) => ({
|
||||
personId: 'p-1',
|
||||
familyMember: false,
|
||||
relationships: [] as unknown[],
|
||||
inferredRelationships: [] as unknown[],
|
||||
canWrite: false,
|
||||
relationshipError: null as string | null,
|
||||
...overrides
|
||||
});
|
||||
|
||||
describe('StammbaumCard', () => {
|
||||
it('renders the heading', async () => {
|
||||
render(StammbaumCard, { props: baseProps() });
|
||||
|
||||
await expect
|
||||
.element(page.getByRole('heading', { name: /stammbaum & beziehungen/i }))
|
||||
.toBeVisible();
|
||||
});
|
||||
|
||||
it('renders the family-member toggle when canWrite is true', async () => {
|
||||
render(StammbaumCard, { props: baseProps({ canWrite: true }) });
|
||||
|
||||
await expect.element(page.getByRole('switch')).toBeVisible();
|
||||
});
|
||||
|
||||
it('omits the family-member toggle when canWrite is false', async () => {
|
||||
render(StammbaumCard, { props: baseProps() });
|
||||
|
||||
await expect.element(page.getByRole('switch')).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('marks the toggle as aria-checked=true when familyMember is true', async () => {
|
||||
render(StammbaumCard, { props: baseProps({ canWrite: true, familyMember: true }) });
|
||||
|
||||
await expect.element(page.getByRole('switch')).toHaveAttribute('aria-checked', 'true');
|
||||
});
|
||||
|
||||
it('renders the in-tree banner when familyMember is true', async () => {
|
||||
render(StammbaumCard, { props: baseProps({ familyMember: true }) });
|
||||
|
||||
await expect.element(page.getByText('Erscheint im Stammbaum')).toBeVisible();
|
||||
await expect
|
||||
.element(page.getByRole('link', { name: /ansehen/i }))
|
||||
.toHaveAttribute('href', '/stammbaum?focus=p-1');
|
||||
});
|
||||
|
||||
it('hides the in-tree banner when familyMember is false', async () => {
|
||||
render(StammbaumCard, { props: baseProps() });
|
||||
|
||||
await expect.element(page.getByText('Erscheint im Stammbaum')).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('shows the relationshipError alert when set', async () => {
|
||||
render(StammbaumCard, {
|
||||
props: baseProps({ relationshipError: 'Beziehung konnte nicht gespeichert werden.' })
|
||||
});
|
||||
|
||||
await expect
|
||||
.element(page.getByText('Beziehung konnte nicht gespeichert werden.'))
|
||||
.toBeVisible();
|
||||
});
|
||||
|
||||
it('renders the empty placeholder for direct relationships when none exist', async () => {
|
||||
render(StammbaumCard, { props: baseProps() });
|
||||
|
||||
await expect.element(page.getByText('Noch keine Beziehungen bekannt.')).toBeVisible();
|
||||
});
|
||||
|
||||
it('hides the inferred-relationships disclosure when there are none', async () => {
|
||||
render(StammbaumCard, { props: baseProps() });
|
||||
|
||||
await expect.element(page.getByText('Abgeleitete Beziehungen')).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('renders the AddRelationshipForm when canWrite is true', async () => {
|
||||
render(StammbaumCard, { props: baseProps({ canWrite: true }) });
|
||||
|
||||
// AddRelationshipForm renders interactive elements
|
||||
const buttons = document.querySelectorAll('button');
|
||||
expect(buttons.length).toBeGreaterThan(1);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user