package agents import ( "context" "errors" "net/http" "os" "github.com/navidrome/navidrome/tests" "github.com/navidrome/navidrome/utils/lastfm" "github.com/navidrome/navidrome/conf" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("lastfmAgent", func() { Describe("lastFMConstructor", func() { It("uses default api key and language if not configured", func() { conf.Server.LastFM.ApiKey = "" agent := lastFMConstructor(context.TODO()) Expect(agent.(*lastfmAgent).apiKey).To(Equal(lastFMAPIKey)) Expect(agent.(*lastfmAgent).lang).To(Equal("en")) }) It("uses configured api key and language", func() { conf.Server.LastFM.ApiKey = "123" conf.Server.LastFM.Language = "pt" agent := lastFMConstructor(context.TODO()) Expect(agent.(*lastfmAgent).apiKey).To(Equal("123")) Expect(agent.(*lastfmAgent).lang).To(Equal("pt")) }) }) Describe("GetBiography", func() { var agent *lastfmAgent var httpClient *tests.FakeHttpClient BeforeEach(func() { httpClient = &tests.FakeHttpClient{} client := lastfm.NewClient("API_KEY", "pt", httpClient) agent = lastFMConstructor(context.TODO()).(*lastfmAgent) agent.client = client }) It("returns the biography", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.getinfo.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} Expect(agent.GetBiography("123", "U2", "mbid-1234")).To(Equal("U2 é uma das mais importantes bandas de rock de todos os tempos. Formada em 1976 em Dublin, composta por Bono (vocalista e guitarrista), The Edge (guitarrista, pianista e backing vocal), Adam Clayton (baixista), Larry Mullen, Jr. (baterista e percussionista).\n\nDesde a década de 80, U2 é uma das bandas mais populares no mundo. Seus shows são únicos e um verdadeiro festival de efeitos especiais, além de serem um dos que mais arrecadam anualmente. Read more on Last.fm")) Expect(httpClient.RequestCount).To(Equal(1)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(Equal("mbid-1234")) }) It("returns an error if Last.FM call fails", func() { httpClient.Err = errors.New("error") _, err := agent.GetBiography("123", "U2", "mbid-1234") Expect(err).To(HaveOccurred()) Expect(httpClient.RequestCount).To(Equal(1)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(Equal("mbid-1234")) }) It("returns an error if Last.FM call returns an error", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.error3.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} _, err := agent.GetBiography("123", "U2", "mbid-1234") Expect(err).To(HaveOccurred()) Expect(httpClient.RequestCount).To(Equal(1)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(Equal("mbid-1234")) }) Context("MBID not existent in Last.FM", func() { It("calls again when the response is artist == [unknown]", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.getinfo.unknown.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} _, _ = agent.GetBiography("123", "U2", "mbid-1234") Expect(httpClient.RequestCount).To(Equal(2)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(BeEmpty()) }) It("calls again when last.fm returns an error 6", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.error6.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} _, _ = agent.GetBiography("123", "U2", "mbid-1234") Expect(httpClient.RequestCount).To(Equal(2)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(BeEmpty()) }) }) }) Describe("GetSimilar", func() { var agent *lastfmAgent var httpClient *tests.FakeHttpClient BeforeEach(func() { httpClient = &tests.FakeHttpClient{} client := lastfm.NewClient("API_KEY", "pt", httpClient) agent = lastFMConstructor(context.TODO()).(*lastfmAgent) agent.client = client }) It("returns similar artists", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.getsimilar.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} Expect(agent.GetSimilar("123", "U2", "mbid-1234", 2)).To(Equal([]Artist{ {Name: "Passengers", MBID: "e110c11f-1c94-4471-a350-c38f46b29389"}, {Name: "INXS", MBID: "481bf5f9-2e7c-4c44-b08a-05b32bc7c00d"}, })) Expect(httpClient.RequestCount).To(Equal(1)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(Equal("mbid-1234")) }) It("returns an error if Last.FM call fails", func() { httpClient.Err = errors.New("error") _, err := agent.GetSimilar("123", "U2", "mbid-1234", 2) Expect(err).To(HaveOccurred()) Expect(httpClient.RequestCount).To(Equal(1)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(Equal("mbid-1234")) }) It("returns an error if Last.FM call returns an error", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.error3.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} _, err := agent.GetSimilar("123", "U2", "mbid-1234", 2) Expect(err).To(HaveOccurred()) Expect(httpClient.RequestCount).To(Equal(1)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(Equal("mbid-1234")) }) Context("MBID not existent in Last.FM", func() { It("calls again when the response is artist == [unknown]", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.getsimilar.unknown.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} _, _ = agent.GetSimilar("123", "U2", "mbid-1234", 2) Expect(httpClient.RequestCount).To(Equal(2)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(BeEmpty()) }) It("calls again when last.fm returns an error 6", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.error6.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} _, _ = agent.GetSimilar("123", "U2", "mbid-1234", 2) Expect(httpClient.RequestCount).To(Equal(2)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(BeEmpty()) }) }) }) Describe("GetTopSongs", func() { var agent *lastfmAgent var httpClient *tests.FakeHttpClient BeforeEach(func() { httpClient = &tests.FakeHttpClient{} client := lastfm.NewClient("API_KEY", "pt", httpClient) agent = lastFMConstructor(context.TODO()).(*lastfmAgent) agent.client = client }) It("returns top songs", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.gettoptracks.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} Expect(agent.GetTopSongs("123", "U2", "mbid-1234", 2)).To(Equal([]Song{ {Name: "Beautiful Day", MBID: "f7f264d0-a89b-4682-9cd7-a4e7c37637af"}, {Name: "With or Without You", MBID: "6b9a509f-6907-4a6e-9345-2f12da09ba4b"}, })) Expect(httpClient.RequestCount).To(Equal(1)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(Equal("mbid-1234")) }) It("returns an error if Last.FM call fails", func() { httpClient.Err = errors.New("error") _, err := agent.GetTopSongs("123", "U2", "mbid-1234", 2) Expect(err).To(HaveOccurred()) Expect(httpClient.RequestCount).To(Equal(1)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(Equal("mbid-1234")) }) It("returns an error if Last.FM call returns an error", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.error3.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} _, err := agent.GetTopSongs("123", "U2", "mbid-1234", 2) Expect(err).To(HaveOccurred()) Expect(httpClient.RequestCount).To(Equal(1)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(Equal("mbid-1234")) }) Context("MBID not existent in Last.FM", func() { It("calls again when the response is artist == [unknown]", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.gettoptracks.unknown.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} _, _ = agent.GetTopSongs("123", "U2", "mbid-1234", 2) Expect(httpClient.RequestCount).To(Equal(2)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(BeEmpty()) }) It("calls again when last.fm returns an error 6", func() { f, _ := os.Open("tests/fixtures/lastfm.artist.error6.json") httpClient.Res = http.Response{Body: f, StatusCode: 200} _, _ = agent.GetTopSongs("123", "U2", "mbid-1234", 2) Expect(httpClient.RequestCount).To(Equal(2)) Expect(httpClient.SavedRequest.URL.Query().Get("mbid")).To(BeEmpty()) }) }) }) })