packages feed

hspec-junit-formatter-1.0.3.0: library/Test/Hspec/JUnit/Config/Env.hs

-- | Load a 'JUnitConfig' using environment variables
module Test.Hspec.JUnit.Config.Env
    ( envJUnitEnabled
    , envJUnitConfig
    ) where

import Prelude

import Data.Semigroup (Endo(..))
import Data.Text (pack)
import System.Directory (getCurrentDirectory)
import System.Environment (lookupEnv)
import System.FilePath (takeBaseName)
import Test.Hspec.JUnit.Config

-- | Is @JUNIT_ENABLED=1@ set in the environment?
envJUnitEnabled :: IO Bool
envJUnitEnabled = (== Just "1") <$> lookupEnv (envPrefix <> "ENABLED")

-- | Produce a 'JUnitConfig' by reading environment variables
--
-- Variable names align with setter functions from "Test.Hspec.JUnit.Config":
--
-- * @JUNIT_OUTPUT_DIRECTORY@ 'setJUnitConfigOutputDirectory'
-- * @JUNIT_OUTPUT_NAME@ 'setJUnitConfigOutputName
-- * and so on
--
envJUnitConfig :: IO JUnitConfig
envJUnitConfig = do
  modify <- appEndo . foldMap Endo <$> sequence
    [ lookupEnvOverride "OUTPUT_DIRECTORY" setJUnitConfigOutputDirectory
    , lookupEnvOverride "OUTPUT_NAME" setJUnitConfigOutputName
    , lookupEnvOverride "OUTPUT_FILE" setJUnitConfigOutputFile
    , lookupEnvOverride "SUITE_NAME" $ setJUnitConfigSuiteName . pack
    , lookupEnvOverride "SOURCE_PATH_PREFIX" setJUnitConfigSourcePathPrefix
    ]

  modify . defaultJUnitConfig . pack . takeBaseName <$> getCurrentDirectory

lookupEnvOverride
  :: String
  -> (String -> JUnitConfig -> JUnitConfig)
  -> IO (JUnitConfig -> JUnitConfig)
lookupEnvOverride name setter =
  maybe id setter <$> lookupEnv (envPrefix <> name)

envPrefix :: String
envPrefix = "JUNIT_"