sydtest-yesod 0.0.0.0 → 0.1.0.0
raw patch · 7 files changed
+52/−40 lines, 7 filesdep +networkPVP ok
version bump matches the API change (PVP)
Dependencies added: network
API changes (from Hackage documentation)
- Test.Syd.Yesod.Client: instance Control.Monad.State.Class.MonadState (Test.Syd.Yesod.Client.YesodClientState site) (Test.Syd.Yesod.Client.YesodClientM site)
+ Test.Syd.Yesod: YesodClientState :: !Maybe (Request, Response ByteString) -> !CookieJar -> YesodClientState
+ Test.Syd.Yesod: [yesodClientStateCookies] :: YesodClientState -> !CookieJar
+ Test.Syd.Yesod: [yesodClientStateLast] :: YesodClientState -> !Maybe (Request, Response ByteString)
+ Test.Syd.Yesod: data YesodClientState
+ Test.Syd.Yesod.Client: instance Control.Monad.State.Class.MonadState Test.Syd.Yesod.Client.YesodClientState (Test.Syd.Yesod.Client.YesodClientM site)
+ Test.Syd.Yesod.Client: instance GHC.Generics.Generic (Test.Syd.Yesod.Client.YesodClient site)
+ Test.Syd.Yesod.Client: instance GHC.Generics.Generic Test.Syd.Yesod.Client.YesodClientState
- Test.Syd.Yesod: YesodClient :: !site -> !Manager -> !Int -> YesodClient site
+ Test.Syd.Yesod: YesodClient :: !site -> !Manager -> !PortNumber -> YesodClient site
- Test.Syd.Yesod: YesodClientM :: StateT (YesodClientState site) (ReaderT (YesodClient site) IO) a -> YesodClientM site a
+ Test.Syd.Yesod: YesodClientM :: StateT YesodClientState (ReaderT (YesodClient site) IO) a -> YesodClientM site a
- Test.Syd.Yesod: [unYesodClientM] :: YesodClientM site a -> StateT (YesodClientState site) (ReaderT (YesodClient site) IO) a
+ Test.Syd.Yesod: [unYesodClientM] :: YesodClientM site a -> StateT YesodClientState (ReaderT (YesodClient site) IO) a
- Test.Syd.Yesod: [yesodClientSitePort] :: YesodClient site -> !Int
+ Test.Syd.Yesod: [yesodClientSitePort] :: YesodClient site -> !PortNumber
- Test.Syd.Yesod: yesodClientSetupFunc :: YesodDispatch site => Manager -> SetupFunc site (YesodClient site)
+ Test.Syd.Yesod: yesodClientSetupFunc :: YesodDispatch site => Manager -> site -> SetupFunc (YesodClient site)
- Test.Syd.Yesod: yesodSpecWithSiteSetupFunc :: YesodDispatch site => (Manager -> SetupFunc a site) -> TestDef (Manager : l) (YesodClient site) -> TestDef l a
+ Test.Syd.Yesod: yesodSpecWithSiteSetupFunc :: YesodDispatch site => (Manager -> SetupFunc site) -> TestDef (Manager : outers) (YesodClient site) -> TestDef (Manager : outers) ()
- Test.Syd.Yesod: yesodSpecWithSiteSetupFunc' :: YesodDispatch site => (Manager -> SetupFunc a site) -> TestDef (Manager : l) (YesodClient site) -> TestDef (Manager : l) a
+ Test.Syd.Yesod: yesodSpecWithSiteSetupFunc' :: YesodDispatch site => (Manager -> inner -> SetupFunc site) -> TestDef (Manager : outers) (YesodClient site) -> TestDef (Manager : outers) inner
- Test.Syd.Yesod: yesodSpecWithSiteSupplierWith :: YesodDispatch site => (forall r. (site -> IO r) -> a -> IO r) -> YesodSpec site -> SpecWith a
+ Test.Syd.Yesod: yesodSpecWithSiteSupplierWith :: YesodDispatch site => (forall r. (site -> IO r) -> inner -> IO r) -> YesodSpec site -> SpecWith inner
- Test.Syd.Yesod.Client: YesodClient :: !site -> !Manager -> !Int -> YesodClient site
+ Test.Syd.Yesod.Client: YesodClient :: !site -> !Manager -> !PortNumber -> YesodClient site
- Test.Syd.Yesod.Client: YesodClientM :: StateT (YesodClientState site) (ReaderT (YesodClient site) IO) a -> YesodClientM site a
+ Test.Syd.Yesod.Client: YesodClientM :: StateT YesodClientState (ReaderT (YesodClient site) IO) a -> YesodClientM site a
- Test.Syd.Yesod.Client: YesodClientState :: !Maybe (Request, Response ByteString) -> !CookieJar -> YesodClientState site
+ Test.Syd.Yesod.Client: YesodClientState :: !Maybe (Request, Response ByteString) -> !CookieJar -> YesodClientState
- Test.Syd.Yesod.Client: [unYesodClientM] :: YesodClientM site a -> StateT (YesodClientState site) (ReaderT (YesodClient site) IO) a
+ Test.Syd.Yesod.Client: [unYesodClientM] :: YesodClientM site a -> StateT YesodClientState (ReaderT (YesodClient site) IO) a
- Test.Syd.Yesod.Client: [yesodClientSitePort] :: YesodClient site -> !Int
+ Test.Syd.Yesod.Client: [yesodClientSitePort] :: YesodClient site -> !PortNumber
- Test.Syd.Yesod.Client: [yesodClientStateCookies] :: YesodClientState site -> !CookieJar
+ Test.Syd.Yesod.Client: [yesodClientStateCookies] :: YesodClientState -> !CookieJar
- Test.Syd.Yesod.Client: [yesodClientStateLast] :: YesodClientState site -> !Maybe (Request, Response ByteString)
+ Test.Syd.Yesod.Client: [yesodClientStateLast] :: YesodClientState -> !Maybe (Request, Response ByteString)
- Test.Syd.Yesod.Client: data YesodClientState site
+ Test.Syd.Yesod.Client: data YesodClientState
- Test.Syd.Yesod.Client: initYesodClientState :: YesodClientState site
+ Test.Syd.Yesod.Client: initYesodClientState :: YesodClientState
- Test.Syd.Yesod.Def: yesodClientSetupFunc :: YesodDispatch site => Manager -> SetupFunc site (YesodClient site)
+ Test.Syd.Yesod.Def: yesodClientSetupFunc :: YesodDispatch site => Manager -> site -> SetupFunc (YesodClient site)
- Test.Syd.Yesod.Def: yesodSpecWithSiteSetupFunc :: YesodDispatch site => (Manager -> SetupFunc a site) -> TestDef (Manager : l) (YesodClient site) -> TestDef l a
+ Test.Syd.Yesod.Def: yesodSpecWithSiteSetupFunc :: YesodDispatch site => (Manager -> SetupFunc site) -> TestDef (Manager : outers) (YesodClient site) -> TestDef (Manager : outers) ()
- Test.Syd.Yesod.Def: yesodSpecWithSiteSetupFunc' :: YesodDispatch site => (Manager -> SetupFunc a site) -> TestDef (Manager : l) (YesodClient site) -> TestDef (Manager : l) a
+ Test.Syd.Yesod.Def: yesodSpecWithSiteSetupFunc' :: YesodDispatch site => (Manager -> inner -> SetupFunc site) -> TestDef (Manager : outers) (YesodClient site) -> TestDef (Manager : outers) inner
- Test.Syd.Yesod.Def: yesodSpecWithSiteSupplierWith :: YesodDispatch site => (forall r. (site -> IO r) -> a -> IO r) -> YesodSpec site -> SpecWith a
+ Test.Syd.Yesod.Def: yesodSpecWithSiteSupplierWith :: YesodDispatch site => (forall r. (site -> IO r) -> inner -> IO r) -> YesodSpec site -> SpecWith inner
Files
- blog-example/Example/Blog.hs +2/−0
- blog-example/Example/BlogSpec.hs +3/−12
- src/Test/Syd/Yesod.hs +8/−2
- src/Test/Syd/Yesod/Client.hs +12/−12
- src/Test/Syd/Yesod/Def.hs +24/−12
- src/Test/Syd/Yesod/Request.hs +1/−1
- sydtest-yesod.cabal +2/−1
blog-example/Example/Blog.hs view
@@ -1,6 +1,8 @@+{-# LANGUAGE DataKinds #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-}
blog-example/Example/BlogSpec.hs view
@@ -7,22 +7,13 @@ import Database.Persist (selectList) import Database.Persist.Sql (Entity (..), SqlPersistT) import Example.Blog-import Network.HTTP.Client as HTTP import Test.QuickCheck import Test.Syd import Test.Syd.Persistent.Sqlite import Test.Syd.Yesod --- | A 'SetupFunc' to provide the App and clean up around it.------ The 'HTTP.Manager' here is the one that is used for doing the test requests.--- It is setup only once and it is shared accross tests for performance reasons.--- If you also need an 'HTTP.Manager' in your 'App', then you can use it in your 'SetupFunc' here--- but in this case we don't need it.-appSetupFunc :: HTTP.Manager -> SetupFunc () App-appSetupFunc _ = do- pool <- connectionPoolSetupFunc migrateThoughts- pure $ App {appConnectionPool = pool}+appSupplier :: (App -> IO r) -> IO r+appSupplier func = withConnectionPool migrateThoughts $ \pool -> func App {appConnectionPool = pool} testDB :: SqlPersistT IO a -> YesodClientM App a testDB func = do@@ -30,7 +21,7 @@ liftIO $ runSqlPool func pool spec :: Spec-spec = yesodSpecWithSiteSetupFunc appSetupFunc $ do+spec = yesodSpecWithSiteSupplier appSupplier $ do -- A simple read-only test: We can request the home page succesfully. yit "can GET the home page" $ do get HomeR
src/Test/Syd/Yesod.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}-{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-} -- | Testing a yesod site. --@@ -23,6 +23,7 @@ -- ** Core YesodSpec, YesodClient (..),+ YesodClientState (..), YesodClientM (..), runYesodClientM, YesodExample,@@ -72,7 +73,12 @@ locationShouldBe, bodyContains, - -- ** Reexports+ -- * Just to be sure we didn't forget any exports+ module Test.Syd.Yesod.Client,+ module Test.Syd.Yesod.Def,+ module Test.Syd.Yesod.Request,++ -- * Reexports module HTTP, ) where
src/Test/Syd/Yesod/Client.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE DataKinds #-}+{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-}@@ -17,9 +18,12 @@ import qualified Data.ByteString.Lazy as LB import Data.Text (Text) import qualified Data.Text as T+import GHC.Generics (Generic) import Network.HTTP.Client as HTTP import Network.HTTP.Types as HTTP+import Network.Socket (PortNumber) import Test.Syd+import Test.Syd.Wai.Client (lastRequestResponseContext) import Yesod.Core as Yesod -- | A client environment to call a Yesod app.@@ -29,19 +33,21 @@ -- | The 'HTTP.Manager' to make the requests yesodClientManager :: !HTTP.Manager, -- | The port that the site is running on, using @warp@- yesodClientSitePort :: !Int+ yesodClientSitePort :: !PortNumber }+ deriving (Generic) -- | The state that is maintained throughout a 'YesodClientM'-data YesodClientState site = YesodClientState+data YesodClientState = YesodClientState { -- | The last request and response pair yesodClientStateLast :: !(Maybe (Request, Response LB.ByteString)), -- | The cookies to pass along yesodClientStateCookies :: !CookieJar }+ deriving (Generic) -- | The starting point of the 'YesodClientState site' of a 'YesodClientM site'-initYesodClientState :: YesodClientState site+initYesodClientState :: YesodClientState initYesodClientState = YesodClientState { yesodClientStateLast = Nothing,@@ -52,7 +58,7 @@ -- -- This has access to a 'YesodClient site'. newtype YesodClientM site a = YesodClientM- { unYesodClientM :: StateT (YesodClientState site) (ReaderT (YesodClient site) IO) a+ { unYesodClientM :: StateT YesodClientState (ReaderT (YesodClient site) IO) a } deriving ( Functor,@@ -60,7 +66,7 @@ Monad, MonadIO, MonadReader (YesodClient site),- MonadState (YesodClientState site),+ MonadState YesodClientState, MonadFail, MonadThrow )@@ -113,13 +119,7 @@ YesodClientM $ do s <- get c <- ask- let ctx =- unlines- [ "last request:",- ppShow req,- "full response:",- ppShow resp- ]+ let ctx = lastRequestResponseContext req resp (r, s') <- liftIO $ context ctx $ runReaderT (runStateT func s) c put s' pure r
src/Test/Syd/Yesod/Def.hs view
@@ -21,7 +21,7 @@ ) where -import GHC.Stack+import GHC.Stack (HasCallStack) import Network.HTTP.Client as HTTP import Test.Syd import Test.Syd.Wai@@ -134,23 +134,35 @@ yesodSpecWithSiteSupplier func = yesodSpecWithSiteSupplierWith (\f () -> func f) -- | Using a function that supplies a 'site', based on an inner resource, run a test suite.-yesodSpecWithSiteSupplierWith :: YesodDispatch site => (forall r. (site -> IO r) -> (a -> IO r)) -> YesodSpec site -> SpecWith a-yesodSpecWithSiteSupplierWith func = yesodSpecWithSiteSetupFunc $ \_ -> SetupFunc func+yesodSpecWithSiteSupplierWith :: YesodDispatch site => (forall r. (site -> IO r) -> (inner -> IO r)) -> YesodSpec site -> SpecWith inner+yesodSpecWithSiteSupplierWith func = managerSpec . yesodSpecWithSiteSetupFunc' (\_ inner -> SetupFunc $ \takeSite -> func takeSite inner) -- | Using a function that supplies a 'site', using a 'SetupFunc'-yesodSpecWithSiteSetupFunc :: YesodDispatch site => (HTTP.Manager -> SetupFunc a site) -> TestDef (HTTP.Manager ': l) (YesodClient site) -> TestDef l a-yesodSpecWithSiteSetupFunc setupFunc = managerSpec . yesodSpecWithSiteSetupFunc' setupFunc+--+-- This function assumed that you've already set up the 'HTTP.Manager' beforehand using something like 'managerSpec'.+yesodSpecWithSiteSetupFunc ::+ YesodDispatch site =>+ (HTTP.Manager -> SetupFunc site) ->+ TestDef (HTTP.Manager ': outers) (YesodClient site) ->+ TestDef (HTTP.Manager ': outers) ()+yesodSpecWithSiteSetupFunc setupFunc = yesodSpecWithSiteSetupFunc' $ \man () -> setupFunc man --- | Using a function that supplies a 'site', using a 'SetupFunc' but without setting up the 'HTTP.Manager' beforehand.+-- | Using a function that supplies a 'site', using a 'SetupFunc'. -- -- This function assumed that you've already set up the 'HTTP.Manager' beforehand using something like 'managerSpec'.-yesodSpecWithSiteSetupFunc' :: YesodDispatch site => (HTTP.Manager -> SetupFunc a site) -> TestDef (HTTP.Manager ': l) (YesodClient site) -> TestDef (HTTP.Manager ': l) a-yesodSpecWithSiteSetupFunc' setupFunc = setupAroundWith' (\man -> setupFunc man `connectSetupFunc` yesodClientSetupFunc man)+yesodSpecWithSiteSetupFunc' ::+ YesodDispatch site =>+ (HTTP.Manager -> inner -> SetupFunc site) ->+ TestDef (HTTP.Manager ': outers) (YesodClient site) ->+ TestDef (HTTP.Manager ': outers) inner+yesodSpecWithSiteSetupFunc' setupFunc = setupAroundWith' $ \man inner -> do+ site <- setupFunc man inner+ yesodClientSetupFunc man site -yesodClientSetupFunc :: YesodDispatch site => HTTP.Manager -> SetupFunc site (YesodClient site)-yesodClientSetupFunc man = wrapSetupFunc $ \site -> do+yesodClientSetupFunc :: YesodDispatch site => HTTP.Manager -> site -> SetupFunc (YesodClient site)+yesodClientSetupFunc man site = do application <- liftIO $ Yesod.toWaiAppPlain site- p <- unwrapSetupFunc applicationSetupFunc application+ p <- applicationSetupFunc application let client = YesodClient { yesodClientManager = man,@@ -175,7 +187,7 @@ YesodSpec site yit s f = it s ((\cenv -> runYesodClientM cenv f) :: YesodClient site -> IO e) --- | For backward compatibility+-- | For compatibility with `yesod-test` -- -- > ydescribe = describe ydescribe :: String -> YesodSpec site -> YesodSpec site
src/Test/Syd/Yesod/Request.hs view
@@ -209,7 +209,7 @@ let (req', cj') = insertCookiesIntoRequest ( req- { port = p,+ { port = fromIntegral p, -- Safe because it is PortNumber -> Int method = requestBuilderDataMethod, requestHeaders = concat
sydtest-yesod.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: sydtest-yesod-version: 0.0.0.0+version: 0.1.0.0 synopsis: A yesod companion library for sydtest category: Testing homepage: https://github.com/NorfairKing/sydtest#readme@@ -42,6 +42,7 @@ , http-client , http-types , mtl+ , network , pretty-show , sydtest , sydtest-wai