packages feed

mackerel-client-0.0.0: test/Types/ServiceSpec.hs

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

spec :: Spec
spec = do

  let service = Service {
        serviceName = "FooService",
        serviceMemo = "service memo",
        serviceRoles = [ "role0", "role1", "role2" ]
      }

  let json = [aesonQQ|
    {
      "name": "FooService",
      "memo": "service memo",
      "roles": [
        "role0",
        "role1",
        "role2"
      ]
    }
  |]

  describe "Service FromJSON" $ do
    it "should parse a json" $
      decode (encode json) `shouldBe` Just service

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

  describe "Service ToJSON" $
    it "should encode into a json" $
      decode (encode service) `shouldBe` Just json