diff --git a/src/lib/openaiClient.test.ts b/src/lib/openaiClient.test.ts new file mode 100644 index 0000000..0a5c607 --- /dev/null +++ b/src/lib/openaiClient.test.ts @@ -0,0 +1,46 @@ +import { generateDescriptions } from './openaiClient' + +const mockFetch = jest.fn() +global.fetch = mockFetch + +const mockResponse = (content: string) => ({ + ok: true, + json: async () => ({ choices: [{ message: { content } }] }), +}) + +describe('generateDescriptions', () => { + beforeEach(() => { + process.env.OPENAI_API_KEY = 'sk-test' + mockFetch.mockReset() + }) + + it('retourne shortDesc et longDesc depuis OpenAI', async () => { + mockFetch + .mockResolvedValueOnce(mockResponse('
Description courte
')) + .mockResolvedValueOnce(mockResponse('Description longue
')) + const result = await generateDescriptions({ + title: 'Perceuse', rawDescription: 'Une perceuse', comment: '', vendor: 'BOSCH', famille: 'OUTILLAGE', + }) + expect(result.shortDesc).toBe('Description courte
') + expect(result.longDesc).toBe('Description longue
') + expect(mockFetch).toHaveBeenCalledTimes(2) + }) + + it('lance les deux requêtes en parallèle', async () => { + mockFetch.mockResolvedValue(mockResponse('ok
')) + await generateDescriptions({ title: 'T', rawDescription: '', comment: '', vendor: '', famille: '' }) + expect(mockFetch).toHaveBeenCalledTimes(2) + }) + + it('lance une erreur si OPENAI_API_KEY manquant', async () => { + delete process.env.OPENAI_API_KEY + await expect(generateDescriptions({ title: 'T', rawDescription: '', comment: '', vendor: '', famille: '' })) + .rejects.toThrow('OPENAI_API_KEY') + }) + + it('lance une erreur si la réponse OpenAI est non-ok', async () => { + mockFetch.mockResolvedValue({ ok: false, status: 429, text: async () => 'rate limited' }) + await expect(generateDescriptions({ title: 'T', rawDescription: '', comment: '', vendor: '', famille: '' })) + .rejects.toThrow('429') + }) +}) diff --git a/src/lib/openaiClient.ts b/src/lib/openaiClient.ts new file mode 100644 index 0000000..441b497 --- /dev/null +++ b/src/lib/openaiClient.ts @@ -0,0 +1,46 @@ +interface DescriptionInput { + title: string + rawDescription: string + comment: string + vendor: string + famille: string +} + +interface Descriptions { + shortDesc: string + longDesc: string +} + +async function callOpenAI(prompt: string): Promiseou