import { describe, it, expect, vi } from 'vitest';
import { createJokeAgent } from '../../src/agents/jokes-mcp.agent.js';
import type { JokeProvider } from '../../src/providers/types.js';
const failingJokeApi: JokeProvider = {
getJoke: vi.fn().mockRejectedValue(new Error('JokeAPI offline')),
};
const failingOfficial: JokeProvider = {
getJoke: vi.fn().mockRejectedValue(new Error('Official API offline')),
};
const localMock: JokeProvider = {
getJoke: vi.fn().mockResolvedValue({ text: 'Local fallback joke', category: 'general', source: 'local-fallback' }),
};
describe('resolveJoke offline fallback', () => {
it('falls back to local provider when network providers fail', async () => {
const agent = createJokeAgent(
{ provider: 'jokeapi', timeoutMs: 10, retries: 0, allowNet: true, verbose: true },
{
providers: {
jokeapi: failingJokeApi,
official: failingOfficial,
local: localMock,
},
logEvent: vi.fn(),
logError: vi.fn(),
now: () => Date.now(),
},
);
const result = await agent.resolve({ category: 'programming', lang: 'en', blacklist: [] });
expect(result.source).toBe('local-fallback');
expect(result.text).toContain('Local fallback joke');
expect(failingJokeApi.getJoke).toHaveBeenCalled();
expect(failingOfficial.getJoke).toHaveBeenCalled();
expect(localMock.getJoke).toHaveBeenCalled();
});
});