Jest Patterns
Battle-tested testing recipes for Meridian's TypeScript codebase.
Mocking External Services
jest.mock('@/lib/api', () => ({
fetchSession: jest.fn().mockResolvedValue({
id: 'sess_01',
valid: true,
}),
}))Hoist mocks above imports. Jest auto-hoists jest.mock calls.
Table-Driven Tests
const cases = [
{ input: 'abc', expected: 3 },
{ input: '', expected: 0 },
{ input: 'hello', expected: 5 },
]
it.each(cases)('length of "$input"', ({ input, expected }) => {
expect(input.length).toBe(expected)
})it.each generates one test per row. Failures isolate cleanly.
Async Error Assertions
await expect(async () => {
await validateToken(null)
}).rejects.toThrow('Token required')Always await expect(...).rejects — unawaited promises pass silently.
Timer Faking
beforeEach(() => jest.useFakeTimers())
afterEach(() => jest.useRealTimers())
it('debounces calls', () => {
const fn = jest.fn()
debounce(fn, 300)()
jest.advanceTimersByTime(299)
expect(fn).not.toHaveBeenCalled()
jest.advanceTimersByTime(1)
expect(fn).toHaveBeenCalledTimes(1)
})Snapshot Discipline
it('renders license card', () => {
const { asFragment } = render(<LicenseCard tier="pro" />)
expect(asFragment()).toMatchSnapshot()
})Snapshot files commit to git. Review diffs in PR like any other code change.