headroom-0.1.0.0: test/Headroom/AppConfigSpec.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Headroom.AppConfigSpec
( spec
)
where
import Headroom.AppConfig
import Headroom.Types ( AppConfigError(..)
, HeadroomError(..)
, RunMode(..)
)
import RIO
import qualified RIO.HashMap as HM
import Test.Hspec
import Test.Utils ( matchesException )
spec :: Spec
spec = do
describe "loadAppConfig" $ do
it "loads full configuration from YAML file" $ do
appConfig <- loadAppConfig "test-data/configs/full.yaml"
let options = HM.fromList
[ ("copyright", "(c) 2019 John Smith")
, ("email" , "john.smith@example.com")
]
sourcePaths = ["test-data/configs/path/to/src"]
templatePaths =
["test-data/configs/path/to/dir1", "test-data/configs/path/to/dir2"]
expected = AppConfig Add sourcePaths templatePaths options
appConfig `shouldBe` expected
describe "parseVariables" $ do
it "parses variables map from raw string list" $ do
let raw = ["key1=value1", "key2=value with spaces"]
expected =
HM.fromList [("key1", "value1"), ("key2", "value with spaces")]
parseVariables raw `shouldBe` Just expected
let ph1 = HM.fromList [("key1", "value1")]
ph2 = HM.fromList [("key2", "value2")]
appConfig1 = AppConfig Replace ["source1"] [] ph1
appConfig2 = AppConfig Add ["source2"] ["template1"] ph2
appConfig3 = AppConfig Add [] ["template1"] ph2
expected' = AppConfig
Replace
["source1", "source2"]
["template1"]
(HM.fromList [("key1", "value1"), ("key2", "value2")])
describe "validateAppConfig" $ do
it "validates configuration version" $ do
let check (Just (InvalidAppConfig [EmptySourcePaths])) = True
check _ = False
validateAppConfig appConfig3 `shouldSatisfy` matchesException check
describe "<>" $ do
it "joins two AppConfig records" $ do
(appConfig1 <> appConfig2) `shouldBe` expected'
describe "mconcat" $ do
it "folds a list of AppConfig records" $ do
mconcat [appConfig1, appConfig2] `shouldBe` expected'