packages feed

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")