yesod-core-1.7.0.0: test/YesodCoreTest/RenderRouteSpec.hs
{-# language CPP #-}
{-# language TemplateHaskell #-}
{-# language TypeApplications #-}
{-# language OverloadedStrings #-}
{-# language TypeFamilies #-}
{-# language ViewPatterns #-}
-- | Behavioural @renderRoute@ spec built from a hand-constructed
-- 'ResourceTree' AST (a @ResourceParent@ with one dynamic piece over a leaf)
-- rather than @parseRoutes@, so it pins @mkRenderRouteInstanceOpts@ directly
-- against a known tree. Companion module "YesodCoreTest.RenderRouteSpec.TH"
-- reuses the generated instance from a compile-time splice.
module YesodCoreTest.RenderRouteSpec where
import Yesod.Routes.TH.Types
import Language.Haskell.TH
import Yesod.Routes.TH.RenderRoute
import Yesod.Routes.Class
import Test.Hspec
data App = App
-- Generate the 'RenderRoute' instance for 'App' at compile time, then check
-- 'renderRoute' behaves at runtime (the prod path; the intermediate clause
-- lists are not asserted directly).
do
let int = ConT ''Int
mkRenderRouteInstanceOpts defaultOpts [] NoTyArgs (ConT (mkName "App"))
[ ResourceParent "FirstR" False mempty [Static "first", Dynamic int]
[ ResourceLeaf Resource
{ resourceName = "BlahR"
, resourcePieces = [Static "blah"]
, resourceDispatch = Methods
{ methodsMulti = Nothing
, methodsMethods = []
}
, resourceAttrs = []
, resourceCheck = False
}
]
]
spec :: Spec
spec = do
describe "renderRoute" $ do
it "works on top level" $ do
case renderRoute (FirstR 1 BlahR) of
(["first", "1", "blah"], []) ->
pure @IO ()
wrong ->
fail $ "Expected renderRoute to work, but got: " <> show wrong