package subsonic import ( "encoding/json" "io" "net/http" "net/http/httptest" "os" "testing" ) func TestParseRandomSongsJSON(t *testing.T) { // Open the test JSON file file, err := os.Open("testdata/random_songs_response.json") if err != nil { t.Fatalf("Failed to open test file: %v", err) } defer file.Close() // Read the file content jsonData, err := io.ReadAll(file) if err != nil { t.Fatalf("Failed to read test file: %v", err) } // Parse JSON into Response struct var respWrapper struct { SubsonicResponse Response `json:"subsonic-response"` } err = json.Unmarshal(jsonData, &respWrapper) if err != nil { t.Fatalf("Failed to parse JSON: %v", err) } resp := respWrapper.SubsonicResponse // Verify the Response fields if resp.Status != "ok" { t.Errorf("Expected status 'ok', got '%s'", resp.Status) } if resp.Version != "1.16.1" { t.Errorf("Expected version '1.16.1', got '%s'", resp.Version) } if resp.Type != "navidrome" { t.Errorf("Expected type 'navidrome', got '%s'", resp.Type) } if resp.ServerVersion != "0.55.2 (a057a680)" { t.Errorf("Expected serverVersion '0.55.2 (a057a680)', got '%s'", resp.ServerVersion) } if !resp.OpenSubsonic { t.Error("Expected openSubsonic to be true") } // Verify RandomSong data if resp.RandomSong == nil { t.Fatal("RandomSong is nil, expected data") } // We should have 2 songs in our test data if len(resp.RandomSong.Song) != 2 { t.Fatalf("Expected 2 songs, got %d", len(resp.RandomSong.Song)) } // Check the first song song1 := resp.RandomSong.Song[0] if song1.ID != "WxADUtZQmq1rvWMKRteTvh" { t.Errorf("Expected song ID 'WxADUtZQmq1rvWMKRteTvh', got '%s'", song1.ID) } if song1.Title != "The First Book (Extended)" { t.Errorf("Expected song title 'The First Book (Extended)', got '%s'", song1.Title) } if song1.Artist != "桜庭統" { t.Errorf("Expected artist '桜庭統', got '%s'", song1.Artist) } if song1.Album != "Golden Sun" { t.Errorf("Expected album 'Golden Sun', got '%s'", song1.Album) } if song1.Duration != 377 { t.Errorf("Expected duration 377, got %d", song1.Duration) } if song1.Path != "桜庭統/Golden Sun/01-02 - The First Book (Extended).mp3" { t.Errorf("Expected path '桜庭統/Golden Sun/01-02 - The First Book (Extended).mp3', got '%s'", song1.Path) } // Check nested structures if len(song1.Genres) != 1 { t.Errorf("Expected 1 genre, got %d", len(song1.Genres)) } else if song1.Genres[0].Name != "Game Soundtrack" { t.Errorf("Expected genre 'Game Soundtrack', got '%s'", song1.Genres[0].Name) } // Check second song song2 := resp.RandomSong.Song[1] if song2.ID != "1LuCYVkmVmNfmJgc8orwCi" { t.Errorf("Expected song ID '1LuCYVkmVmNfmJgc8orwCi', got '%s'", song2.ID) } if song2.Title != "Divine Beast Vah Ruta Battle" { t.Errorf("Expected song title 'Divine Beast Vah Ruta Battle', got '%s'", song2.Title) } if song2.Artist != "Yasuaki Iwata" { t.Errorf("Expected artist 'Yasuaki Iwata', got '%s'", song2.Artist) } } func TestMakeRequest(t *testing.T) { // Create a test server that returns our test JSON testFile, err := os.ReadFile("testdata/random_songs_response.json") if err != nil { t.Fatalf("Failed to read test file: %v", err) } server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) w.Write(testFile) })) defer server.Close() // Create a client using our test server URL client := &Client{ baseURL: server.URL, username: "testuser", password: "testpass", version: "1.16.1", httpClient: &http.Client{}, } // Test the GetRandomSongs method which uses makeRequest songs, err := client.GetRandomSongs(10) if err != nil { t.Fatalf("GetRandomSongs failed: %v", err) } // Verify we got some songs back if len(songs) != 2 { t.Errorf("Expected 2 songs, got %d", len(songs)) } // Check that the song data was parsed correctly if songs[0].Title != "The First Book (Extended)" { t.Errorf("Expected song title 'The First Book (Extended)', got '%s'", songs[0].Title) } if songs[1].Title != "Divine Beast Vah Ruta Battle" { t.Errorf("Expected song title 'Divine Beast Vah Ruta Battle', got '%s'", songs[1].Title) } }