128 lines
3.5 KiB
Go
128 lines
3.5 KiB
Go
package trakt
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
)
|
|
|
|
func TestGetCollectionPresetTrendingSendsHeadersAndDecodesMovies(t *testing.T) {
|
|
var gotAPIKey, gotVersion string
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
gotAPIKey = r.Header.Get("trakt-api-key")
|
|
gotVersion = r.Header.Get("trakt-api-version")
|
|
if r.URL.Path != "/movies/trending" {
|
|
t.Fatalf("path = %s, want /movies/trending", r.URL.Path)
|
|
}
|
|
writeJSON(t, w, []map[string]any{{
|
|
"watchers": 3,
|
|
"movie": map[string]any{
|
|
"title": "The Matrix",
|
|
"year": 1999,
|
|
"ids": map[string]any{
|
|
"trakt": 1,
|
|
"tmdb": 603,
|
|
"imdb": "tt0133093",
|
|
},
|
|
},
|
|
}})
|
|
}))
|
|
defer server.Close()
|
|
|
|
client := NewClient("client-id", 1000)
|
|
client.SetBaseURL(server.URL)
|
|
|
|
results, err := client.GetCollectionPreset(context.Background(), "trending", "movie", 1, "")
|
|
if err != nil {
|
|
t.Fatalf("GetCollectionPreset: %v", err)
|
|
}
|
|
if gotAPIKey != "client-id" || gotVersion != "2" {
|
|
t.Fatalf("headers api=%q version=%q", gotAPIKey, gotVersion)
|
|
}
|
|
if len(results) != 1 || results[0].Title != "The Matrix" || results[0].TMDBID != 603 || results[0].IMDbID != "tt0133093" {
|
|
t.Fatalf("results = %+v", results)
|
|
}
|
|
}
|
|
|
|
func TestGetCollectionPresetRecommendedUsesBearerToken(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.URL.Path != "/recommendations/shows" {
|
|
t.Fatalf("path = %s, want /recommendations/shows", r.URL.Path)
|
|
}
|
|
if got := r.Header.Get("Authorization"); got != "Bearer token" {
|
|
t.Fatalf("Authorization = %q", got)
|
|
}
|
|
writeJSON(t, w, []map[string]any{{
|
|
"title": "The Expanse",
|
|
"year": 2015,
|
|
"ids": map[string]any{
|
|
"trakt": 2,
|
|
"tvdb": 280619,
|
|
"tmdb": 63639,
|
|
"imdb": "tt3230854",
|
|
},
|
|
}})
|
|
}))
|
|
defer server.Close()
|
|
|
|
client := NewClient("client-id", 1000)
|
|
client.SetBaseURL(server.URL)
|
|
|
|
results, err := client.GetCollectionPreset(context.Background(), "recommended", "tv", 1, "token")
|
|
if err != nil {
|
|
t.Fatalf("GetCollectionPreset: %v", err)
|
|
}
|
|
if len(results) != 1 || results[0].MediaType != "tv" || results[0].TVDBID != 280619 {
|
|
t.Fatalf("results = %+v", results)
|
|
}
|
|
}
|
|
|
|
func TestGetCollectionPresetRejectsRecommendedWithoutToken(t *testing.T) {
|
|
client := NewClient("client-id", 1000)
|
|
if _, err := client.GetCollectionPreset(context.Background(), "recommended", "movie", 1, ""); err == nil {
|
|
t.Fatal("expected error")
|
|
}
|
|
}
|
|
|
|
func TestGetCollectionPresetRetriesRateLimit(t *testing.T) {
|
|
attempts := 0
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
|
|
attempts++
|
|
if attempts == 1 {
|
|
w.Header().Set("Retry-After", "1")
|
|
w.WriteHeader(http.StatusTooManyRequests)
|
|
return
|
|
}
|
|
writeJSON(t, w, []map[string]any{{
|
|
"title": "Popular",
|
|
"year": 2026,
|
|
"ids": map[string]any{
|
|
"trakt": 3,
|
|
"tmdb": 10,
|
|
},
|
|
}})
|
|
}))
|
|
defer server.Close()
|
|
|
|
client := NewClient("client-id", 1000)
|
|
client.SetBaseURL(server.URL)
|
|
|
|
results, err := client.GetCollectionPreset(context.Background(), "popular", "movie", 1, "")
|
|
if err != nil {
|
|
t.Fatalf("GetCollectionPreset: %v", err)
|
|
}
|
|
if attempts != 2 || len(results) != 1 {
|
|
t.Fatalf("attempts=%d results=%+v", attempts, results)
|
|
}
|
|
}
|
|
|
|
func writeJSON(t *testing.T, w http.ResponseWriter, v any) {
|
|
t.Helper()
|
|
w.Header().Set("Content-Type", "application/json")
|
|
if err := json.NewEncoder(w).Encode(v); err != nil {
|
|
t.Fatalf("encode response: %v", err)
|
|
}
|
|
}
|