{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
module Json.GeoSpec (spec) where

import Data.Aeson (Value)
import Data.Aeson.Lens
import Data.Text (Text)
import Network.Lastfm
import Network.Lastfm.Geo
import Test.Hspec

import SpecHelper


spec :: Spec
spec = do
  it "getEvents" $
    publicly (getEvents <* location "Moscow" <* limit 5)
   `shouldHaveJson`
    key "events".key "event".values.key "id"._String

  describe "get*Artist*" $ do
    let jsonQuery :: Fold Value Text
        jsonQuery = key "topartists".key "artist".values.key "name"._String

    it "getMetroArtistChart" $
      publicly (getMetroArtistChart <*> metro "Saint Petersburg" <*> country "Russia")
     `shouldHaveJson`
      jsonQuery

    it "getMetroHypeArtistChart" $
      publicly (getMetroHypeArtistChart <*> metro "New York" <*> country "United States")
     `shouldHaveJson`
      jsonQuery

    it "getMetroUniqueArtistChart" $
      publicly (getMetroUniqueArtistChart <*> metro "Minsk" <*> country "Belarus")
     `shouldHaveJson`
      jsonQuery

    it "getTopArtists" $
      publicly (getTopArtists <*> country "Belarus" <* limit 3)
     `shouldHaveJson`
      jsonQuery

  it "getMetroWeeklyChartlist" $
    publicly (getMetroWeeklyChartlist <*> metro "Moscow")
   `shouldHaveJson`
    key "weeklychartlist".key "chart".values.key "from"._String

  it "getMetros" $
    publicly (getMetros <* country "Russia")
   `shouldHaveJson`
    key "metros".key "metro".values.key "name"._String

  describe "get*Track*" $ do
    let jsonQuery :: Fold Value Text
        jsonQuery = key "toptracks".key "track".values.key "name"._String

    it "getTopTracks" $
      publicly (getTopTracks <*> country "Ukraine" <* limit 2)
     `shouldHaveJson`
      jsonQuery

    it "getMetroUniqueTrackChart" $
      publicly (getMetroUniqueTrackChart <*> metro "Moscow" <*> country "Russia")
     `shouldHaveJson`
      jsonQuery

    it "getMetroHypeTrackChart" $
      publicly (getMetroHypeTrackChart <*> metro "Moscow" <*> country "Russia")
     `shouldHaveJson`
      jsonQuery

    it "getMetroTrackChart" $
      publicly (getMetroTrackChart <*> metro "Boston" <*> country "United States")
     `shouldHaveJson`
      jsonQuery
