Fixed yesod-routes tests
This commit is contained in:
parent
4bdd01ef58
commit
f063074ac4
@ -9,12 +9,12 @@
|
|||||||
module Hierarchy
|
module Hierarchy
|
||||||
( hierarchy
|
( hierarchy
|
||||||
, Dispatcher (..)
|
, Dispatcher (..)
|
||||||
, RunHandler (..)
|
, runHandler
|
||||||
, Handler
|
, Handler
|
||||||
, App
|
, App
|
||||||
, toText
|
, toText
|
||||||
, Env (..)
|
, Env (..)
|
||||||
, fixEnv
|
, subDispatch
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
@ -38,38 +38,37 @@ type Handler sub master a = a
|
|||||||
type Request = ([Text], ByteString) -- path info, method
|
type Request = ([Text], ByteString) -- path info, method
|
||||||
type App sub master = Request -> (Text, Maybe (YRC.Route master))
|
type App sub master = Request -> (Text, Maybe (YRC.Route master))
|
||||||
data Env sub master = Env
|
data Env sub master = Env
|
||||||
{ envRoute :: Maybe (YRC.Route sub)
|
{ envToMaster :: YRC.Route sub -> YRC.Route master
|
||||||
, envToMaster :: YRC.Route sub -> YRC.Route master
|
|
||||||
, envSub :: sub
|
, envSub :: sub
|
||||||
, envMaster :: master
|
, envMaster :: master
|
||||||
}
|
}
|
||||||
|
|
||||||
fixEnv :: (oldSub -> newSub)
|
subDispatch
|
||||||
-> (YRC.Route newSub -> YRC.Route oldSub)
|
:: (Env sub master -> App sub master)
|
||||||
-> (YRC.Route oldSub -> Env oldSub master)
|
-> (Handler sub master Text -> Env sub master -> Maybe (YRC.Route sub) -> App sub master)
|
||||||
-> (YRC.Route newSub -> Env newSub master)
|
-> (master -> sub)
|
||||||
fixEnv toSub toRoute getEnv newRoute =
|
-> (YRC.Route sub -> YRC.Route master)
|
||||||
go (getEnv $ toRoute newRoute)
|
-> Env master master
|
||||||
|
-> App sub master
|
||||||
|
subDispatch handler _runHandler getSub toMaster env req =
|
||||||
|
handler env' req
|
||||||
where
|
where
|
||||||
go env = env
|
env' = env
|
||||||
{ envRoute = Just newRoute
|
{ envToMaster = envToMaster env . toMaster
|
||||||
, envToMaster = envToMaster env . toRoute
|
, envSub = getSub $ envMaster env
|
||||||
, envSub = toSub $ envSub env
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Dispatcher sub master where
|
class Dispatcher sub master where
|
||||||
dispatcher
|
dispatcher :: Env sub master -> App sub master
|
||||||
:: App sub master -- ^ 404 page
|
|
||||||
-> (YRC.Route sub -> App sub master) -- ^ 405 page
|
runHandler
|
||||||
-> (YRC.Route sub -> Env sub master)
|
:: ToText a
|
||||||
-> App sub master
|
=> Handler sub master a
|
||||||
|
-> Env sub master
|
||||||
|
-> Maybe (Route sub)
|
||||||
|
-> App sub master
|
||||||
|
runHandler h Env {..} route _ = (toText h, fmap envToMaster route)
|
||||||
|
|
||||||
class RunHandler sub master where
|
|
||||||
runHandler
|
|
||||||
:: ToText a
|
|
||||||
=> Handler sub master a
|
|
||||||
-> Env sub master
|
|
||||||
-> App sub master
|
|
||||||
|
|
||||||
data Hierarchy = Hierarchy
|
data Hierarchy = Hierarchy
|
||||||
|
|
||||||
@ -84,11 +83,12 @@ do
|
|||||||
rrinst <- mkRenderRouteInstance (ConT ''Hierarchy) $ map (fmap parseType) resources
|
rrinst <- mkRenderRouteInstance (ConT ''Hierarchy) $ map (fmap parseType) resources
|
||||||
dispatch <- mkDispatchClause MkDispatchSettings
|
dispatch <- mkDispatchClause MkDispatchSettings
|
||||||
{ mdsRunHandler = [|runHandler|]
|
{ mdsRunHandler = [|runHandler|]
|
||||||
, mdsDispatcher = [|dispatcher|]
|
, mdsSubDispatcher = [|subDispatch|]
|
||||||
, mdsFixEnv = [|fixEnv|]
|
|
||||||
, mdsGetPathInfo = [|fst|]
|
, mdsGetPathInfo = [|fst|]
|
||||||
, mdsMethod = [|snd|]
|
, mdsMethod = [|snd|]
|
||||||
, mdsSetPathInfo = [|\p (_, m) -> (p, m)|]
|
, mdsSetPathInfo = [|\p (_, m) -> (p, m)|]
|
||||||
|
, mds404 = [|pack "404"|]
|
||||||
|
, mds405 = [|pack "405"|]
|
||||||
} resources
|
} resources
|
||||||
return
|
return
|
||||||
$ InstanceD
|
$ InstanceD
|
||||||
@ -114,9 +114,6 @@ postLoginR i = pack $ "post login: " ++ show i
|
|||||||
getTableR :: Int -> Text -> Handler sub master Text
|
getTableR :: Int -> Text -> Handler sub master Text
|
||||||
getTableR _ t = append "TableR " t
|
getTableR _ t = append "TableR " t
|
||||||
|
|
||||||
instance RunHandler Hierarchy master where
|
|
||||||
runHandler h Env {..} _ = (toText h, fmap envToMaster envRoute)
|
|
||||||
|
|
||||||
hierarchy :: Spec
|
hierarchy :: Spec
|
||||||
hierarchy = describe "hierarchy" $ do
|
hierarchy = describe "hierarchy" $ do
|
||||||
it "renders root correctly" $
|
it "renders root correctly" $
|
||||||
@ -124,11 +121,8 @@ hierarchy = describe "hierarchy" $ do
|
|||||||
it "renders table correctly" $
|
it "renders table correctly" $
|
||||||
renderRoute (AdminR 6 $ TableR "foo") @?= (["admin", "6", "table", "foo"], [])
|
renderRoute (AdminR 6 $ TableR "foo") @?= (["admin", "6", "table", "foo"], [])
|
||||||
let disp m ps = dispatcher
|
let disp m ps = dispatcher
|
||||||
(const (pack "404", Nothing))
|
(Env
|
||||||
(\route -> const (pack "405", Just route))
|
{ envToMaster = id
|
||||||
(\route -> Env
|
|
||||||
{ envRoute = Just route
|
|
||||||
, envToMaster = id
|
|
||||||
, envMaster = Hierarchy
|
, envMaster = Hierarchy
|
||||||
, envSub = Hierarchy
|
, envSub = Hierarchy
|
||||||
})
|
})
|
||||||
|
|||||||
@ -110,11 +110,12 @@ do
|
|||||||
rrinst <- mkRenderRouteInstance (ConT ''MyApp) ress
|
rrinst <- mkRenderRouteInstance (ConT ''MyApp) ress
|
||||||
dispatch <- mkDispatchClause MkDispatchSettings
|
dispatch <- mkDispatchClause MkDispatchSettings
|
||||||
{ mdsRunHandler = [|runHandler|]
|
{ mdsRunHandler = [|runHandler|]
|
||||||
, mdsDispatcher = [|dispatcher|]
|
, mdsSubDispatcher = [|subDispatch dispatcher|]
|
||||||
, mdsFixEnv = [|fixEnv|]
|
|
||||||
, mdsGetPathInfo = [|fst|]
|
, mdsGetPathInfo = [|fst|]
|
||||||
, mdsMethod = [|snd|]
|
, mdsMethod = [|snd|]
|
||||||
, mdsSetPathInfo = [|\p (_, m) -> (p, m)|]
|
, mdsSetPathInfo = [|\p (_, m) -> (p, m)|]
|
||||||
|
, mds404 = [|pack "404"|]
|
||||||
|
, mds405 = [|pack "405"|]
|
||||||
} ress
|
} ress
|
||||||
return
|
return
|
||||||
$ InstanceD
|
$ InstanceD
|
||||||
@ -125,30 +126,25 @@ do
|
|||||||
[FunD (mkName "dispatcher") [dispatch]]
|
[FunD (mkName "dispatcher") [dispatch]]
|
||||||
: rrinst
|
: rrinst
|
||||||
|
|
||||||
instance RunHandler MyApp master where
|
|
||||||
runHandler h Env {..} = const (toText h, fmap envToMaster envRoute)
|
|
||||||
|
|
||||||
instance Dispatcher MySub master where
|
instance Dispatcher MySub master where
|
||||||
dispatcher _404 _405 getEnv (pieces, _method) =
|
dispatcher env (pieces, _method) =
|
||||||
( pack $ "subsite: " ++ show pieces
|
( pack $ "subsite: " ++ show pieces
|
||||||
, Just $ envToMaster env route
|
, Just $ envToMaster env route
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
route = MySubRoute (pieces, [])
|
route = MySubRoute (pieces, [])
|
||||||
env = getEnv route
|
|
||||||
|
|
||||||
instance Dispatcher MySubParam master where
|
instance Dispatcher MySubParam master where
|
||||||
dispatcher app404 _405 getEnv (pieces, method) =
|
dispatcher env (pieces, method) =
|
||||||
case map unpack pieces of
|
case map unpack pieces of
|
||||||
[[c]] ->
|
[[c]] ->
|
||||||
let route = ParamRoute c
|
let route = ParamRoute c
|
||||||
env = getEnv route
|
|
||||||
toMaster = envToMaster env
|
toMaster = envToMaster env
|
||||||
MySubParam i = envSub env
|
MySubParam i = envSub env
|
||||||
in ( pack $ "subparam " ++ show i ++ ' ' : [c]
|
in ( pack $ "subparam " ++ show i ++ ' ' : [c]
|
||||||
, Just $ toMaster route
|
, Just $ toMaster route
|
||||||
)
|
)
|
||||||
_ -> app404 (pieces, method)
|
_ -> (pack "404", Nothing)
|
||||||
|
|
||||||
{-
|
{-
|
||||||
thDispatchAlias
|
thDispatchAlias
|
||||||
@ -255,11 +251,8 @@ main = hspec $ do
|
|||||||
|
|
||||||
describe "thDispatch" $ do
|
describe "thDispatch" $ do
|
||||||
let disp m ps = dispatcher
|
let disp m ps = dispatcher
|
||||||
(const (pack "404", Nothing))
|
(Env
|
||||||
((\route -> const (pack "405", Just route)))
|
{ envToMaster = id
|
||||||
(\route -> Env
|
|
||||||
{ envRoute = Just route
|
|
||||||
, envToMaster = id
|
|
||||||
, envMaster = MyApp
|
, envMaster = MyApp
|
||||||
, envSub = MyApp
|
, envSub = MyApp
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user