diff options
Diffstat (limited to 'internal/phonetic/fetcher_test.go')
| -rw-r--r-- | internal/phonetic/fetcher_test.go | 75 |
1 files changed, 72 insertions, 3 deletions
diff --git a/internal/phonetic/fetcher_test.go b/internal/phonetic/fetcher_test.go index 7fa74e8..0b92657 100644 --- a/internal/phonetic/fetcher_test.go +++ b/internal/phonetic/fetcher_test.go @@ -2,6 +2,7 @@ package phonetic import ( "context" + "errors" "os" "path/filepath" "testing" @@ -10,15 +11,15 @@ import ( "google.golang.org/genai" ) -func TestNewFetcher_DefaultsToOpenAI(t *testing.T) { +func TestNewFetcher_DefaultsToGemini(t *testing.T) { fetcher := NewFetcher(nil) if fetcher == nil { t.Fatal("NewFetcher returned nil") } - if got := fetcher.Provider(); got != ProviderOpenAI { - t.Fatalf("expected default provider %q, got %q", ProviderOpenAI, got) + if got := fetcher.Provider(); got != ProviderGemini { + t.Fatalf("expected default provider %q, got %q", ProviderGemini, got) } } @@ -241,3 +242,71 @@ func TestFetchAndSave_GeminiAPIFailure(t *testing.T) { t.Fatalf("unexpected Gemini API error: %v", err) } } + +func TestNormalizeGeminiPhoneticResponse(t *testing.T) { + t.Run("extracts bracketed ipa from prose", func(t *testing.T) { + got, err := normalizeGeminiPhoneticResponse("IPA: [ˈkotka]") + if err != nil { + t.Fatalf("normalizeGeminiPhoneticResponse() unexpected error: %v", err) + } + if got != "[ˈkotka]" { + t.Fatalf("normalizeGeminiPhoneticResponse() = %q, want %q", got, "[ˈkotka]") + } + }) + + t.Run("strips markdown fences", func(t *testing.T) { + got, err := normalizeGeminiPhoneticResponse("```text\n[ˈjabəɫkɐ]\n```") + if err != nil { + t.Fatalf("normalizeGeminiPhoneticResponse() unexpected error: %v", err) + } + if got != "[ˈjabəɫkɐ]" { + t.Fatalf("normalizeGeminiPhoneticResponse() = %q, want %q", got, "[ˈjabəɫkɐ]") + } + }) + + t.Run("empty response is retryable", func(t *testing.T) { + _, err := normalizeGeminiPhoneticResponse(" ") + if !errors.Is(err, errNoGeminiPhoneticResponse) { + t.Fatalf("normalizeGeminiPhoneticResponse() error = %v, want %v", err, errNoGeminiPhoneticResponse) + } + }) +} + +func TestFetch_GeminiProviderRetriesEmptyResponse(t *testing.T) { + originalFetch := fetchGeminiPhonetic + attempts := 0 + fetchGeminiPhonetic = func(context.Context, *genai.Client, string) (string, error) { + attempts++ + if attempts < 3 { + return "", errNoGeminiPhoneticResponse + } + return "[ˈkotka]", nil + } + t.Cleanup(func() { + fetchGeminiPhonetic = originalFetch + }) + + originalNewGeminiClient := newGeminiClient + newGeminiClient = func(context.Context, *genai.ClientConfig) (*genai.Client, error) { + return &genai.Client{}, nil + } + t.Cleanup(func() { + newGeminiClient = originalNewGeminiClient + }) + + fetcher := NewFetcher(&Config{ + Provider: ProviderGemini, + GoogleAPIKey: "test-google-key", + }) + + got, err := fetcher.Fetch("котка") + if err != nil { + t.Fatalf("Fetch failed: %v", err) + } + if got != "[ˈkotka]" { + t.Fatalf("unexpected phonetic content %q", got) + } + if attempts != phoneticRetryCount { + t.Fatalf("attempt count = %d, want %d", attempts, phoneticRetryCount) + } +} |
