heist-0.14.0: test/suite/Heist/Compiled/Tests.hs
{-# LANGUAGE OverloadedStrings #-}
module Heist.Compiled.Tests
( tests
) where
import Blaze.ByteString.Builder
import Control.Error
import Control.Lens
import Control.Monad.Trans
import Data.Map.Syntax
import Data.Monoid
import Test.Framework (Test)
import Test.Framework.Providers.HUnit
import qualified Test.HUnit as H
------------------------------------------------------------------------------
import Heist
import Heist.Compiled
import Heist.Tutorial.CompiledSplices
import Heist.TestCommon
-- NOTE: We can't test compiled templates on the templates directory as it
-- stands today because that directory contains some error conditions such as
-- infinite bind loops, apply tags with no template attribute, and apply tags
-- with ".." in the tag path (which doesn't currently work).
tests :: [Test]
tests = [ testCase "compiled/simple" simpleCompiledTest
, testCase "compiled/people" peopleTest
, testCase "compiled/namespace1" namespaceTest1
, testCase "compiled/namespace2" namespaceTest2
, testCase "compiled/namespace3" namespaceTest3
, testCase "compiled/namespace4" namespaceTest4
, testCase "compiled/namespace5" namespaceTest5
]
simpleCompiledTest :: IO ()
simpleCompiledTest = do
res <- runWithStateSplice "templates"
H.assertEqual "compiled state splice" expected res
where
expected =
mappend doctype "\n <html> 3 </html> "
peopleTest :: IO ()
peopleTest = do
res <- personListTest "templates"
H.assertEqual "people splice" expected res
where
expected =
mappend doctype "\n <p>Doe, John: 42 years old</p> <p>Smith, Jane: 21 years old</p> "
templateHC :: HeistConfig IO
templateHC = HeistConfig sc "" False
where
sc = mempty & scLoadTimeSplices .~ defaultLoadTimeSplices
& scCompiledSplices .~ ("foo" ## return (yieldPureText "aoeu"))
& scTemplateLocations .~ [loadTemplates "templates"]
namespaceTest1 :: IO ()
namespaceTest1 = do
res <- runEitherT $ do
hs <- initHeist templateHC
runner <- noteT ["Error rendering"] $ hoistMaybe $
renderTemplate hs "namespaces"
b <- lift $ fst runner
return $ toByteString b
H.assertEqual "namespace test" (Right expected) res
where
expected = mappend doctype "\nAlpha\naoeu Beta\n<h:foo aoeu='htns'>Inside h:foo</h:foo> End\n"
namespaceTest2 :: IO ()
namespaceTest2 = do
res <- runEitherT $ do
hs <- initHeist $ templateHC & hcErrorNotBound .~ True
runner <- noteT ["Error rendering"] $ hoistMaybe $
renderTemplate hs "namespaces"
b <- lift $ fst runner
return $ toByteString b
H.assertEqual "namespace test" (Right expected) res
where
expected = mappend doctype "\nAlpha\naoeu Beta\n<h:foo aoeu='htns'>Inside h:foo</h:foo> End\n"
namespaceTest3 :: IO ()
namespaceTest3 = do
res <- runEitherT $ do
hs <- initHeist $ templateHC & hcNamespace .~ "h"
runner <- noteT ["Error rendering"] $ hoistMaybe $
renderTemplate hs "namespaces"
b <- lift $ fst runner
return $ toByteString b
H.assertEqual "namespace test" (Right expected) res
where
expected = mappend doctype "\nAlpha\n<foo aoeu='htns'>Inside foo</foo> Beta\naoeu End\n"
namespaceTest4 :: IO ()
namespaceTest4 = do
res <- runEitherT $ do
hs <- initHeist $ templateHC & hcNamespace .~ "h"
& hcErrorNotBound .~ True
runner <- noteT ["Error rendering"] $ hoistMaybe $
renderTemplate hs "namespaces"
b <- lift $ fst runner
return $ toByteString b
H.assertEqual "namespace test" (Right expected) res
where
expected = mappend doctype "\nAlpha\n<foo aoeu='htns'>Inside foo</foo> Beta\naoeu End\n"
namespaceTest5 :: IO ()
namespaceTest5 = do
res <- runEitherT $ do
hs <- initHeist $ templateHC & hcNamespace .~ "h"
& hcCompiledSplices .~ mempty
& hcErrorNotBound .~ True
runner <- noteT ["Error rendering"] $ hoistMaybe $
renderTemplate hs "namespaces"
b <- lift $ fst runner
return $ toByteString b
H.assertEqual "namespace test" (Left ["templates/namespaces.tpl: No splice bound for h:foo"]) res