module Cfg.Env.KeysSpec where import Cfg.Deriving import Cfg.Deriving.KeyModifier 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))