packages feed

mackerel-client-0.2.0: test/Types/ChannelSpec.hs

{-# LANGUAGE OverloadedStrings, QuasiQuotes #-}
module Types.ChannelSpec 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.Channel

spec :: Spec
spec = do

  let channel1 = Channel {
        channelId = ChannelId "abcde1",
        channelName = "Example Channel 1",
        channelType = "slack"
      }

  let json1 = [aesonQQ|
    {
      "id": "abcde1",
      "name": "Example Channel 1",
      "type": "slack"
    }
  |]

  let channel2 = Channel {
        channelId = ChannelId "abcde2",
        channelName = "Example Channel 2",
        channelType = "email"
      }

  let json2 = [aesonQQ|
    {
      "id": "abcde2",
      "name": "Example Channel 2",
      "type": "email"
    }
  |]

  describe "Channel FromJSON" $ do
    it "should parse a json" $
      forM_ [(channel1, json1), (channel2, json2)] $ \(channel, json) ->
        decode (encode json) `shouldBe` Just channel

    it "should reject an invalid json" $ do
      decode "{}" `shouldBe` (Nothing :: Maybe Channel)
      let (Object hm) = json1
      forM_ ["id", "name", "type"] $ \key ->
        decode (encode (Object (HM.delete key hm))) `shouldBe` (Nothing :: Maybe Channel)

  describe "Channel ToJSON" $
    it "should encode into a json" $
      forM_ [(channel1, json1), (channel2, json2)] $ \(channel, json) ->
        decode (encode channel) `shouldBe` Just json