packages feed

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

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

spec :: Spec
spec = do

  let dashboard = Dashboard {
        dashboardId = DashboardId "abcde",
        dashboardTitle = "This is a dashboard",
        dashboardBodyMarkdown = "# Example\n[example](https://example.com)",
        dashboardUrlPath = "example",
        dashboardCreatedAt = 1483196400,
        dashboardUpdatedAt = 1483282800
      }

  let json = [aesonQQ|
    {
      "id": "abcde",
      "title": "This is a dashboard",
      "bodyMarkdown": "# Example\n[example](https://example.com)",
      "urlPath": "example",
      "createdAt": 1483196400,
      "updatedAt": 1483282800
    }
  |]

  let dashboardCreate = DashboardCreate {
        dashboardCreateTitle = "This is a dashboard",
        dashboardCreateBodyMarkdown = "# Example\n[example](https://example.com)",
        dashboardCreateUrlPath = "example"
      }

  let jsonCreate = [aesonQQ|
    {
      "title": "This is a dashboard",
      "bodyMarkdown": "# Example\n[example](https://example.com)",
      "urlPath": "example"
    }
  |]

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

    it "should reject an invalid json" $ do
      decode "{}" `shouldBe` (Nothing :: Maybe Dashboard)
      let (Object hm) = json
      forM_ ["id", "title", "bodyMarkdown", "urlPath", "createdAt", "updatedAt"] $ \key ->
        decode (encode (Object (HM.delete key hm))) `shouldBe` (Nothing :: Maybe Dashboard)

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

  describe "DashboardCreate FromJSON" $
    it "should parse a json" $
      decode (encode jsonCreate) `shouldBe` Just dashboardCreate

  describe "DashboardCreate ToJSON" $
    it "should encode into a json" $
      decode (encode dashboardCreate) `shouldBe` Just jsonCreate