stackctl-1.5.0.0: test/Stackctl/OneOrListOfSpec.hs
module Stackctl.OneOrListOfSpec
( spec
) where
import Stackctl.Prelude
import Data.Aeson
import qualified Data.Yaml as Yaml
import Stackctl.OneOrListOf
import Test.Hspec
data ExampleObject = ExampleObject
{ oneOf :: OneOrListOf Text
, listOf :: OneOrListOf Text
}
deriving stock (Generic)
deriving anyclass (FromJSON, ToJSON)
-- N.B. the sorting and indentation must match what encode will do in order for
-- the round-trip spec to pass.
exampleBS :: ByteString
exampleBS =
mconcat
[ "listOf:\n"
, "- one\n"
, "- two\n"
, "oneOf: one\n"
]
spec :: Spec
spec = do
it "Foldable" $ do
ExampleObject {..} <- Yaml.decodeThrow exampleBS
toList oneOf `shouldBe` ["one"]
toList listOf `shouldBe` ["one", "two"]
it "Semigroup" $ do
ExampleObject {..} <- Yaml.decodeThrow exampleBS
toList (oneOf <> listOf) `shouldBe` ["one", "one", "two"]
it "From/ToJSON" $ do
decoded <- Yaml.decodeThrow @_ @ExampleObject exampleBS
Yaml.encode decoded `shouldBe` exampleBS