jokeapi-provider.test.js•1.75 kB
import { describe, it, expect, beforeEach, vi } from 'vitest';
const mockFetchWithRetry = vi.fn();
vi.mock('../../src/providers/sharedFetch.js', () => ({
fetchWithRetry: mockFetchWithRetry,
}));
const { getJoke } = await import('../../src/providers/jokeapi.js');
describe('JokeAPI provider', () => {
beforeEach(() => {
mockFetchWithRetry.mockReset();
});
it('requests a joke with expected parameters', async () => {
mockFetchWithRetry.mockResolvedValue(
new Response(
JSON.stringify({
error: false,
type: 'single',
joke: 'Test joke',
category: 'Programming',
}),
{ headers: { 'Content-Type': 'application/json' } },
),
);
const result = await getJoke(
{ category: 'programming', lang: 'en', blacklist: ['nsfw'] },
{ timeoutMs: 1000, retries: 0, allowNet: true },
);
expect(result.source).toBe('jokeapi');
expect(result.category).toBe('programming');
expect(mockFetchWithRetry).toHaveBeenCalledTimes(1);
const [requestedUrl] = mockFetchWithRetry.mock.calls[0];
expect(requestedUrl).toContain('/Programming');
expect(requestedUrl).toContain('lang=en');
expect(requestedUrl).toContain('blacklistFlags=nsfw');
expect(requestedUrl).toContain('type=single');
});
it('throws when API returns an error payload', async () => {
mockFetchWithRetry.mockResolvedValue(
new Response(
JSON.stringify({ error: true, message: 'Bad request' }),
{ headers: { 'Content-Type': 'application/json' } },
),
);
await expect(
getJoke({ category: 'general', lang: 'en', blacklist: [] }, { allowNet: true }),
).rejects.toThrow('JokeAPI returned an error');
});
});