cfg-0.0.2.2: test/Cfg/Env/KeysSpec.hs
module Cfg.Env.KeysSpec where
import Cfg.Deriving
import Cfg.Env.Keys
import Cfg.Options
import Cfg.Source (ConfigSource)
import Cfg.Source.Default
import Data.Map.Strict (empty, fromList, singleton)
import Data.Text (Text)
import GHC.Generics
import KeyTree
import Test.Hspec
spec :: Spec
spec = do
describe "getKeys" $ do
it "should collect all tree keys" $ do
let
tree :: KeyTree Text Text =
Free $
fromList
[ ("A", Pure "Case1")
,
( "B"
, Free $
fromList
[ ("1", Pure "Hello World")
, ("2", Pure "27")
, ("3", Pure "True")
, ("4", Free empty)
]
)
, ("C", Pure "18")
,
( "D"
, Free $
singleton "E" $
Free $
singleton "F" $
Free $
singleton "G" $
Free $
singleton "H" $
Free $
singleton "I" $
Free $
singleton "J" $
Free $
singleton "K" $
Pure "[1,2,3,4]"
)
]
let
expected =
[ ["A"]
, ["B", "1"]
, ["B", "2"]
, ["B", "3"]
, ["B", "4"]
, ["C"]
, ["D", "E", "F", "G", "H", "I", "J", "K"]
]
getKeys tree `shouldBe` expected
describe "showEnvKeys" $ do
it "should concatenate all tree keys with separator" $ do
let
expected =
[ "ROOT_DATA_CON_OPTS__KEY_OPTS1"
, "ROOT_DATA_CON_OPTS__KEY_OPTS2__SUB_KEY_OPTS1"
, "ROOT_DATA_CON_OPTS__KEY_OPTS2__SUB_KEY_OPTS2"
, "ROOT_DATA_CON_OPTS__KEY_OPTS2__SUB_KEY_OPTS3"
, "ROOT_DATA_CON_OPTS__KEY_OPTS3"
, "ROOT_DATA_CON_OPTS__KEY_OPTS4"
]
showEnvKeys @(RootTyConOpts Text) "__" `shouldBe` expected
data SumTypeConfig = Case1 | Case2
deriving stock (Generic, Show)
deriving (ConfigSource) via Value SumTypeConfig
data SubTyConOpts = SubDataConOpts
{ subKeyOpts1 :: Text
, subKeyOpts2 :: Int
, subKeyOpts3 :: Maybe Bool
}
deriving (Generic, Show, DefaultSource)
deriving (ConfigSource) via (ConfigOpts [CamelToSnake, ToUpper] SubTyConOpts)
data RootTyConOpts a = RootDataConOpts
{ keyOpts1 :: SumTypeConfig
, keyOpts2 :: SubTyConOpts
, keyOpts3 :: Int
, keyOpts4 :: a
}
deriving (Generic, Show, DefaultSource)
deriving
(ConfigSource)
via (ConfigRoot ('ConstructorName [CamelToSnake, ToUpper]) [CamelToSnake, ToUpper] (RootTyConOpts a))