From 43446b807d0ff3d32731b3609381926a28e25414 Mon Sep 17 00:00:00 2001 From: Thomas Richter Date: Tue, 3 Feb 2026 23:36:19 +0100 Subject: [PATCH] test(09-02): add browser-mode component tests for Svelte 5 components - CompletedToggle: 5 tests for checkbox rendering, state, and interaction - SearchBar: 7 tests for input, placeholder, recent searches dropdown - TagInput: 6 tests for rendering with various tag configurations - Update vitest-setup-client.ts with $app/state, preferences, recentSearches mocks - All component tests run in real Chromium browser via Playwright --- .../components/CompletedToggle.svelte.test.ts | 54 ++++++++++ src/lib/components/SearchBar.svelte.test.ts | 82 ++++++++++++++ src/lib/components/TagInput.svelte.test.ts | 102 ++++++++++++++++++ vitest-setup-client.ts | 24 +++++ 4 files changed, 262 insertions(+) create mode 100644 src/lib/components/CompletedToggle.svelte.test.ts create mode 100644 src/lib/components/SearchBar.svelte.test.ts create mode 100644 src/lib/components/TagInput.svelte.test.ts diff --git a/src/lib/components/CompletedToggle.svelte.test.ts b/src/lib/components/CompletedToggle.svelte.test.ts new file mode 100644 index 0000000..e1c86b2 --- /dev/null +++ b/src/lib/components/CompletedToggle.svelte.test.ts @@ -0,0 +1,54 @@ +import { render } from 'vitest-browser-svelte'; +import { page } from 'vitest/browser'; +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import CompletedToggle from './CompletedToggle.svelte'; + +describe('CompletedToggle', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('renders the toggle checkbox', async () => { + render(CompletedToggle); + + const checkbox = page.getByRole('checkbox'); + await expect.element(checkbox).toBeInTheDocument(); + }); + + it('renders "Show completed" label text', async () => { + render(CompletedToggle); + + const label = page.getByText('Show completed'); + await expect.element(label).toBeInTheDocument(); + }); + + it('renders checkbox in unchecked state by default', async () => { + render(CompletedToggle); + + const checkbox = page.getByRole('checkbox'); + await expect.element(checkbox).not.toBeChecked(); + }); + + it('checkbox becomes checked when clicked', async () => { + render(CompletedToggle); + + const checkbox = page.getByRole('checkbox'); + await expect.element(checkbox).not.toBeChecked(); + + await checkbox.click(); + + await expect.element(checkbox).toBeChecked(); + }); + + it('has accessible label with correct text', async () => { + render(CompletedToggle); + + // Verify the label has the correct text and is associated with the checkbox + const label = page.getByText('Show completed'); + await expect.element(label).toBeInTheDocument(); + + // The label should be a