packages feed

mackerel-client-0.3.0: test/Types/InvitationSpec.hs

{-# LANGUAGE OverloadedStrings, QuasiQuotes #-}
module Types.InvitationSpec 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.Authority
import Web.Mackerel.Types.Invitation

spec :: Spec
spec = do

  let invitation' = Invitation {
        invitationEmail = "foobar@example.com",
        invitationAuthority = AuthorityManager,
        invitationExpiresAt = 1492393387
      }

  let json = [aesonQQ|
    {
      "email": "foobar@example.com",
      "authority": "manager",
      "expiresAt": 1492393387
    }
  |]

  describe "Invitation FromJSON" $ do
    it "should parse a json" $
      decode (encode json) `shouldBe` Just invitation'

    it "should reject an invalid json" $ do
      decode "{}" `shouldBe` (Nothing :: Maybe Invitation)
      let (Object hm) = json
      forM_ ["email", "authority", "expiresAt"] $ \key ->
        decode (encode (Object (HM.delete key hm))) `shouldBe` (Nothing :: Maybe Invitation)

  describe "Invitation ToJSON" $
    it "should encode into a json" $
      decode (encode invitation') `shouldBe` Just json

  let invitationCreate' = InvitationCreate {
        invitationCreateEmail = "foobar@example.com",
        invitationCreateAuthority = AuthorityCollaborator
      }

  let jsonCreate = [aesonQQ|
    {
      "email": "foobar@example.com",
      "authority": "collaborator"
    }
  |]

  describe "InvitationCreate FromJSON" $ do
    it "should parse a json" $
      decode (encode jsonCreate) `shouldBe` Just invitationCreate'

    it "should reject an invalid json" $ do
      decode "{}" `shouldBe` (Nothing :: Maybe InvitationCreate)
      let (Object hm) = jsonCreate
      forM_ ["email", "authority"] $ \key ->
        decode (encode (Object (HM.delete key hm))) `shouldBe` (Nothing :: Maybe InvitationCreate)

  describe "InvitationCreate ToJSON" $
    it "should encode into a json" $
      decode (encode invitationCreate') `shouldBe` Just jsonCreate