diff --git a/frontend/src/lib/components/SettingsCard.svelte b/frontend/src/lib/components/SettingsCard.svelte new file mode 100644 index 0000000..404cf8c --- /dev/null +++ b/frontend/src/lib/components/SettingsCard.svelte @@ -0,0 +1,32 @@ + + + + + {title} + + + {#if meta} +

+ {meta} +

+ {/if} + + + {cta} + +
diff --git a/frontend/src/lib/components/SettingsCard.test.ts b/frontend/src/lib/components/SettingsCard.test.ts new file mode 100644 index 0000000..73d53e2 --- /dev/null +++ b/frontend/src/lib/components/SettingsCard.test.ts @@ -0,0 +1,43 @@ +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/svelte'; +import SettingsCard from './SettingsCard.svelte'; + +describe('SettingsCard', () => { + it('renders the title', () => { + render(SettingsCard, { props: { title: 'Vorräte', href: '/household/staples', cta: 'Vorräte bearbeiten →' } }); + expect(screen.getByText('Vorräte')).toBeInTheDocument(); + }); + + it('renders as an anchor tag with the given href', () => { + render(SettingsCard, { props: { title: 'Vorräte', href: '/household/staples?ctx=settings', cta: 'Bearbeiten →' } }); + const link = screen.getByRole('link'); + expect(link).toHaveAttribute('href', '/household/staples?ctx=settings'); + }); + + it('renders the cta text', () => { + render(SettingsCard, { props: { title: 'Vorräte', href: '/household/staples', cta: 'Vorräte bearbeiten →' } }); + expect(screen.getByText('Vorräte bearbeiten →')).toBeInTheDocument(); + }); + + it('renders meta text when provided', () => { + render(SettingsCard, { props: { title: 'Haushalt', href: '/members', cta: 'Mitglieder anzeigen →', meta: '3 Mitglieder' } }); + expect(screen.getByText('3 Mitglieder')).toBeInTheDocument(); + }); + + it('does not render meta element when meta is not provided', () => { + render(SettingsCard, { props: { title: 'Haushalt', href: '/members', cta: 'Mitglieder anzeigen →' } }); + expect(screen.queryByTestId('card-meta')).not.toBeInTheDocument(); + }); + + it('applies accent border style when accent=true', () => { + render(SettingsCard, { props: { title: 'Vorräte', href: '/household/staples', cta: 'Bearbeiten →', accent: true } }); + const link = screen.getByRole('link'); + expect(link).toHaveAttribute('data-accent', 'true'); + }); + + it('does not apply accent when accent is not set', () => { + render(SettingsCard, { props: { title: 'Haushalt', href: '/members', cta: 'Anzeigen →' } }); + const link = screen.getByRole('link'); + expect(link).not.toHaveAttribute('data-accent', 'true'); + }); +});