packages feed

liblastfm-0.1.1.2: tests/Library.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE UnicodeSyntax #-}
module Library (auth, noauth) where

import Data.Aeson.Types
import Network.Lastfm
import Network.Lastfm.Library
import Test.Framework
import Test.Framework.Providers.HUnit

import Common


auth ∷ Request JSON Sign APIKey → Request JSON Sign SessionKey → Secret → [Test]
auth ak sk s =
  [ testCase "Library.addAlbum" testAddAlbum
  , testCase "Library.addArtist" testAddArtist
  , testCase "Library.addTrack" testAddTrack
  , testCase "Library.removeAlbum" testRemoveAlbum
  , testCase "Library.removeArtist" testRemoveArtist
  , testCase "Library.removeTrack" testRemoveTrack
  , testCase "Library.removeScrobble" testRemoveScrobble
  ]
 where
  testAddAlbum = check ok . sign s $
    addAlbum <*> artist "Franz Ferdinand" <*> album "Franz Ferdinand" <*> ak <*> sk

  testAddArtist = check ok . sign s $
    addArtist <*> artist "Mobthrow" <*> ak <*> sk

  testAddTrack = check ok . sign s $
    addTrack <*> artist "Eminem" <*> track "Kim" <*> ak <*> sk

  testRemoveAlbum = check ok . sign s $
    removeAlbum <*> artist "Franz Ferdinand" <*> album "Franz Ferdinand" <*> ak <*> sk

  testRemoveArtist = check ok . sign s $
    removeArtist <*> artist "Burzum" <*> ak <*> sk

  testRemoveTrack = check ok . sign s $
    removeTrack <*> artist "Eminem" <*> track "Kim" <*> ak <*> sk

  testRemoveScrobble = check ok . sign s $
    removeScrobble <*> artist "Gojira" <*> track "Ocean" <*> timestamp 1328905590 <*> ak <*> sk


noauth ∷ Request JSON Send APIKey → [Test]
noauth ak =
  [ testCase "Library.getAlbums" testGetAlbums
  , testCase "Library.getArtists" testGetArtists
  , testCase "Library.getTracks" testGetTracks
  ]
 where
  testGetAlbums = check ga $
    getAlbums <*> user "smpcln" <* artist "Burzum" <* limit 5 <*> ak

  testGetArtists = check gar $
    getArtists <*> user "smpcln" <* limit 7 <*> ak

  testGetTracks = check gt $
    getTracks <*> user "smpcln" <* artist "Burzum" <* limit 4 <*> ak


ga, gar, gt ∷ Value → Parser [String]
ga o = parseJSON o >>= (.: "albums") >>= (.: "album") >>= mapM (.: "name")
gar o = parseJSON o >>= (.: "artists") >>= (.: "artist") >>= mapM (.: "name")
gt o = parseJSON o >>= (.: "tracks") >>= (.: "track") >>= mapM (.: "name")