stackctl-1.1.0.0: test/Stackctl/StackSpecYamlSpec.hs
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module Stackctl.StackSpecYamlSpec
( spec
) where
import Stackctl.Prelude
import qualified Data.Yaml as Yaml
import Stackctl.AWS
import Stackctl.StackSpecYaml
import Test.Hspec
spec :: Spec
spec = do
describe "decoding Yaml" $ do
it "reads String parameters" $ do
StackSpecYaml {..} <- Yaml.decodeThrow $ mconcat
[ "Template: foo.yaml\n"
, "Parameters:\n"
, " - ParameterKey: Foo\n"
, " ParameterValue: Bar\n"
]
let Just [ParameterYaml param] = ssyParameters
param ^. parameter_parameterKey `shouldBe` Just "Foo"
param ^. parameter_parameterValue `shouldBe` Just "Bar"
it "reads Number parameters without decimals" $ do
StackSpecYaml {..} <- Yaml.decodeThrow $ mconcat
[ "Template: foo.yaml\n"
, "Parameters:\n"
, " - ParameterKey: Port\n"
, " ParameterValue: 80\n"
]
let Just [ParameterYaml param] = ssyParameters
param ^. parameter_parameterKey `shouldBe` Just "Port"
param ^. parameter_parameterValue `shouldBe` Just "80"
it "reads Number parameters with decimals" $ do
StackSpecYaml {..} <- Yaml.decodeThrow $ mconcat
[ "Template: foo.yaml\n"
, "Parameters:\n"
, " - ParameterKey: Pie\n"
, " ParameterValue: 3.14\n"
]
let Just [ParameterYaml param] = ssyParameters
param ^. parameter_parameterKey `shouldBe` Just "Pie"
param ^. parameter_parameterValue `shouldBe` Just "3.14"
it "has informative errors" $ do
let
Left ex = Yaml.decodeEither' @StackSpecYaml $ mconcat
[ "Template: foo.yaml\n"
, "Parameters:\n"
, " - ParameterKey: Norway\n"
, " ParameterValue: no\n"
]
show ex
`shouldBe` "AesonException \"Error in $.Parameters[0].ParameterValue: Expected String or Number, got: Bool False\""
it "also accepts CloudGenesis formatted values" $ do
StackSpecYaml {..} <- Yaml.decodeThrow $ mconcat
[ "Template: foo.yaml\n"
, "Parameters:\n"
, " - Name: Foo\n"
, " Value: Bar\n"
]
let Just [ParameterYaml param] = ssyParameters
param ^. parameter_parameterKey `shouldBe` Just "Foo"
param ^. parameter_parameterValue `shouldBe` Just "Bar"