import { instrumentedFetch } from '../instrumented_fetch' import { makeRequest } from '../request_helpers' jest.mock('../instrumented_fetch', () => ({ instrumentedFetch: jest.fn() })) const mockFetch = jest.mocked(instrumentedFetch) const fetchedUrl = () => new URL(mockFetch.mock.calls[0][0]) const get = (data: Record) => makeRequest({ action: 'GET', url: 'https://api.example.com/search_results', data, headers: {} }) describe('makeRequest', () => { beforeEach(() => { mockFetch.mockResolvedValue(new Response('{}', { status: 200 })) }) afterEach(() => { mockFetch.mockReset() }) it('serializes data as snake_case query params', async () => { await get({ q: 'potluck', perPage: 20 }) const { searchParams } = fetchedUrl() expect(searchParams.get('q')).toBe('potluck') expect(searchParams.get('per_page')).toBe('20') }) it.each(['Pastor Bob', 'café', '#potluck', 'Q&A', '100%'])( 'sends %p so the server reads it back unchanged', async term => { await get({ q: term }) const { search, searchParams } = fetchedUrl() expect(searchParams.get('q')).toBe(term) expect(() => decodeURIComponent(search)).not.toThrow() } ) })