Files
ai-media-hub/backend/services/gemini_test.go
T
AI Assistant 60fdd7842c
build-push / docker (push) Has been cancelled
Optimize backend search and evaluation pipeline
2026-03-16 16:13:43 +09:00

91 lines
2.8 KiB
Go

package services
import (
"net/http"
"net/http/httptest"
"testing"
"time"
)
func TestTranslateQueryFallsBackToGoogleWithoutGeminiKey(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
_, _ = w.Write([]byte(`[[["rainy city street","비 오는 도시 거리",null,null,1]],null,"ko"]`))
}))
defer server.Close()
service := NewGeminiService("")
service.Client = &http.Client{Timeout: 2 * time.Second}
service.TranslateEndpoint = server.URL
translated := service.TranslateQuery("비 오는 도시 거리")
if translated != "rainy city street" {
t.Fatalf("expected google fallback translation, got %q", translated)
}
}
func TestTranslateQueryFallsBackToDictionaryWhenTranslateFails(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "boom", http.StatusBadGateway)
}))
defer server.Close()
service := NewGeminiService("")
service.Client = &http.Client{Timeout: 2 * time.Second}
service.TranslateEndpoint = server.URL
translated := service.TranslateQuery("숲속 커플")
if translated != "forest couple" {
t.Fatalf("expected dictionary fallback translation, got %q", translated)
}
}
func TestNormalizeKnownMediaPhrases(t *testing.T) {
translated := translateKoreanMediaTerms("사이버 펑크 도시")
if translated != "cyberpunk city" {
t.Fatalf("expected cyberpunk city, got %q", translated)
}
}
func TestSelectUnevaluatedCandidatesSkipsReviewedLinks(t *testing.T) {
ranked := []SearchResult{
{Link: "https://a.example"},
{Link: "https://b.example"},
{Link: "https://c.example"},
}
reviewed := map[string]bool{
"https://a.example": true,
}
selected := SelectUnevaluatedCandidates(ranked, reviewed, 2)
if len(selected) != 2 {
t.Fatalf("expected 2 selected candidates, got %d", len(selected))
}
if selected[0].Link != "https://b.example" || selected[1].Link != "https://c.example" {
t.Fatalf("unexpected selection order: %#v", selected)
}
}
func TestRemainingGeminiCapacityShrinksWithReviewedItems(t *testing.T) {
reviewed := []AIRecommendation{
{Link: "https://a.example"},
{Link: "https://b.example"},
}
if got := RemainingGeminiCapacity(reviewed); got != 14 {
t.Fatalf("expected 14 remaining slots, got %d", got)
}
}
func TestGeminiVisualCacheRoundTrip(t *testing.T) {
service := NewGeminiService("")
service.setCachedVisual("image\nhttps://example.com/thumb.jpg", "abc", "image/jpeg", time.Minute)
data, mimeType, ok := service.getCachedVisual("image\nhttps://example.com/thumb.jpg")
if !ok {
t.Fatal("expected visual cache hit")
}
if data != "abc" || mimeType != "image/jpeg" {
t.Fatalf("unexpected cached visual data: %q %q", data, mimeType)
}
}