test-writer
Create and maintain tests for the Raamattu Nyt monorepo using Vitest and React Testing Library. Use when: - Writing new tests for hooks, components, or utility functions - Analyzing recent git commits to identify code needing tests - Reviewing existing tests for correctness and coverage - Creating mocks for Supabase, auth, or other dependencies - Debugging test failures or flaky tests Triggers: "write tests", "test this", "add tests", "need tests for", "analyze test coverage", "fix failing tests", "mock this", "review tests"
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Test Writer
Write and maintain tests for the Raamattu Nyt monorepo.
Context Files (Read First)
For structure and conventions, read from Docs/context/:
-
Docs/context/repo-structure.md- Where test files go -
Docs/context/conventions.md- Naming patterns
Quick Start
# Run all tests
npm test
# Run with coverage
npm run test:coverage
# Run specific test file
npx vitest run path/to/file.test.ts
Test File Conventions
- Place tests adjacent to source:
useHook.ts→useHook.test.ts - Use
.test.tsfor pure logic,.test.tsxfor React components/hooks - Name:
describe("ComponentName")ordescribe("hookName")
Standard Test Structure
import { describe, expect, it, vi, beforeEach } from "vitest";
// Mocks BEFORE imports (hoisted)
vi.mock("@/integrations/supabase/client", () => ({
supabase: { rpc: vi.fn() }
}));
// Import module under test AFTER mocks
import { myFunction } from "./myModule";
describe("myFunction", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("does expected behavior", () => {
expect(myFunction()).toBe(expected);
});
});
Hook Testing Pattern
import { renderHook, waitFor } from "@testing-library/react";
// Wrapper for context providers
const wrapper = ({ children }) => (
<AuthProvider>{children}</AuthProvider>
);
it("returns initial state", () => {
const { result } = renderHook(() => useMyHook(), { wrapper });
expect(result.current.loading).toBe(true);
});
it("updates on async action", async () => {
const { result } = renderHook(() => useMyHook(), { wrapper });
await waitFor(() => {
expect(result.current.data).toBeDefined();
});
});
Common Mocks
See references/mocks.md for reusable mock patterns:
- Supabase client (RPC, auth, schema queries)
- useAuth hook
- React Query
- localStorage
Workflow
-
Identify what to test
- Use
code-wizardskill to find the file/function - Check git log for recent changes:
git log --oneline -20
- Use
-
Check existing tests
- Find tests:
Glob pattern: **/*.test.{ts,tsx} - Read related test files for patterns
- Find tests:
-
Write tests covering
- Happy path (normal operation)
- Error cases (API failures, invalid input)
- Edge cases (empty arrays, null, undefined)
- Loading states for async operations
-
Run and verify
npx vitest run path/to/file.test.ts
Test Quality Checklist
- Tests are independent (no shared state between tests)
- Mocks are cleared in
beforeEach - Async operations use
waitFornot arbitrary delays - Error scenarios are tested
- Edge cases covered (null, empty, boundary values)
Related Skills
| Situation | Delegate To |
|---|---|
| Find code to test | code-wizard |
| Debug test failures | systematic-debugging |
| CI test failures | ci-doctor |
| Lint errors in tests | lint-fixer |
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-26
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!