← Docs

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.