search-cli/internal/adapters/serper_test.go

90 lines
2.1 KiB
Go
Raw Permalink Normal View History

2024-12-07 11:08:15 +00:00
package adapters
import (
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"testing"
)
func setupMockServer(t *testing.T, expectedResponse interface{}) *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Verify request
if r.Method != "POST" {
t.Errorf("Expected POST request, got %s", r.Method)
}
if r.Header.Get("X-API-KEY") != "test-key" {
t.Errorf("Expected API key header, got %s", r.Header.Get("X-API-KEY"))
}
json.NewEncoder(w).Encode(expectedResponse)
}))
}
func TestSerperProvider_Search(t *testing.T) {
mockServer := NewTestServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Verify request
if r.Method != "POST" {
t.Errorf("Expected POST request, got %s", r.Method)
}
if r.Header.Get("X-API-KEY") != "test-key" {
t.Errorf("Expected API key header, got %s", r.Header.Get("X-API-KEY"))
}
// Return mock response
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{
"organic": [
{
"link": "https://example.com",
"snippet": "Example content"
}
]
}`))
}))
defer mockServer.Close()
// Set test environment
oldKey := os.Getenv("SERPER_API_KEY")
os.Setenv("SERPER_API_KEY", "test-key")
defer os.Setenv("SERPER_API_KEY", oldKey)
provider, err := NewSerperProvider()
if err != nil {
t.Fatalf("Failed to create provider: %v", err)
}
provider.baseURL = mockServer.URL
results, err := provider.Search("test query", nil)
if err != nil {
t.Fatalf("Search failed: %v", err)
}
// Verify results
if len(results.Results) != 1 {
t.Errorf("Expected 1 result, got %d", len(results.Results))
}
expected := SearchResult{
URL: "https://example.com",
Content: "Example content",
}
if results.Results[0] != expected {
t.Errorf("Expected %+v, got %+v", expected, results.Results[0])
}
}
func TestSerperProvider_NoAPIKey(t *testing.T) {
// Clear API key
oldKey := os.Getenv("SERPER_API_KEY")
os.Unsetenv("SERPER_API_KEY")
defer os.Setenv("SERPER_API_KEY", oldKey)
_, err := NewSerperProvider()
if err == nil {
t.Error("Expected error when no API key is set")
}
}