headroom-0.4.2.0: test/Headroom/Template/MustacheSpec.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Headroom.Template.MustacheSpec
( spec
)
where
import Headroom.Template
import Headroom.Template.Mustache
import Headroom.Template.TemplateRef ( TemplateRef(..) )
import Headroom.Variables ( mkVariables )
import RIO
import Test.Hspec
spec :: Spec
spec = do
describe "parseTemplate" $ do
it "parses Mustache template from raw text" $ do
let template = "Hello, {{ name }}"
parsed = parseTemplate @Mustache (InlineRef template) template
parsed `shouldSatisfy` isJust
describe "renderTemplate" $ do
it "renders template with given variables" $ do
let template = "Hello, {{ name }}"
variables = mkVariables [("name", "John")]
parsed = parseTemplate @Mustache (InlineRef template) template
rendered = parsed >>= renderTemplate variables
rendered `shouldBe` Just "Hello, John"
it "fails if not enough variables is provided" $ do
let template = "Hello, {{ name }} {{ surname }}"
variables = mkVariables [("name", "John")]
parsed = parseTemplate @Mustache (InlineRef template) template
let
err (MissingVariables "<inline template 'Hello, {{ name }} {{ surname }}'>" ["surname"])
= True
err _ = False
(parsed >>= renderTemplate variables) `shouldThrow` err
it "renders template with conditionally set variable" $ do
let template = "Foo {{#bar}}{{bar}}{{/bar}}{{^bar}}BAR{{/bar}}"
variables = mempty
parsed = parseTemplate @Mustache (InlineRef template) template
rendered = parsed >>= renderTemplate variables
rendered `shouldBe` Just "Foo BAR"
it "fails if non-existing variable is used with inverted sections" $ do
let template = "Foo {{bar}}{{^bar}}BAR{{/bar}}"
variables = mkVariables [("xx", "yy")]
parsed = parseTemplate @Mustache (InlineRef template) template
rendered = parsed >>= renderTemplate variables
rendered `shouldBe` Nothing
describe "rawTemplate" $ do
it "returns raw template text for already parsed template" $ do
let template = "Hello, {{ name }}"
parsed = parseTemplate @Mustache (InlineRef template) template
fmap rawTemplate parsed `shouldBe` Just template