packages feed

hakyllbars-1.0.0.0: test/Hakyllbars/TestSupport/Compiler.hs

module Hakyllbars.TestSupport.Compiler where

import Data.Set as S
import Hakyll as H
import Hakyll.Core.Compiler.Internal
import qualified Hakyll.Core.Logger as Logger
import Hakyllbars.TestSupport.TestEnv
import Test.Hspec

type RunCompiler a = Compiler a -> Identifier -> IO (CompilerResult a)

runCompilerSpec :: TestEnv -> (RunCompiler a -> IO b) -> IO b
runCompilerSpec testEnv f = do
  let run compiler identifier = do
        logger <- Logger.new Logger.Debug
        let compilerRead =
              CompilerRead
                { compilerConfig = testHakyllConfig testEnv,
                  compilerUnderlying = identifier,
                  compilerProvider = testProvider testEnv,
                  compilerUniverse = S.empty,
                  compilerRoutes = mempty,
                  compilerStore = testStore testEnv,
                  compilerLogger = logger
                }
        result <- runCompiler compiler compilerRead
        Logger.flush logger
        return result
  f run

shouldProduce :: (Eq a, Show a) => CompilerResult (Item a) -> a -> Expectation
shouldProduce (CompilerDone item _) expected =
  itemBody item `shouldBe` expected
shouldProduce (CompilerSnapshot snapshot _) _ =
  expectationFailure $ "Compiler did not complete, received snapshot " ++ snapshot
shouldProduce (CompilerRequire dependencies _) _ =
  expectationFailure $ "Compiler did not complete, produced dependencies on " ++ show dependencies
shouldProduce (CompilerError errors) _ = expectationFailure message
  where
    message = case errors of
      CompilationFailure exceptions -> "Compiler failed with exceptions: " ++ show exceptions
      CompilationNoResult [] -> "Compiler produced no result"
      CompilationNoResult exceptions -> "Compiler produced no result with exceptions: " ++ show exceptions

compileBody :: (Item String -> Compiler (Item String)) -> Compiler (Item String)
compileBody compiler = getResourceBody >>= compiler