diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-01 13:07:41 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-01 13:07:41 +0300 |
| commit | 5b88a045b29970a3cc057326b85eae58ab41fe02 (patch) | |
| tree | 2d70a826591d58b1b3349f95328b77409cd0267c | |
| parent | b006582e4c7323821eb836080a9bc9ec24243a47 (diff) | |
zr: restore OpenAI default translation provider
| -rw-r--r-- | internal/processor/processor_test.go | 55 | ||||
| -rw-r--r-- | internal/translation/translator.go | 12 | ||||
| -rw-r--r-- | internal/translation/translator_test.go | 65 |
3 files changed, 119 insertions, 13 deletions
diff --git a/internal/processor/processor_test.go b/internal/processor/processor_test.go index a9c9ab1..9e6b5fc 100644 --- a/internal/processor/processor_test.go +++ b/internal/processor/processor_test.go @@ -6,12 +6,20 @@ import ( "testing" "codeberg.org/snonux/totalrecall/internal/cli" + "github.com/spf13/viper" ) func TestNewProcessor(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() + flags := cli.NewFlags() p := NewProcessor(flags) @@ -36,6 +44,53 @@ func TestNewProcessor(t *testing.T) { } } +func TestNewProcessor_DefaultTranslationProviderUsesOpenAI(t *testing.T) { + t.Setenv("OPENAI_API_KEY", "") + t.Setenv("GOOGLE_API_KEY", "") + + originalConfig := viper.New() + *originalConfig = *viper.GetViper() + defer func() { + *viper.GetViper() = *originalConfig + }() + viper.Reset() + + flags := cli.NewFlags() + p := NewProcessor(flags) + + _, err := p.translator.TranslateWord("ябълка") + if err == nil { + t.Fatal("Expected error for missing OpenAI API key") + } + if err.Error() != "OpenAI API key not found" { + t.Fatalf("Expected OpenAI default provider error, got: %v", err) + } +} + +func TestNewProcessor_ExplicitGeminiTranslationProvider(t *testing.T) { + t.Setenv("OPENAI_API_KEY", "") + t.Setenv("GOOGLE_API_KEY", "") + + originalConfig := viper.New() + *originalConfig = *viper.GetViper() + defer func() { + *viper.GetViper() = *originalConfig + }() + viper.Reset() + viper.Set("translation.provider", "gemini") + + flags := cli.NewFlags() + p := NewProcessor(flags) + + _, err := p.translator.TranslateWord("ябълка") + if err == nil { + t.Fatal("Expected error for missing Google API key") + } + if err.Error() != "Google API key not found" { + t.Fatalf("Expected Gemini provider error, got: %v", err) + } +} + func TestProcessSingleWord_InvalidWord(t *testing.T) { flags := cli.NewFlags() flags.OutputDir = t.TempDir() diff --git a/internal/translation/translator.go b/internal/translation/translator.go index adcf6ae..1a3d3b2 100644 --- a/internal/translation/translator.go +++ b/internal/translation/translator.go @@ -36,10 +36,10 @@ type Config struct { GeminiModel string } -// DefaultConfig returns a translator configuration with Gemini as the default backend. +// DefaultConfig returns a translator configuration with OpenAI as the default backend. func DefaultConfig() *Config { return &Config{ - Provider: ProviderGemini, + Provider: ProviderOpenAI, OpenAIModel: openai.GPT4oMini, GeminiModel: defaultGeminiModel, } @@ -244,7 +244,7 @@ func normalizeConfig(config *Config) *Config { normalized.Provider = normalizeProvider(normalized.Provider) if normalized.Provider == "" { - normalized.Provider = ProviderGemini + normalized.Provider = ProviderOpenAI } if normalized.OpenAIModel == "" { normalized.OpenAIModel = openai.GPT4oMini @@ -258,10 +258,10 @@ func normalizeConfig(config *Config) *Config { func normalizeProvider(provider Provider) Provider { switch strings.ToLower(strings.TrimSpace(string(provider))) { - case "", string(ProviderGemini): - return ProviderGemini - case string(ProviderOpenAI): + case "", string(ProviderOpenAI): return ProviderOpenAI + case string(ProviderGemini): + return ProviderGemini default: return Provider(strings.ToLower(strings.TrimSpace(string(provider)))) } diff --git a/internal/translation/translator_test.go b/internal/translation/translator_test.go index 1011bfa..d506a1e 100644 --- a/internal/translation/translator_test.go +++ b/internal/translation/translator_test.go @@ -7,23 +7,48 @@ import ( "testing" ) -func TestNewTranslator_DefaultsToGemini(t *testing.T) { +func TestNewTranslator_DefaultsToOpenAI(t *testing.T) { translator := NewTranslator(nil) if translator == nil { t.Fatal("NewTranslator returned nil") } - if translator.provider != ProviderGemini { - t.Fatalf("Expected default provider %q, got %q", ProviderGemini, translator.provider) - } - if translator.geminiModel != defaultGeminiModel { - t.Fatalf("Expected Gemini model %q, got %q", defaultGeminiModel, translator.geminiModel) + if translator.provider != ProviderOpenAI { + t.Fatalf("Expected default provider %q, got %q", ProviderOpenAI, translator.provider) } if translator.openAIModel != "gpt-4o-mini" { t.Fatalf("Expected OpenAI model gpt-4o-mini, got %q", translator.openAIModel) } } +func TestNewTranslator_ExplicitGeminiProvider(t *testing.T) { + translator := NewTranslator(&Config{ + Provider: ProviderGemini, + GoogleAPIKey: "test-google-key", + }) + + if translator == nil { + t.Fatal("NewTranslator returned nil") + } + if translator.provider != ProviderGemini { + t.Fatalf("Expected provider %q, got %q", ProviderGemini, translator.provider) + } + if translator.geminiClient == nil { + t.Fatal("Gemini client not initialized") + } +} + +func TestNewTranslator_EmptyProviderDefaultsToOpenAI(t *testing.T) { + translator := NewTranslator(&Config{}) + + if translator == nil { + t.Fatal("NewTranslator returned nil") + } + if translator.provider != ProviderOpenAI { + t.Fatalf("Expected empty provider to default to %q, got %q", ProviderOpenAI, translator.provider) + } +} + func TestNewTranslator_OpenAIProvider(t *testing.T) { translator := NewTranslator(&Config{ Provider: ProviderOpenAI, @@ -41,7 +66,19 @@ func TestNewTranslator_OpenAIProvider(t *testing.T) { } } -func TestTranslateWord_NoGoogleAPIKey(t *testing.T) { +func TestTranslateWord_DefaultProviderRequiresOpenAIKey(t *testing.T) { + translator := NewTranslator(&Config{}) + + _, err := translator.TranslateWord("ябълка") + if err == nil { + t.Fatal("Expected error for missing OpenAI API key") + } + if err.Error() != "OpenAI API key not found" { + t.Fatalf("Expected 'OpenAI API key not found' error, got: %v", err) + } +} + +func TestTranslateWord_ExplicitGeminiRequiresGoogleAPIKey(t *testing.T) { translator := NewTranslator(&Config{Provider: ProviderGemini}) _, err := translator.TranslateWord("ябълка") @@ -87,6 +124,20 @@ func TestTranslateEnglishToBulgarian_NoOpenAIKey(t *testing.T) { } } +func TestTranslateWithUnknownProvider(t *testing.T) { + translator := NewTranslator(&Config{ + Provider: Provider("legacy"), + }) + + _, err := translator.TranslateWord("ябълка") + if err == nil { + t.Fatal("Expected error for unknown provider") + } + if err.Error() != "unknown translation provider: legacy" { + t.Fatalf("Expected unknown provider error, got: %v", err) + } +} + func TestTranslateEnglishToBulgarian_IntegrationOpenAI(t *testing.T) { apiKey := os.Getenv("OPENAI_API_KEY") if apiKey == "" { |
