packages feed

sydtest-aeson-0.2.0.0: test/Test/Syd/AesonSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Test.Syd.AesonSpec (spec) where

import Control.Exception
import Control.Monad
import Data.Aeson as JSON
import Data.Text (Text)
import System.Directory (doesFileExist, removeFile)
import Test.Syd
import Test.Syd.Aeson

spec :: Spec
spec = do
  describe "pureGoldenJSONFile" $ do
    it "outputs this example the same as before" $
      pureGoldenJSONFile "test_resources/pure-example.json" $
        JSON.object ["hello" .= ("world" :: Text), "a" .= (1 :: Int), "b" .= True]

    it "does not write an empty file if encoding fails" $ do
      let path = "test_resources/pure-example-exception.json"
      let result = JSON.object ["undefined" .= (undefined :: Text)]
      let goldenTest = pureGoldenJSONFile path result
      -- Make sure there is nothing in the way
      existsBefore <- doesFileExist path
      when existsBefore $ removeFile path

      -- Try to write, this will fail
      goldenTestWrite goldenTest result `catch` (\(_ :: ErrorCall) -> pure ())

      -- Make sure there is no file afterwards
      exists <- doesFileExist path
      exists `shouldBe` False

  describe "goldenJSONFile" $
    it "outputs this example the same as before" $
      goldenJSONFile "test_resources/example.json" $
        pure $
          JSON.object ["hello" .= ("world" :: Text), "a" .= (1 :: Int), "b" .= True]

  describe "pureGoldenJSONValueFile" $ do
    it "outputs this example the same as before"
      $ pureGoldenJSONValueFile
        "test_resources/pure-example-value.json"
      $ JSON.object
        ["hello" .= ("world" :: Text), "a" .= (1 :: Int), "b" .= True]

    it "does not write an empty file if encoding fails" $ do
      let path = "test_resources/pure-example-value-exception.json"
      let result = JSON.object ["undefined" .= (undefined :: Text)]
      let goldenTest = pureGoldenJSONValueFile path result
      -- Make sure there is nothing in the way
      existsBefore <- doesFileExist path
      when existsBefore $ removeFile path

      -- Try to write, this will fail
      goldenTestWrite goldenTest result `catch` (\(_ :: ErrorCall) -> pure ())

      -- Make sure there is no file afterwards
      existsAfter <- doesFileExist path
      existsAfter `shouldBe` False

  describe "goldenJSONValueFile" $
    it "outputs this example the same as before" $
      goldenJSONValueFile "test_resources/example-value.json" $
        pure $
          JSON.object ["hello" .= ("world" :: Text), "a" .= (1 :: Int), "b" .= True]