fix: ajouter un timeout DeepL et isoler les échecs par langue

This commit is contained in:
2026-07-04 09:47:26 +04:00
parent ddb6d3f2f0
commit 36917d79b4
2 changed files with 68 additions and 3 deletions
@@ -0,0 +1,60 @@
import {describe, it, expect, vi, afterEach} from 'vitest'
const {default: createService} = await import('../parole.js')
function fakeDeeplResponse(text) {
return {
ok: true,
json: async () => ({translations: [{text}]})
}
}
describe('Translator (DeepL)', () => {
const originalFetch = global.fetch
afterEach(() => {
global.fetch = originalFetch
vi.restoreAllMocks()
})
it('attache un timeout à la requête DeepL', async () => {
global.fetch = vi.fn(async () => fakeDeeplResponse('hello'))
const strapi = {contentType: vi.fn(() => ({uid: 'api::parole.parole', kind: 'collectionType'}))}
const service = createService({strapi})
await service.translate('FR', 'EN', 'bonjour')
const [, options] = global.fetch.mock.calls[0]
expect(options.signal).toBeInstanceOf(AbortSignal)
})
})
describe('translateLyrics', () => {
const originalFetch = global.fetch
afterEach(() => {
global.fetch = originalFetch
vi.restoreAllMocks()
})
it('continue les autres langues quand une traduction DeepL échoue', async () => {
global.fetch = vi.fn(async (_url, options) => {
const {target_lang: target} = JSON.parse(options.body)
if (target === 'ES') {
return {ok: false, status: 500, text: async () => 'boom'}
}
return fakeDeeplResponse(`traduit-${target}`)
})
const strapi = {
contentType: vi.fn(() => ({uid: 'api::parole.parole', kind: 'collectionType'})),
log: {error: vi.fn()}
}
const service = createService({strapi})
const result = await service.translateLyrics('Bonjour le monde')
expect(result.anglais).toContain('traduit-EN')
expect(result.espagnol).toBeUndefined()
})
})
+6 -1
View File
@@ -64,7 +64,8 @@ class Translator {
text: Array.isArray(text) ? text : [text], text: Array.isArray(text) ? text : [text],
source_lang: origin, source_lang: origin,
target_lang: target, target_lang: target,
}) }),
signal: AbortSignal.timeout(15_000)
}) })
if (!response.ok) { if (!response.ok) {
@@ -90,8 +91,12 @@ module.exports = createCoreService('api::parole.parole', ({strapi}) => ({
for (const lang of ALL_LANGS) { for (const lang of ALL_LANGS) {
if (lang === 'fr') continue if (lang === 'fr') continue
const { field, deeplTarget, suffix } = LANG_MAP[lang] const { field, deeplTarget, suffix } = LANG_MAP[lang]
try {
const translated = await this.translate('FR', deeplTarget, parolesFR) const translated = await this.translate('FR', deeplTarget, parolesFR)
result[field] = translated + suffix result[field] = translated + suffix
} catch (err) {
strapi.log.error(`DeepL (${deeplTarget}): ${err.message}`)
}
} }
return result return result