{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}
module Test.Syd.Yesod.Def
( yesodSpec,
yesodSpecWithSiteGenerator,
yesodSpecWithSiteGeneratorAndArgument,
yesodSpecWithSiteSupplier,
yesodSpecWithSiteSupplierWith,
yesodSpecWithSiteSetupFunc,
yesodSpecWithSiteSetupFunc',
yesodClientSetupFunc,
YesodSpec,
yit,
ydescribe,
)
where
import GHC.Stack (HasCallStack)
import Network.HTTP.Client as HTTP
import Network.URI
import Test.Syd
import Test.Syd.Wai
import Test.Syd.Yesod.Client
import Yesod.Core as Yesod
yesodSpec :: YesodDispatch site => site -> YesodSpec site -> Spec
yesodSpec :: forall site. YesodDispatch site => site -> YesodSpec site -> Spec
yesodSpec site
site = forall site.
YesodDispatch site =>
IO site -> YesodSpec site -> Spec
yesodSpecWithSiteGenerator forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Applicative f => a -> f a
pure site
site
yesodSpecWithSiteGenerator :: YesodDispatch site => IO site -> YesodSpec site -> Spec
yesodSpecWithSiteGenerator :: forall site.
YesodDispatch site =>
IO site -> YesodSpec site -> Spec
yesodSpecWithSiteGenerator IO site
siteGen = forall site a.
YesodDispatch site =>
(a -> IO site) -> YesodSpec site -> SpecWith a
yesodSpecWithSiteGeneratorAndArgument forall a b. (a -> b) -> a -> b
$ \() -> IO site
siteGen
yesodSpecWithSiteGeneratorAndArgument :: YesodDispatch site => (a -> IO site) -> YesodSpec site -> SpecWith a
yesodSpecWithSiteGeneratorAndArgument :: forall site a.
YesodDispatch site =>
(a -> IO site) -> YesodSpec site -> SpecWith a
yesodSpecWithSiteGeneratorAndArgument a -> IO site
func = forall site inner.
YesodDispatch site =>
(forall r. (site -> IO r) -> inner -> IO r)
-> YesodSpec site -> SpecWith inner
yesodSpecWithSiteSupplierWith forall a b. (a -> b) -> a -> b
$ \site -> IO r
f a
a -> a -> IO site
func a
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= site -> IO r
f
yesodSpecWithSiteSupplier :: YesodDispatch site => (forall r. (site -> IO r) -> IO r) -> YesodSpec site -> Spec
yesodSpecWithSiteSupplier :: forall site.
YesodDispatch site =>
(forall r. (site -> IO r) -> IO r) -> YesodSpec site -> Spec
yesodSpecWithSiteSupplier forall r. (site -> IO r) -> IO r
func = forall site inner.
YesodDispatch site =>
(forall r. (site -> IO r) -> inner -> IO r)
-> YesodSpec site -> SpecWith inner
yesodSpecWithSiteSupplierWith (\site -> IO r
f () -> forall r. (site -> IO r) -> IO r
func site -> IO r
f)
yesodSpecWithSiteSupplierWith :: YesodDispatch site => (forall r. (site -> IO r) -> (inner -> IO r)) -> YesodSpec site -> SpecWith inner
yesodSpecWithSiteSupplierWith :: forall site inner.
YesodDispatch site =>
(forall r. (site -> IO r) -> inner -> IO r)
-> YesodSpec site -> SpecWith inner
yesodSpecWithSiteSupplierWith forall r. (site -> IO r) -> inner -> IO r
func = forall (outers :: [*]) inner result.
TestDefM (Manager : outers) inner result
-> TestDefM outers inner result
managerSpec forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall site inner (outers :: [*]).
YesodDispatch site =>
(Manager -> inner -> SetupFunc site)
-> TestDef (Manager : outers) (YesodClient site)
-> TestDef (Manager : outers) inner
yesodSpecWithSiteSetupFunc' (\Manager
_ inner
inner -> forall resource.
(forall r. (resource -> IO r) -> IO r) -> SetupFunc resource
SetupFunc forall a b. (a -> b) -> a -> b
$ \site -> IO r
takeSite -> forall r. (site -> IO r) -> inner -> IO r
func site -> IO r
takeSite inner
inner)
yesodSpecWithSiteSetupFunc ::
YesodDispatch site =>
(HTTP.Manager -> SetupFunc site) ->
TestDef (HTTP.Manager ': outers) (YesodClient site) ->
TestDef (HTTP.Manager ': outers) ()
yesodSpecWithSiteSetupFunc :: forall site (outers :: [*]).
YesodDispatch site =>
(Manager -> SetupFunc site)
-> TestDef (Manager : outers) (YesodClient site)
-> TestDef (Manager : outers) ()
yesodSpecWithSiteSetupFunc Manager -> SetupFunc site
setupFunc = forall site inner (outers :: [*]).
YesodDispatch site =>
(Manager -> inner -> SetupFunc site)
-> TestDef (Manager : outers) (YesodClient site)
-> TestDef (Manager : outers) inner
yesodSpecWithSiteSetupFunc' forall a b. (a -> b) -> a -> b
$ \Manager
man () -> Manager -> SetupFunc site
setupFunc Manager
man
yesodSpecWithSiteSetupFunc' ::
YesodDispatch site =>
(HTTP.Manager -> inner -> SetupFunc site) ->
TestDef (HTTP.Manager ': outers) (YesodClient site) ->
TestDef (HTTP.Manager ': outers) inner
yesodSpecWithSiteSetupFunc' :: forall site inner (outers :: [*]).
YesodDispatch site =>
(Manager -> inner -> SetupFunc site)
-> TestDef (Manager : outers) (YesodClient site)
-> TestDef (Manager : outers) inner
yesodSpecWithSiteSetupFunc' Manager -> inner -> SetupFunc site
setupFunc = forall (outers :: [*]) outer oldInner newInner result.
HContains outers outer =>
(outer -> oldInner -> SetupFunc newInner)
-> TestDefM outers newInner result
-> TestDefM outers oldInner result
setupAroundWith' forall a b. (a -> b) -> a -> b
$ \Manager
man inner
inner -> do
site
site <- Manager -> inner -> SetupFunc site
setupFunc Manager
man inner
inner
forall site.
YesodDispatch site =>
Manager -> site -> SetupFunc (YesodClient site)
yesodClientSetupFunc Manager
man site
site
yesodClientSetupFunc :: YesodDispatch site => HTTP.Manager -> site -> SetupFunc (YesodClient site)
yesodClientSetupFunc :: forall site.
YesodDispatch site =>
Manager -> site -> SetupFunc (YesodClient site)
yesodClientSetupFunc Manager
man site
site = do
Application
application <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall site. YesodDispatch site => site -> IO Application
Yesod.toWaiAppPlain site
site
PortNumber
p <- Application -> SetupFunc PortNumber
applicationSetupFunc Application
application
let client :: YesodClient site
client =
YesodClient
{ yesodClientManager :: Manager
yesodClientManager = Manager
man,
yesodClientSite :: site
yesodClientSite = site
site,
yesodClientSiteURI :: URI
yesodClientSiteURI =
URI
nullURI
{ uriScheme :: String
uriScheme = String
"http:",
uriAuthority :: Maybe URIAuth
uriAuthority =
forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
URIAuth
{ uriUserInfo :: String
uriUserInfo = String
"",
uriRegName :: String
uriRegName = String
"localhost",
uriPort :: String
uriPort = Char
':' forall a. a -> [a] -> [a]
: forall a. Show a => a -> String
show PortNumber
p
}
}
}
forall (f :: * -> *) a. Applicative f => a -> f a
pure YesodClient site
client
type YesodSpec site = TestDef '[HTTP.Manager] (YesodClient site)
yit ::
forall site.
HasCallStack =>
String ->
YesodClientM site () ->
YesodSpec site
yit :: forall site.
HasCallStack =>
String -> YesodClientM site () -> YesodSpec site
yit = forall (outers :: [*]) inner test.
(HasCallStack, IsTest test, Arg1 test ~ (), Arg2 test ~ inner) =>
String -> test -> TestDefM outers inner ()
it
ydescribe :: String -> YesodSpec site -> YesodSpec site
ydescribe :: forall site. String -> YesodSpec site -> YesodSpec site
ydescribe = forall (outers :: [*]) inner.
String -> TestDefM outers inner () -> TestDefM outers inner ()
describe