yaml-0.8.21.2: test/Data/Yaml/IncludeSpec.hs
{-# LANGUAGE QuasiQuotes #-}
module Data.Yaml.IncludeSpec (main, spec) where
import Test.Hspec
import Data.List (isPrefixOf)
import Data.Aeson
import Data.Aeson.QQ
import Data.Yaml (ParseException(InvalidYaml))
import Data.Yaml.Include
import Text.Libyaml (YamlException(YamlException))
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
describe "decodeFile" $ do
it "supports includes" $ do
decodeFile "test/resources/foo.yaml" `shouldReturn` Just [aesonQQ|
{
foo: 23,
bar: {one: 1, two: 2},
baz: 42
}
|]
it "supports recursive includes" $ do
decodeFile "test/resources/baz.yaml" `shouldReturn` Just [aesonQQ|
{
foo: {
foo: 23,
bar: {one: 1, two: 2},
baz: 42
}
}
|]
it "aborts on cyclic includes" $ do
(decodeFile "test/resources/loop/foo.yaml" :: IO (Maybe Value)) `shouldThrow` anyException
context "when file does not exist" $ do
it "throws Left (InvalidYaml (Just (YamlException \"Yaml file not found: ...\")))" $ do
(decodeFile "./does_not_exist.yaml" :: IO (Maybe Value)) `shouldThrow` isYamlFileNotFoundException
describe "decodeFileEither" $ do
context "when file does not exist" $ do
it "returns Left (InvalidYaml (Just (YamlException \"Yaml file not found: ...\")))" $ do
(decodeFileEither "./does_not_exist.yaml" :: IO (Either ParseException Value)) >>=
(`shouldSatisfy` either isYamlFileNotFoundException (const False))
isYamlFileNotFoundException :: ParseException -> Bool
isYamlFileNotFoundException (InvalidYaml (Just (YamlException msg)))
| "Yaml file not found: " `isPrefixOf` msg = True
isYamlFileNotFoundException _ = False