ditto/packages/translators/LibreTranslateTranslator.test.ts
2025-02-20 11:07:41 -06:00

89 lines
2.8 KiB
TypeScript

import { detectLanguage } from '@ditto/lang';
import { assertEquals } from '@std/assert';
import { LibreTranslateTranslator } from './LibreTranslateTranslator.ts';
Deno.test('LibreTranslate translation with source language omitted', async () => {
const translator = mockLibreTranslate();
const data = await translator.translate(
[
'Bom dia amigos',
'Meu nome é Patrick, um nome belo ou feio? A questão é mais profunda do que parece.',
'A respiração é mais importante do que comer e tomar agua.',
],
undefined,
'ca',
);
assertEquals(data.sourceLang, 'pt');
assertEquals(detectLanguage(data.results[0], 0), 'ca');
assertEquals(detectLanguage(data.results[1], 0), 'ca');
assertEquals(detectLanguage(data.results[2], 0), 'ca');
});
Deno.test('LibreTranslate translation with source language set', async () => {
const translator = mockLibreTranslate();
const data = await translator.translate(
[
'Bom dia amigos',
'Meu nome é Patrick, um nome belo ou feio? A questão é mais profunda do que parece.',
'A respiração é mais importante do que comer e tomar agua.',
],
'pt',
'ca',
);
assertEquals(data.sourceLang, 'pt');
assertEquals(detectLanguage(data.results[0], 0), 'ca');
assertEquals(detectLanguage(data.results[1], 0), 'ca');
assertEquals(detectLanguage(data.results[2], 0), 'ca');
});
function mockLibreTranslate(): LibreTranslateTranslator {
return new LibreTranslateTranslator({
apiKey: 'libretranslate',
fetch: async (input, init) => {
const req = new Request(input, init);
const body = await req.json();
switch (body.q) {
case 'Bom dia amigos':
return jsonResponse({
detectedLanguage: { language: 'pt' },
translatedText: 'Bon dia, amics.',
});
case 'Meu nome é Patrick, um nome belo ou feio? A questão é mais profunda do que parece.':
return jsonResponse({
detectedLanguage: { language: 'pt' },
translatedText: 'Em dic Patrick, un nom molt o lleig? La pregunta és més profunda del que sembla.',
});
case 'A respiração é mais importante do que comer e tomar agua.':
return jsonResponse({
detectedLanguage: { language: 'pt' },
translatedText: 'La respiració és més important que menjar i prendre aigua.',
});
}
return new Response(JSON.stringify({ error: 'Not found' }), { status: 404 });
},
});
}
interface LibreTranslateResponse {
translatedText: string;
detectedLanguage?: {
language: string;
};
}
function jsonResponse(json: LibreTranslateResponse): Response {
const body = JSON.stringify(json);
return new Response(body, {
headers: {
'Content-Type': 'application/json',
},
});
}