{-# LANGUAGE OverloadedStrings, QuasiQuotes #-} module Types.UserSpec where import Control.Monad (forM_) import Data.Aeson (decode, encode, Value(..)) import Data.Aeson.QQ import qualified Data.HashMap.Lazy as HM import Test.Hspec import Web.Mackerel.Types.User spec :: Spec spec = do let user = User { userId = UserId "abcde", userScreenName = "Example Mackerel", userEmail = "mackerel@example.com" } let json = [aesonQQ| { "id": "abcde", "screenName": "Example Mackerel", "email": "mackerel@example.com" } |] describe "User FromJSON" $ do it "should parse a json" $ decode (encode json) `shouldBe` Just user it "should reject an invalid json" $ do decode "{}" `shouldBe` (Nothing :: Maybe User) let (Object hm) = json forM_ ["id", "screenName", "email"] $ \key -> decode (encode (Object (HM.delete key hm))) `shouldBe` (Nothing :: Maybe User) describe "User ToJSON" $ it "should encode into a json" $ decode (encode user) `shouldBe` Just json