Files
Mrixs 6312c24b0f Fix Track model to match Python reference
- R128: changed from JSONR128 float64 to R128 struct with i, tp, important_secs fields
  (Python R128 is an object, not a number)
- StorageID -> StorageDir with json tag storage_dir (Python API uses storage_dir)
- Lyrics: replaced TrackLyricsInfo with Lyrics (from supplement/lyrics.py) and
  TrackLyricsInfo (from track/lyrics_info.py with has_available_sync_lyrics,
  has_available_text_lyrics fields)
- Track.Lyrics field now maps to lyrics_info JSON key with TrackLyricsInfo type
2026-10-18 12:34:58 +03:00

137 lines
3.8 KiB
Go

package models
import (
"context"
"testing"
)
// mockRequest implements RequestInterface for testing
type mockRequest struct{}
func (m *mockRequest) Get(ctx context.Context, path string, params map[string]string, result any) error {
return nil
}
func (m *mockRequest) Post(ctx context.Context, path string, body any, result any) error {
return nil
}
func (m *mockRequest) Put(ctx context.Context, path string, body any, result any) error {
return nil
}
func (m *mockRequest) Delete(ctx context.Context, path string, body any, result any) error {
return nil
}
func (m *mockRequest) Download(ctx context.Context, url string) ([]byte, error) {
return nil, nil
}
// mockClient implements ClientInterface for testing
type mockClient struct {
request *mockRequest
}
func (m *mockClient) GetRequest() RequestInterface {
return m.request
}
func newMockClient() *mockClient {
return &mockClient{request: &mockRequest{}}
}
func TestTrack_DeJSON(t *testing.T) {
client := newMockClient()
data := []byte(`{
"id": "123",
"title": "Test Track",
"duration_ms": 180000,
"storage_dir": "456",
"cover_uri": "https://example.com/cover.jpg",
"genre": "rock",
"version": "album",
"explicit": false,
"available": true,
"available_for_premium_users": true,
"r128": -12.5,
"track_sharing_flag": "allowed",
"artists": [{"id": "1", "name": "Artist 1", "cover_uri": "https://example.com/artist.jpg"}],
"albums": [{"id": "789", "title": "Test Album", "cover_uri": "https://example.com/album.jpg", "year": 2023}],
"major": {"id": "major1", "name": "Major Label", "description": "Big label"},
"lyrics_info": {"has_available_sync_lyrics": true, "has_available_text_lyrics": true}
}`)
track := &Track{BaseModel: *NewBaseModel(client)}
result, err := track.DeJSON(data, client)
if err != nil {
t.Fatalf("DeJSON failed: %v", err)
}
resultTrack := result.(*Track)
if resultTrack.ID != "123" {
t.Errorf("Expected ID '123', got '%s'", resultTrack.ID)
}
if resultTrack.Title != "Test Track" {
t.Errorf("Expected Title 'Test Track', got '%s'", resultTrack.Title)
}
if resultTrack.DurationMs != 180000 {
t.Errorf("Expected DurationMs 180000, got %d", resultTrack.DurationMs)
}
if len(resultTrack.Artists) != 1 {
t.Errorf("Expected 1 artist, got %d", len(resultTrack.Artists))
}
if resultTrack.Major == nil || resultTrack.Major.Name != "Major Label" {
t.Errorf("Expected Major 'Major Label'")
}
if resultTrack.LyricsInfo == nil || resultTrack.LyricsInfo.HasAvailableSyncLyrics != true {
t.Errorf("Expected LyricsInfo.HasAvailableSyncLyrics true")
}
}
func TestTrack_DeList(t *testing.T) {
client := newMockClient()
data := []byte(`[
{"id": "1", "title": "Track 1", "duration_ms": 100000},
{"id": "2", "title": "Track 2", "duration_ms": 200000}
]`)
track := &Track{BaseModel: *NewBaseModel(client)}
result, err := track.DeList(data, client)
if err != nil {
t.Fatalf("DeList failed: %v", err)
}
if len(result) != 2 {
t.Errorf("Expected 2 tracks, got %d", len(result))
}
}
func TestTrack_GetDownloadInfo(t *testing.T) {
client := newMockClient()
track := &Track{
BaseModel: *NewBaseModel(client),
DownloadInfo: []DownloadInfo{
{Quality: "mp3", Codec: "mp3", Bitrate: 320, Size: 5000000, URL: "https://example.com/track.mp3"},
{Quality: "flac", Codec: "flac", Bitrate: 1411, Size: 25000000, URL: "https://example.com/track.flac"},
},
}
info := track.GetDownloadInfo("mp3")
if info == nil {
t.Fatal("Expected mp3 download info")
}
if info.Bitrate != 320 {
t.Errorf("Expected bitrate 320, got %d", info.Bitrate)
}
info = track.GetDownloadInfo("flac")
if info == nil {
t.Fatal("Expected flac download info")
}
if info.Bitrate != 1411 {
t.Errorf("Expected bitrate 1411, got %d", info.Bitrate)
}
info = track.GetDownloadInfo("ogg")
if info != nil {
t.Errorf("Expected nil for ogg, got %v", info)
}
}