2021-05-27 22:14:24 +02:00
package agents
import (
2021-05-28 03:04:03 +02:00
"bytes"
2021-05-27 22:14:24 +02:00
"context"
2021-05-28 02:53:24 +02:00
"errors"
2021-05-28 03:04:03 +02:00
"io/ioutil"
2021-05-28 02:53:24 +02:00
"net/http"
"os"
"github.com/navidrome/navidrome/tests"
"github.com/navidrome/navidrome/utils/lastfm"
2021-05-27 22:14:24 +02:00
"github.com/navidrome/navidrome/conf"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
2021-05-28 03:04:03 +02:00
const (
lastfmError3 = ` { "error":3,"message":"Invalid Method - No method with that name in this package","links":[]} `
lastfmError6 = ` { "error":6,"message":"The artist you supplied could not be found","links":[]} `
)
2021-05-27 22:14:24 +02:00
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" ) )
} )
} )
2021-05-28 02:53:24 +02:00
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. <a href=\"https://www.last.fm/music/U2\">Read more on Last.fm</a>" ) )
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 ( ) {
2021-05-28 03:04:03 +02:00
httpClient . Res = http . Response { Body : ioutil . NopCloser ( bytes . NewBufferString ( lastfmError3 ) ) , StatusCode : 200 }
2021-05-28 02:53:24 +02:00
_ , 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 ( ) {
2021-05-28 03:04:03 +02:00
httpClient . Res = http . Response { Body : ioutil . NopCloser ( bytes . NewBufferString ( lastfmError6 ) ) , StatusCode : 200 }
2021-05-28 02:53:24 +02:00
_ , _ = 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 ( ) {
2021-05-28 03:04:03 +02:00
httpClient . Res = http . Response { Body : ioutil . NopCloser ( bytes . NewBufferString ( lastfmError3 ) ) , StatusCode : 200 }
2021-05-28 02:53:24 +02:00
_ , 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 ( ) {
2021-05-28 03:04:03 +02:00
httpClient . Res = http . Response { Body : ioutil . NopCloser ( bytes . NewBufferString ( lastfmError6 ) ) , StatusCode : 200 }
2021-05-28 02:53:24 +02:00
_ , _ = 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 ( ) {
2021-05-28 03:04:03 +02:00
httpClient . Res = http . Response { Body : ioutil . NopCloser ( bytes . NewBufferString ( lastfmError3 ) ) , StatusCode : 200 }
2021-05-28 02:53:24 +02:00
_ , 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 ( ) {
2021-05-28 03:04:03 +02:00
httpClient . Res = http . Response { Body : ioutil . NopCloser ( bytes . NewBufferString ( lastfmError6 ) ) , StatusCode : 200 }
2021-05-28 02:53:24 +02:00
_ , _ = agent . GetTopSongs ( "123" , "U2" , "mbid-1234" , 2 )
Expect ( httpClient . RequestCount ) . To ( Equal ( 2 ) )
Expect ( httpClient . SavedRequest . URL . Query ( ) . Get ( "mbid" ) ) . To ( BeEmpty ( ) )
} )
} )
} )
2021-05-27 22:14:24 +02:00
} )