diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-01 22:31:06 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-01 22:31:06 +0300 |
| commit | faa2465955445ac1cb1461eb70a98280d32fbf9a (patch) | |
| tree | 2481479f774e0c5f117bb311cd189a217d7a6439 /internal/gui/generator_test.go | |
| parent | e5623423c85b3cbe5c96943e94b07ccafa04368a (diff) | |
Wire Gemini audio into GUI
Diffstat (limited to 'internal/gui/generator_test.go')
| -rw-r--r-- | internal/gui/generator_test.go | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/internal/gui/generator_test.go b/internal/gui/generator_test.go index 7c1e96b..635b990 100644 --- a/internal/gui/generator_test.go +++ b/internal/gui/generator_test.go @@ -220,6 +220,84 @@ func TestGenerateAudioUsesSharedOpenAIVoices(t *testing.T) { } } +func TestGenerateAudioUsesSharedGeminiVoicesAndAttribution(t *testing.T) { + originalFactory := newAudioProvider + t.Cleanup(func() { + newAudioProvider = originalFactory + }) + + originalVoices := append([]string(nil), audio.GeminiVoices...) + t.Cleanup(func() { + audio.GeminiVoices = originalVoices + }) + + audio.GeminiVoices = []string{"sentinel-gemini-voice"} + + fakeProvider := &fakeAudioProvider{} + var capturedConfig *audio.Config + newAudioProvider = func(config *audio.Config) (audio.Provider, error) { + copyConfig := *config + capturedConfig = ©Config + return fakeProvider, nil + } + + tempDir := t.TempDir() + cardDir := filepath.Join(tempDir, "card") + if err := os.MkdirAll(cardDir, 0755); err != nil { + t.Fatalf("failed to create card dir: %v", err) + } + + app := &Application{ + config: &Config{ + OutputDir: tempDir, + AudioFormat: "wav", + }, + audioConfig: &audio.Config{ + Provider: "gemini", + OutputDir: tempDir, + GoogleAPIKey: "google-key", + GeminiTTSModel: "gemini-2.5-flash-preview-tts", + }, + } + + outputPath, err := app.generateAudio(context.Background(), "ябълка", cardDir) + if err != nil { + t.Fatalf("generateAudio() unexpected error: %v", err) + } + + if capturedConfig == nil { + t.Fatal("expected audio provider config to be captured") + } + if capturedConfig.Provider != "gemini" { + t.Fatalf("captured Provider = %q, want %q", capturedConfig.Provider, "gemini") + } + if capturedConfig.GeminiVoice != "sentinel-gemini-voice" { + t.Fatalf("captured GeminiVoice = %q, want %q", capturedConfig.GeminiVoice, "sentinel-gemini-voice") + } + if capturedConfig.OutputFormat != "wav" { + t.Fatalf("captured OutputFormat = %q, want %q", capturedConfig.OutputFormat, "wav") + } + if fakeProvider.generateCalls != 1 { + t.Fatalf("GenerateAudio() calls = %d, want %d", fakeProvider.generateCalls, 1) + } + if !strings.HasSuffix(outputPath, "audio.wav") { + t.Fatalf("outputPath = %q, want a WAV output file", outputPath) + } + + attrPath := audio.AttributionPath(outputPath) + attributionData, err := os.ReadFile(attrPath) + if err != nil { + t.Fatalf("expected attribution file %q: %v", attrPath, err) + } + attribution := string(attributionData) + if !strings.Contains(attribution, "Audio generated by Google Gemini TTS") { + t.Fatalf("gemini attribution missing header: %q", attribution) + } + if !strings.Contains(attribution, "Voice: sentinel-gemini-voice") { + t.Fatalf("gemini attribution missing voice: %q", attribution) + } +} + func TestGenerateAudioBgBgUsesSharedOpenAIVoices(t *testing.T) { originalFactory := newAudioProvider t.Cleanup(func() { |
