package genius import ( "context" "io" "net/http" "strings" "testing" "github.com/stretchr/testify/require" ) func TestMatchSong(t *testing.T) { songs := []Song{ {ID: 1, Title: "Alright (Live)", Artist: Artist{Name: "Kendrick Lamar"}}, {ID: 2, Title: "Alright!", Artist: Artist{Name: "Kendrick Lamar"}}, {ID: 3, Title: "Alright", Artist: Artist{Name: "Someone Else"}}, } got, ok := matchSong(songs, "kendrick-lamar", "Alright") require.True(t, ok) require.Equal(t, int64(2), got.ID) _, ok = matchSong(append(songs, Song{ID: 4, Title: "Alright", Artist: Artist{Name: "Kendrick Lamar"}}), "Kendrick Lamar", "Alright") require.False(t, ok) _, ok = matchSong(songs, "Kendrick Lamar", "Alright Remix") require.False(t, ok) } func TestImageURL(t *testing.T) { require.Equal(t, "https://images.genius.com/cover.jpg", imageURL("https://images.genius.com/cover.jpg")) require.Equal(t, "https://images.rapgenius.com/a.png", imageURL("https://images.rapgenius.com/a.png")) for _, raw := range []string{ "http://images.genius.com/a.jpg", "https://evil.test/a.jpg", "https://images.genius.com/default_avatar.png", "https://user@images.genius.com/a.jpg", "", } { require.Empty(t, imageURL(raw)) } song := Song{ ImageURL: "https://images.genius.com/default_cover_image.png", ThumbURL: "https://images.genius.com/song.jpg", Artist: Artist{ImageURL: "https://images.genius.com/artist.jpg"}, } song.Album.ImageURL = "https://images.genius.com/album.jpg" songImage, artistImage, albumImage := songArtwork(song) require.Equal(t, "https://images.genius.com/song.jpg", songImage) require.Equal(t, "https://images.genius.com/artist.jpg", artistImage) require.Equal(t, "https://images.genius.com/album.jpg", albumImage) } func TestSongAndArtist(t *testing.T) { c := New("secret") c.http.Transport = transportFunc(func(r *http.Request) (*http.Response, error) { require.Equal(t, "Bearer secret", r.Header.Get("Authorization")) body := `{"response":{"artist":{"id":9,"name":"Artist","image_url":"https://images.genius.com/artist.jpg"}}}` if strings.Contains(r.URL.Path, "/songs/") { require.Equal(t, "plain", r.URL.Query().Get("text_format")) body = `{"response":{"song":{"id":12,"title":"Example","url":"https://genius.com/example-lyrics","song_art_image_url":"https://images.genius.com/song.jpg","primary_artist":{"id":9,"name":"Artist"},"album":{"name":"Album","cover_art_url":"https://images.genius.com/album.jpg"},"description":{"plain":"About the song"}}}}` } return &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body)), Header: make(http.Header)}, nil }) song, err := c.Song(context.Background(), 12) require.NoError(t, err) require.Equal(t, "About the song", song.Description.Plain) require.Equal(t, "Album", song.Album.Name) artist, err := c.Artist(context.Background(), 9) require.NoError(t, err) require.Equal(t, "https://images.genius.com/artist.jpg", artist.ImageURL) _, err = c.Song(context.Background(), 0) require.Error(t, err) } func TestAnnotations(t *testing.T) { c := New("secret") pages := 0 one := `{"id":1,"fragment":"line","annotations":[{"body":{"plain":"means this"},"url":"https://genius.com/annotations/1","verified":true,"authors":[{"user":{"name":"Editor"}}]}]}` full := `{"response":{"referents":[` + strings.TrimRight(strings.Repeat(one+",", 50), ",") + `]}}` c.http.Transport = transportFunc(func(r *http.Request) (*http.Response, error) { pages++ require.Equal(t, "plain", r.URL.Query().Get("text_format")) body := full if pages > 1 { body = `{"response":{"referents":[` + one + `]}}` } return &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body)), Header: make(http.Header)}, nil }) notes, err := c.Annotations(context.Background(), 12) require.NoError(t, err) require.Equal(t, 2, pages) require.Len(t, notes, 50) require.Equal(t, "line", notes[0].Fragment) require.Equal(t, "means this", notes[0].Text) require.Equal(t, "Editor", notes[0].Authors) require.True(t, notes[0].Verified) require.Equal(t, "https://genius.com/annotations/1", notes[0].Url) }