From 3ac3fac317c8a3cddae8de598457e474789638b5 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Sat, 11 Nov 2023 22:40:43 +0100 Subject: [PATCH] Test ListenBrainz client --- backends/listenbrainz/client.go | 6 +- backends/listenbrainz/client_test.go | 32 ++++++ backends/listenbrainz/testdata/listens.json | 115 ++++++++++++++++++++ go.mod | 1 + go.sum | 2 + 5 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 backends/listenbrainz/testdata/listens.json diff --git a/backends/listenbrainz/client.go b/backends/listenbrainz/client.go index b458649..f3a9b77 100644 --- a/backends/listenbrainz/client.go +++ b/backends/listenbrainz/client.go @@ -34,7 +34,7 @@ const DefaultItemsPerGet = 25 const MaxItemsPerGet = 1000 type Client struct { - resty *resty.Client + HttpClient *resty.Client MaxResults int } @@ -45,7 +45,7 @@ func New(token string) Client { resty.SetAuthToken(token) resty.SetHeader("Accept", "application/json") client := Client{ - resty: resty, + HttpClient: resty, MaxResults: DefaultItemsPerGet, } @@ -55,7 +55,7 @@ func New(token string) Client { func (c Client) GetListens(user string, maxTime time.Time, minTime time.Time) (GetListensResult, error) { const path = "/user/{username}/listens" result := &GetListensResult{} - _, err := c.resty.R(). + _, err := c.HttpClient.R(). SetPathParam("username", user). SetQueryParams(map[string]string{ "max_ts": strconv.FormatInt(maxTime.Unix(), 10), diff --git a/backends/listenbrainz/client_test.go b/backends/listenbrainz/client_test.go index b0995d8..7334378 100644 --- a/backends/listenbrainz/client_test.go +++ b/backends/listenbrainz/client_test.go @@ -22,14 +22,46 @@ THE SOFTWARE. package listenbrainz_test import ( + "net/http" "testing" + "time" + "github.com/jarcoal/httpmock" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "go.uploadedlobster.com/scotty/backends/listenbrainz" ) func TestNewClient(t *testing.T) { token := "foobar123" client := listenbrainz.New(token) + assert.Equal(t, token, client.HttpClient.Token) assert.Equal(t, listenbrainz.DefaultItemsPerGet, client.MaxResults) } + +func TestGetListens(t *testing.T) { + defer httpmock.DeactivateAndReset() + + token := "thetoken" + client := listenbrainz.New(token) + setupHttpMock(t, client.HttpClient.GetClient(), + "https://api.listenbrainz.org/1/user/outsidecontext/listens", + "testdata/listens.json") + + result, err := client.GetListens("outsidecontext", time.Now(), time.Now().Add(-2*time.Hour)) + require.NoError(t, err) + + assert := assert.New(t) + assert.Equal(2, result.Payload.Count) + assert.Equal("Shadowplay", result.Payload.Listens[0].TrackMetadata.TrackName) +} + +func setupHttpMock(t *testing.T, client *http.Client, url string, testDataPath string) { + httpmock.ActivateNonDefault(client) + + responder, err := httpmock.NewJsonResponder(200, httpmock.File(testDataPath)) + if err != nil { + t.Fatal(err) + } + httpmock.RegisterResponder("GET", url, responder) +} diff --git a/backends/listenbrainz/testdata/listens.json b/backends/listenbrainz/testdata/listens.json new file mode 100644 index 0000000..c173aad --- /dev/null +++ b/backends/listenbrainz/testdata/listens.json @@ -0,0 +1,115 @@ +{ + "payload": { + "count": 2, + "latest_listen_ts": 1699718723, + "listens": [ + { + "inserted_at": 1699719320, + "listened_at": 1699718723, + "recording_msid": "94794568-ddd5-43be-a770-b6da011c6872", + "track_metadata": { + "additional_info": { + "artist_names": [ + "Joy Division" + ], + "discnumber": 1, + "duration_ms": 242933, + "isrc": "NLEM80819612", + "music_service": "spotify.com", + "origin_url": "https://open.spotify.com/track/4pzYKPOjn1ITfEanoWIvrn", + "recording_msid": "94794568-ddd5-43be-a770-b6da011c6872", + "release_artist_name": "Warsaw", + "release_artist_names": [ + "Warsaw" + ], + "spotify_album_artist_ids": [ + "https://open.spotify.com/artist/0SS65FajB9S7ZILHdNOCsp" + ], + "spotify_album_id": "https://open.spotify.com/album/3kDMRpbBe5eFMMo1pSYFhN", + "spotify_artist_ids": [ + "https://open.spotify.com/artist/432R46LaYsJZV2Gmc4jUV5" + ], + "spotify_id": "https://open.spotify.com/track/4pzYKPOjn1ITfEanoWIvrn", + "submission_client": "listenbrainz", + "tracknumber": 1 + }, + "artist_name": "Joy Division", + "mbid_mapping": { + "artist_mbids": [ + "9a58fda3-f4ed-4080-a3a5-f457aac9fcdd" + ], + "artists": [ + { + "artist_credit_name": "Joy Division", + "artist_mbid": "9a58fda3-f4ed-4080-a3a5-f457aac9fcdd", + "join_phrase": "" + } + ], + "caa_id": 3880053972, + "caa_release_mbid": "d2f506bb-cfb5-327e-b8d6-cf4036c77cfa", + "recording_mbid": "17ddd699-a35f-4f80-8064-9a807ad2799f", + "recording_name": "Shadowplay", + "release_mbid": "d2f506bb-cfb5-327e-b8d6-cf4036c77cfa" + }, + "release_name": "Warsaw", + "track_name": "Shadowplay" + }, + "user_name": "outsidecontext" + }, + { + "inserted_at": 1699718945, + "listened_at": 1699718480, + "recording_msid": "5b6a3471-8f22-414b-a061-e45627ed26b8", + "track_metadata": { + "additional_info": { + "artist_names": [ + "SubRosa" + ], + "discnumber": 1, + "duration_ms": 350760, + "isrc": "USN681110018", + "music_service": "spotify.com", + "origin_url": "https://open.spotify.com/track/0L0oz4yFk5hMmo52qAUQRF", + "recording_msid": "5b6a3471-8f22-414b-a061-e45627ed26b8", + "release_artist_name": "SubRosa", + "release_artist_names": [ + "SubRosa" + ], + "spotify_album_artist_ids": [ + "https://open.spotify.com/artist/4hAqIOkN2Q4apnbcOUUb7h" + ], + "spotify_album_id": "https://open.spotify.com/album/3mYNFe9G85URf09SmoX2sB", + "spotify_artist_ids": [ + "https://open.spotify.com/artist/4hAqIOkN2Q4apnbcOUUb7h" + ], + "spotify_id": "https://open.spotify.com/track/0L0oz4yFk5hMmo52qAUQRF", + "submission_client": "listenbrainz", + "tracknumber": 1 + }, + "artist_name": "SubRosa", + "mbid_mapping": { + "artist_mbids": [ + "aa1c41d7-7836-42d0-8e0e-b5d565767db6" + ], + "artists": [ + { + "artist_credit_name": "SubRosa", + "artist_mbid": "aa1c41d7-7836-42d0-8e0e-b5d565767db6", + "join_phrase": "" + } + ], + "caa_id": 6163307004, + "caa_release_mbid": "eb5dec80-ec5d-49a3-a622-3c02eefa0774", + "recording_mbid": "c2374d60-7bfa-44ef-b5dc-f7bc6004b4a7", + "recording_name": "Borrowed Time, Borrowed Eyes", + "release_mbid": "9fba6ca8-4acb-44a9-951a-6c1fb8511443" + }, + "release_name": "No Help for the Mighty Ones", + "track_name": "Borrowed Time, Borrowed Eyes" + }, + "user_name": "outsidecontext" + } + ], + "user_id": "outsidecontext" + } +} \ No newline at end of file diff --git a/go.mod b/go.mod index 765ecca..7192c42 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/go-resty/resty/v2 v2.10.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jarcoal/httpmock v1.3.1 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect diff --git a/go.sum b/go.sum index 92acfd3..c1d9ba9 100644 --- a/go.sum +++ b/go.sum @@ -126,6 +126,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= +github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=