package deezer import ( "context" "encoding/json" "net/http" "net/http/httptest" "strings" "testing" "streamrip-go/internal/config" ) func TestSearchTrack(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/search/track" { _ = json.NewEncoder(w).Encode(map[string]any{"data": []any{map[string]any{"id": 1, "title": "Dreams", "artist": map[string]any{"name": "Fleetwood Mac"}}}}) return } w.WriteHeader(http.StatusNotFound) })) defer ts.Close() cfgData := config.DefaultConfigData() c := New(&config.Config{File: cfgData, Session: cfgData}) c.loggedIn = true origBase := baseURL baseURL = ts.URL defer func() { baseURL = origBase }() pages, err := c.Search(context.Background(), "track", "dreams", 5) if err != nil { t.Fatalf("Search() error = %v", err) } if len(pages) != 1 { t.Fatalf("pages len = %d, want 1", len(pages)) } } func TestGetDownloadableNativeCipher(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/track/42": _ = json.NewEncoder(w).Encode(map[string]any{"id": 42, "title": "X", "track_token": "tt"}) case "/media": _ = json.NewEncoder(w).Encode(map[string]any{"data": []any{map[string]any{"errors": []any{}, "media": []any{map[string]any{"cipher": map[string]any{"type": "BF_CBC_STRIPE"}, "format": "FLAC", "sources": []any{map[string]any{"url": "https://cdn.example/file"}}}}}}}) default: w.WriteHeader(http.StatusNotFound) } })) defer ts.Close() cfgData := config.DefaultConfigData() cfgData.Deezer.ARL = "arl" c := New(&config.Config{File: cfgData, Session: cfgData}) c.loggedIn = true c.arl = "arl" c.license = "license" origBase := baseURL origMedia := mediaURL baseURL = ts.URL mediaURL = ts.URL + "/media" defer func() { baseURL = origBase mediaURL = origMedia }() d, err := c.GetDownloadable(context.Background(), "42", 2) if err != nil { t.Fatalf("GetDownloadable() error = %v", err) } if d.Cipher != "BF_CBC_STRIPE" || d.Extension != "flac" || d.TrackID != "42" { t.Fatalf("unexpected downloadable: %+v", d) } } func TestGetDownloadableRequiresARL(t *testing.T) { cfgData := config.DefaultConfigData() cfgData.Deezer.ARL = "" c := New(&config.Config{File: cfgData, Session: cfgData}) c.loggedIn = true _, err := c.GetDownloadable(context.Background(), "42", 2) if err == nil || !strings.Contains(strings.ToLower(err.Error()), "arl") { t.Fatalf("expected arl requirement error, got %v", err) } } func TestGetDownloadableDRMError(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/track/42": _ = json.NewEncoder(w).Encode(map[string]any{"id": 42, "title": "X", "track_token": "tt"}) case "/media": _ = json.NewEncoder(w).Encode(map[string]any{"data": []any{map[string]any{"errors": []any{map[string]any{"code": 403, "message": "DRM required"}}, "media": []any{}}}}) default: w.WriteHeader(http.StatusNotFound) } })) defer ts.Close() cfgData := config.DefaultConfigData() cfgData.Deezer.ARL = "arl" c := New(&config.Config{File: cfgData, Session: cfgData}) c.loggedIn = true c.arl = "arl" c.license = "license" origBase := baseURL origMedia := mediaURL baseURL = ts.URL mediaURL = ts.URL + "/media" defer func() { baseURL = origBase mediaURL = origMedia }() _, err := c.GetDownloadable(context.Background(), "42", 2) if err == nil || !strings.Contains(strings.ToLower(err.Error()), "drm") { t.Fatalf("expected drm error, got %v", err) } }