98 lines
3.2 KiB
Haskell
98 lines
3.2 KiB
Haskell
{-# LANGUAGE FlexibleInstances #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
|
|
module Test.QuasiResource (testSuite) where
|
|
|
|
import Yesod
|
|
import Test.Framework (testGroup, Test)
|
|
import Test.Framework.Providers.HUnit
|
|
import Test.HUnit hiding (Test)
|
|
import Data.List
|
|
|
|
data MyYesod = MyYesod
|
|
|
|
instance Show (Handler MyYesod ChooseRep) where show _ = "Another handler"
|
|
|
|
addHead' :: HtmlObject -> (Html, HtmlObject)
|
|
addHead' x = (cs "", x)
|
|
|
|
addHead :: Monad m => HtmlObject -> m (Html, HtmlObject)
|
|
addHead = return . addHead'
|
|
|
|
getStatic :: Verb -> [String] -> Handler MyYesod (Html, HtmlObject)
|
|
getStatic v p = addHead $ toHtmlObject ["getStatic", show v, show p]
|
|
pageIndex :: Handler MyYesod (Html, HtmlObject)
|
|
pageIndex = addHead $ toHtmlObject ["pageIndex"]
|
|
pageAdd :: Handler MyYesod ChooseRep
|
|
pageAdd = return $ chooseRep $ addHead' $ toHtmlObject ["pageAdd"]
|
|
pageDetail :: String -> Handler MyYesod ChooseRep
|
|
pageDetail s = return $ chooseRep $ addHead' $ toHtmlObject ["pageDetail", s]
|
|
pageDelete :: String -> Handler MyYesod (Html, HtmlObject)
|
|
pageDelete s = addHead $ toHtmlObject ["pageDelete", s]
|
|
pageUpdate :: String -> Handler MyYesod ChooseRep
|
|
pageUpdate s = return $ chooseRep $ addHead' $ toHtmlObject ["pageUpdate", s]
|
|
userInfo :: Int -> Handler MyYesod (Html, HtmlObject)
|
|
userInfo i = addHead $ toHtmlObject ["userInfo", show i]
|
|
userVariable :: Int -> String -> Handler MyYesod (Html, HtmlObject)
|
|
userVariable i s = addHead $ toHtmlObject ["userVariable", show i, s]
|
|
userPage :: Int -> [String] -> Handler MyYesod (Html, HtmlObject)
|
|
userPage i p = addHead $ toHtmlObject ["userPage", show i, show p]
|
|
|
|
instance Show (Verb -> Handler MyYesod ChooseRep) where
|
|
show _ = "verb -> handler"
|
|
instance Show (Resource -> Verb -> Handler MyYesod ChooseRep) where
|
|
show _ = "resource -> verb -> handler"
|
|
handler :: Resource -> Verb -> Handler MyYesod ChooseRep
|
|
handler = [$mkResources|
|
|
/static/*filepath/: getStatic
|
|
/page/:
|
|
Get: pageIndex
|
|
Put: pageAdd
|
|
/page/$page/:
|
|
Get: pageDetail
|
|
Delete: pageDelete
|
|
Post: pageUpdate
|
|
/user/#id/:
|
|
Get: userInfo
|
|
/user/#id/profile/$variable/:
|
|
Get: userVariable
|
|
/user/#id/page/*page/:
|
|
Get: userPage
|
|
|]
|
|
|
|
ph :: [String] -> Handler MyYesod ChooseRep -> Assertion
|
|
ph ss h = do
|
|
let eh = return . chooseRep . addHead' . toHtmlObject . show
|
|
rr = error "No raw request"
|
|
y = MyYesod
|
|
cts = [TypeHtml]
|
|
res <- runHandler h eh rr y cts
|
|
res' <- myShow res
|
|
mapM_ (helper res') ss
|
|
where
|
|
helper haystack needle =
|
|
assertBool needle $ needle `isInfixOf` haystack
|
|
|
|
myShow :: Response -> IO String
|
|
myShow (Response sc hs ct c) = runContent c >>= \c' -> return $ unlines
|
|
[ show sc
|
|
, unlines $ map show hs
|
|
, show ct
|
|
, show c'
|
|
]
|
|
|
|
caseQuasi :: Assertion
|
|
caseQuasi = do
|
|
ph ["200", "foo"] $ handler ["static", "foo", "bar", "baz"] Get
|
|
ph ["404"] $ handler ["foo", "bar", "baz"] Get
|
|
ph ["200", "pageIndex"] $ handler ["page"] Get
|
|
ph ["404"] $ handler ["user"] Get
|
|
ph ["404"] $ handler ["user", "five"] Get
|
|
ph ["200", "userInfo", "5"] $ handler ["user", "5"] Get
|
|
ph ["200", "userVar"] $ handler ["user", "5", "profile", "email"] Get
|
|
|
|
testSuite :: Test
|
|
testSuite = testGroup "Test.QuasiResource"
|
|
[ testCase "quasi" caseQuasi
|
|
]
|