import { afterEach, describe, expect, it, vi } from
"vitest" ;
import { isValidXaiTtsVoice, XAI_BASE_URL, XAI_TTS_VOICES, xaiTTS } from
"./tts.js" ;
describe(
"xai tts" , () => {
const originalFetch = globalThis.fetch;
afterEach(() => {
globalThis.fetch = originalFetch;
vi.restoreAllMocks();
});
describe(
"isValidXaiTtsVoice" , () => {
it(
"accepts all valid voices" , () => {
for (
const voice of XAI_TTS_VOICES) {
expect(isValidXaiTtsVoice(voice)).toBe(
true );
}
});
it(
"rejects invalid voice names" , () => {
expect(isValidXaiTtsVoice(
"invalid" )).toBe(
false );
expect(isValidXaiTtsVoice(
"" )).toBe(
false );
expect(isValidXaiTtsVoice(
"ALLOY" )).toBe(
false );
expect(isValidXaiTtsVoice(
"alloy " )).toBe(
false );
expect(isValidXaiTtsVoice(
" alloy" )).toBe(
false );
});
it(
"treats custom endpoints as permissive" , () => {
expect(isValidXaiTtsVoice(
"grok-voice-custom" ,
"https://custom.api.x.ai/v1 ")).toBe(true);
});
});
describe(
"xaiTTS diagnostics" , () => {
it(
"includes parsed provider detail and request id for JSON API errors" , async () => {
const fetchMock = vi.fn(
async () =>
new Response(
JSON.stringify({
error: {
message:
"Invalid API key" ,
type:
"invalid_request_error" ,
code:
"invalid_api_key" ,
},
}),
{
status:
401 ,
headers: {
"Content-Type" :
"application/json" ,
"x-request-id" :
"req_123" ,
},
},
),
);
globalThis.fetch = fetchMock as unknown as
typeof fetch;
await expect(
xaiTTS({
text:
"hello" ,
apiKey:
"bad-key" ,
baseUrl: XAI_BASE_URL,
voiceId:
"eve" ,
language:
"en" ,
responseFormat:
"mp3" ,
timeoutMs:
5 _
000 ,
}),
).rejects.toThrow(
"xAI TTS API error (401): Invalid API key [type=invalid_request_error, code=invalid_api_key] [request_id=req_123]" ,
);
});
it(
"falls back to raw body text when the error body is non-JSON" , async () => {
const fetchMock = vi.fn(
async () =>
new Response(
"temporary upstream outage" , { status:
503 }),
);
globalThis.fetch = fetchMock as unknown as
typeof fetch;
await expect(
xaiTTS({
text:
"hello" ,
apiKey:
"test-key" ,
baseUrl: XAI_BASE_URL,
voiceId:
"eve" ,
language:
"en" ,
responseFormat:
"mp3" ,
timeoutMs:
5 _
000 ,
}),
).rejects.toThrow(
"xAI TTS API error (503): temporary upstream outage" );
});
});
});
Messung V0.5 in Prozent C=99 H=98 G=98
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland