houseman-0.1.0: test/HousemanSpec.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module HousemanSpec ( main, spec ) where
import System.Environment
import Data.Streaming.Process (StreamingProcessHandle,
waitForStreamingProcess)
import qualified Houseman
import Houseman.Logger (newLogger, readLogger)
import Houseman.Types
import Procfile.Types
import System.IO.Silently (capture)
import Test.Hspec
import Test.Mockery.Directory (inTempDirectory)
main :: IO ()
main = hspec spec
runApp :: Logger -> App -> IO StreamingProcessHandle
runApp l a = Houseman.withApp l a return
spec :: Spec
spec = describe "Houseman" $ do
describe "start" $ do
it "should run given apps" $ do
let apps = [ App "echo1" "./test/fixtures/echo.sh foo bar"
, App "echo2" "./test/fixtures/echo.sh baz ๐"
]
(result,_) <- capture $ Houseman.start apps
result `shouldContain` "echo1: \ESC[0mfoo"
result `shouldContain` "echo1: \ESC[0mbar"
result `shouldContain` "echo2: \ESC[0mbaz"
result `shouldContain` "echo2: \ESC[0m๐"
describe "runApp" $ do
it "should run given process" $ do
log' <- newLogger
Houseman.withApp log' (App "echo" "ECHO=1 ./test/fixtures/echo.sh foo ๐") $ \ph -> do
_ <- waitForStreamingProcess ph
readLogger log' `shouldReturn` Log ("echo", "ECHO=1")
readLogger log' `shouldReturn` Log ("echo", "foo")
readLogger log' `shouldReturn` Log ("echo", "๐")
it "should use .env as dotenv file, which supersedes original environment" $ inTempDirectory $ do
setEnv "BAZ" "3"
writeFile ".env" "BAZ=2"
log' <- newLogger
Houseman.withApp log' (App "echo" "printenv BAZ") $ \ph -> do
_ <- waitForStreamingProcess ph
readLogger log' `shouldReturn` Log ("echo", "2")
it "should log stderr" $ do
log' <- newLogger
Houseman.withApp log' (App "echo" "echo ERROR 1>&2") $ \ph -> do
_ <- waitForStreamingProcess ph
readLogger log' `shouldReturn` Log ("echo", "ERROR")