diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-02 08:06:13 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-02 08:06:13 +0300 |
| commit | 0349a83743f8b8c8125a35b93b2271e402352b99 (patch) | |
| tree | 89dc07a29a475511316dc90765ca83a6f65b074d /internal/processor/processor_test.go | |
| parent | b7302580d840fc3d7e3d127df49d79ef12d79d9c (diff) | |
Fix processor GUI parity gaps
Diffstat (limited to 'internal/processor/processor_test.go')
| -rw-r--r-- | internal/processor/processor_test.go | 83 |
1 files changed, 81 insertions, 2 deletions
diff --git a/internal/processor/processor_test.go b/internal/processor/processor_test.go index 8716e79..f658713 100644 --- a/internal/processor/processor_test.go +++ b/internal/processor/processor_test.go @@ -19,8 +19,10 @@ import ( ) type stubImageSearcher struct { - lastPrompt string - searchErr error + lastPrompt string + searchErr error + downloadErr error + promptCallback func(string) } func (s *stubImageSearcher) Search(ctx context.Context, opts *image.SearchOptions) ([]image.SearchResult, error) { @@ -29,6 +31,9 @@ func (s *stubImageSearcher) Search(ctx context.Context, opts *image.SearchOption } s.lastPrompt = "stub nanobanana prompt" + if s.promptCallback != nil { + s.promptCallback(s.lastPrompt) + } return []image.SearchResult{ { ID: "stub-image", @@ -44,6 +49,9 @@ func (s *stubImageSearcher) Search(ctx context.Context, opts *image.SearchOption } func (s *stubImageSearcher) Download(ctx context.Context, url string) (io.ReadCloser, error) { + if s.downloadErr != nil { + return nil, s.downloadErr + } return io.NopCloser(strings.NewReader("mock image data")), nil } @@ -59,6 +67,10 @@ func (s *stubImageSearcher) GetLastPrompt() string { return s.lastPrompt } +func (s *stubImageSearcher) SetPromptCallback(callback func(string)) { + s.promptCallback = callback +} + type fakeAudioProvider struct { generateCalls int texts []string @@ -411,6 +423,26 @@ func TestGenerateAudioBgBgUsesSharedOpenAIVoices(t *testing.T) { if !strings.HasSuffix(fakeProvider.outputFiles[1], "audio_back.mp3") { t.Fatalf("back output file = %q, want audio_back.mp3", fakeProvider.outputFiles[1]) } + + wordDir := p.findCardDirectory("ябълка") + if wordDir == "" { + t.Fatal("expected generated word directory") + } + + metadataData, err := os.ReadFile(filepath.Join(wordDir, "audio_metadata.txt")) + if err != nil { + t.Fatalf("expected metadata file: %v", err) + } + metadata := string(metadataData) + for _, want := range []string{ + "provider=openai", + "audio_file=audio_front.mp3", + "audio_file_back=audio_back.mp3", + } { + if !strings.Contains(metadata, want) { + t.Fatalf("metadata = %q, missing %q", metadata, want) + } + } } func TestGenerateAudioProviderFactoryError(t *testing.T) { @@ -515,6 +547,7 @@ func TestGenerateAudioUsesConfiguredGeminiVoiceAndModel(t *testing.T) { "voice=Kore", "speed=1.00", "format=wav", + "audio_file=audio.wav", } { if !strings.Contains(metadata, want) { t.Fatalf("metadata = %q, missing %q", metadata, want) @@ -733,6 +766,52 @@ func TestDownloadImagesWithTranslationUsesNanoBananaConfigAndSavesPrompt(t *test } } +func TestDownloadImagesWithTranslationPersistsPromptWhenDownloadFails(t *testing.T) { + t.Setenv("OPENAI_API_KEY", "test-openai-key") + t.Setenv("GOOGLE_API_KEY", "test-google-key") + + originalConfig := viper.New() + *originalConfig = *viper.GetViper() + defer func() { + *viper.GetViper() = *originalConfig + }() + viper.Reset() + viper.Set("image.provider", "nanobanana") + + originalConstructor := newNanoBananaImageClient + stubSearcher := &stubImageSearcher{downloadErr: errors.New("download failed")} + newNanoBananaImageClient = func(config *image.NanoBananaConfig) image.ImageSearcher { + return stubSearcher + } + t.Cleanup(func() { + newNanoBananaImageClient = originalConstructor + }) + + flags := cli.NewFlags() + flags.OutputDir = t.TempDir() + flags.ImageAPI = "nanobanana" + flags.ImageAPISpecified = true + + p := NewProcessor(flags) + err := p.downloadImagesWithTranslation("ябълка", "apple") + if err == nil { + t.Fatal("downloadImagesWithTranslation() expected error from failed download") + } + + wordDir := p.findCardDirectory("ябълка") + if wordDir == "" { + t.Fatal("expected word directory to be created") + } + + promptData, err := os.ReadFile(filepath.Join(wordDir, "image_prompt.txt")) + if err != nil { + t.Fatalf("expected prompt file after failed download: %v", err) + } + if got := strings.TrimSpace(string(promptData)); got != "stub nanobanana prompt" { + t.Fatalf("prompt file = %q, want %q", got, "stub nanobanana prompt") + } +} + func TestDownloadImagesWithTranslationUsesConfiguredNanoBananaWhenImageAPINotSpecified(t *testing.T) { t.Setenv("OPENAI_API_KEY", "test-openai-key") t.Setenv("GOOGLE_API_KEY", "test-google-key") |
