packages feed

hwm-0.2.0: test/Utils/Golden.hs

{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Utils.Golden (Golden (..), goldenTest) where

import Relude
import System.Directory (makeAbsolute, removePathForcibly)
import System.FilePath ((</>))
import qualified System.IO as IO
import Test.Hspec (Expectation, shouldBe)
import Utils.Core (copyLocalFiles, diff, inWorkDir, runHWM)

data Golden = Golden
  { cmd :: String,
    scenario :: FilePath,
    project :: FilePath
  }

isUpdateMode :: IO Bool
isUpdateMode = (== Just "1") <$> lookupEnv "GOLDEN_UPDATE"

goldenTest :: Golden -> Expectation
goldenTest Golden {..} = do
  scenarioDir <- makeAbsolute $ "test/golden/" </> scenario
  let expectedDir = scenarioDir </> "expected"
  let stdoutFile = scenarioDir </> "stdout.ansi"
  updateMode <- isUpdateMode
  inWorkDir project scenarioDir $ do
    out <- runHWM cmd
    if updateMode
      then do
        removePathForcibly expectedDir
        copyLocalFiles expectedDir
        IO.writeFile stdoutFile out
      else do
        diff expectedDir [".hwm", ".stack-work", "dist-newstyle", "*.log"]
        expectedStdout <- IO.readFile stdoutFile
        out `shouldBe` expectedStdout