Expose SIO type
This commit is contained in:
parent
d831b9f108
commit
60d0748834
@ -1,5 +1,9 @@
|
|||||||
# ChangeLog for yesod-test
|
# ChangeLog for yesod-test
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
* Add `Yesod.Test.Internal.SIO` module to expose the `SIO` type.
|
||||||
|
|
||||||
## 1.6.12
|
## 1.6.12
|
||||||
|
|
||||||
* Fix import in cookie example [#1713](https://github.com/yesodweb/yesod/pull/1713)
|
* Fix import in cookie example [#1713](https://github.com/yesodweb/yesod/pull/1713)
|
||||||
|
|||||||
@ -243,10 +243,7 @@ import Data.CaseInsensitive (CI)
|
|||||||
import qualified Data.CaseInsensitive as CI
|
import qualified Data.CaseInsensitive as CI
|
||||||
import Network.Wai
|
import Network.Wai
|
||||||
import Network.Wai.Test hiding (assertHeader, assertNoHeader, request)
|
import Network.Wai.Test hiding (assertHeader, assertNoHeader, request)
|
||||||
import Control.Monad.Trans.Reader (ReaderT (..))
|
|
||||||
import Conduit (MonadThrow)
|
|
||||||
import Control.Monad.IO.Class
|
import Control.Monad.IO.Class
|
||||||
import qualified Control.Monad.State.Class as MS
|
|
||||||
import System.IO
|
import System.IO
|
||||||
import Yesod.Core.Unsafe (runFakeHandler)
|
import Yesod.Core.Unsafe (runFakeHandler)
|
||||||
import Yesod.Test.TransversingCSS
|
import Yesod.Test.TransversingCSS
|
||||||
@ -257,7 +254,6 @@ import Text.XML.Cursor hiding (element)
|
|||||||
import qualified Text.XML.Cursor as C
|
import qualified Text.XML.Cursor as C
|
||||||
import qualified Text.HTML.DOM as HD
|
import qualified Text.HTML.DOM as HD
|
||||||
import Control.Monad.Trans.Writer
|
import Control.Monad.Trans.Writer
|
||||||
import Data.IORef
|
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
import qualified Web.Cookie as Cookie
|
import qualified Web.Cookie as Cookie
|
||||||
import qualified Blaze.ByteString.Builder as Builder
|
import qualified Blaze.ByteString.Builder as Builder
|
||||||
@ -281,6 +277,7 @@ import Data.Aeson (FromJSON, eitherDecode')
|
|||||||
import Control.Monad (unless)
|
import Control.Monad (unless)
|
||||||
|
|
||||||
import Yesod.Test.Internal (getBodyTextPreview, contentTypeHeaderIsUtf8)
|
import Yesod.Test.Internal (getBodyTextPreview, contentTypeHeaderIsUtf8)
|
||||||
|
import Yesod.Test.Internal.SIO
|
||||||
|
|
||||||
{-# DEPRECATED byLabel "This function seems to have multiple bugs (ref: https://github.com/yesodweb/yesod/pull/1459). Use byLabelExact, byLabelContain, byLabelPrefix or byLabelSuffix instead" #-}
|
{-# DEPRECATED byLabel "This function seems to have multiple bugs (ref: https://github.com/yesodweb/yesod/pull/1459). Use byLabelExact, byLabelContain, byLabelPrefix or byLabelSuffix instead" #-}
|
||||||
{-# DEPRECATED fileByLabel "This function seems to have multiple bugs (ref: https://github.com/yesodweb/yesod/pull/1459). Use fileByLabelExact, fileByLabelContain, fileByLabelPrefix or fileByLabelSuffix instead" #-}
|
{-# DEPRECATED fileByLabel "This function seems to have multiple bugs (ref: https://github.com/yesodweb/yesod/pull/1459). Use fileByLabelExact, fileByLabelContain, fileByLabelPrefix or fileByLabelSuffix instead" #-}
|
||||||
@ -431,7 +428,7 @@ yit :: String -> YesodExample site () -> YesodSpec site
|
|||||||
yit label example = tell [YesodSpecItem label example]
|
yit label example = tell [YesodSpecItem label example]
|
||||||
|
|
||||||
-- | Modifies the site ('yedSite') of the test, and creates a new WAI app ('yedApp') for it.
|
-- | Modifies the site ('yedSite') of the test, and creates a new WAI app ('yedApp') for it.
|
||||||
--
|
--
|
||||||
-- yesod-test allows sending requests to your application to test that it handles them correctly.
|
-- yesod-test allows sending requests to your application to test that it handles them correctly.
|
||||||
-- In rare cases, you may wish to modify that application in the middle of a test.
|
-- In rare cases, you may wish to modify that application in the middle of a test.
|
||||||
-- This may be useful if you wish to, for example, test your application under a certain configuration,
|
-- This may be useful if you wish to, for example, test your application under a certain configuration,
|
||||||
@ -455,7 +452,7 @@ testModifySite :: YesodDispatch site
|
|||||||
=> (site -> IO (site, Middleware)) -- ^ A function from the existing site, to a new site and middleware for a WAI app.
|
=> (site -> IO (site, Middleware)) -- ^ A function from the existing site, to a new site and middleware for a WAI app.
|
||||||
-> YesodExample site ()
|
-> YesodExample site ()
|
||||||
testModifySite newSiteFn = do
|
testModifySite newSiteFn = do
|
||||||
currentSite <- getTestYesod
|
currentSite <- getTestYesod
|
||||||
(newSite, middleware) <- liftIO $ newSiteFn currentSite
|
(newSite, middleware) <- liftIO $ newSiteFn currentSite
|
||||||
app <- liftIO $ toWaiAppPlain newSite
|
app <- liftIO $ toWaiAppPlain newSite
|
||||||
modifySIO $ \yed -> yed { yedSite = newSite, yedApp = middleware app }
|
modifySIO $ \yed -> yed { yedSite = newSite, yedApp = middleware app }
|
||||||
@ -812,7 +809,7 @@ printMatches query = do
|
|||||||
matches <- htmlQuery query
|
matches <- htmlQuery query
|
||||||
liftIO $ hPutStrLn stderr $ show matches
|
liftIO $ hPutStrLn stderr $ show matches
|
||||||
|
|
||||||
-- | Add a parameter with the given name and value to the request body.
|
-- | Add a parameter with the given name and value to the request body.
|
||||||
-- This function can be called multiple times to add multiple parameters, and be mixed with calls to 'addFile'.
|
-- This function can be called multiple times to add multiple parameters, and be mixed with calls to 'addFile'.
|
||||||
--
|
--
|
||||||
-- "Post parameter" is an informal description of what is submitted by making an HTTP POST with an HTML @\<form\>@.
|
-- "Post parameter" is an informal description of what is submitted by making an HTTP POST with an HTML @\<form\>@.
|
||||||
@ -1367,7 +1364,7 @@ setUrl url' = do
|
|||||||
-- > get "/foobar"
|
-- > get "/foobar"
|
||||||
-- > clickOn "a#idofthelink"
|
-- > clickOn "a#idofthelink"
|
||||||
--
|
--
|
||||||
-- @since 1.5.7
|
-- @since 1.5.7
|
||||||
clickOn :: (HasCallStack, Yesod site) => Query -> YesodExample site ()
|
clickOn :: (HasCallStack, Yesod site) => Query -> YesodExample site ()
|
||||||
clickOn query = do
|
clickOn query = do
|
||||||
withResponse' yedResponse ["Tried to invoke clickOn in order to read HTML of a previous response."] $ \ res ->
|
withResponse' yedResponse ["Tried to invoke clickOn in order to read HTML of a previous response."] $ \ res ->
|
||||||
@ -1596,32 +1593,3 @@ instance YesodDispatch site => Hspec.Example (SIO (YesodExampleData site) a) whe
|
|||||||
return ())
|
return ())
|
||||||
params
|
params
|
||||||
($ ())
|
($ ())
|
||||||
|
|
||||||
-- | State + IO
|
|
||||||
--
|
|
||||||
-- @since 1.6.0
|
|
||||||
newtype SIO s a = SIO (ReaderT (IORef s) IO a)
|
|
||||||
deriving (Functor, Applicative, Monad, MonadIO, MonadThrow, MonadUnliftIO)
|
|
||||||
|
|
||||||
instance MS.MonadState s (SIO s)
|
|
||||||
where
|
|
||||||
get = getSIO
|
|
||||||
put = putSIO
|
|
||||||
|
|
||||||
getSIO :: SIO s s
|
|
||||||
getSIO = SIO $ ReaderT readIORef
|
|
||||||
|
|
||||||
putSIO :: s -> SIO s ()
|
|
||||||
putSIO s = SIO $ ReaderT $ \ref -> writeIORef ref $! s
|
|
||||||
|
|
||||||
modifySIO :: (s -> s) -> SIO s ()
|
|
||||||
modifySIO f = SIO $ ReaderT $ \ref -> modifyIORef' ref f
|
|
||||||
|
|
||||||
evalSIO :: SIO s a -> s -> IO a
|
|
||||||
evalSIO (SIO (ReaderT f)) s = newIORef s >>= f
|
|
||||||
|
|
||||||
execSIO :: SIO s () -> s -> IO s
|
|
||||||
execSIO (SIO (ReaderT f)) s = do
|
|
||||||
ref <- newIORef s
|
|
||||||
f ref
|
|
||||||
readIORef ref
|
|
||||||
|
|||||||
54
yesod-test/Yesod/Test/Internal/SIO.hs
Normal file
54
yesod-test/Yesod/Test/Internal/SIO.hs
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE CPP #-}
|
||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
{-# LANGUAGE RecordWildCards #-}
|
||||||
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
|
{-# LANGUAGE ImplicitParams #-}
|
||||||
|
{-# LANGUAGE ConstraintKinds #-}
|
||||||
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
||||||
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
|
||||||
|
-- | The 'SIO' type is used by "Yesod.Test" to provide exception-safe
|
||||||
|
-- environment between requests and assertions.
|
||||||
|
--
|
||||||
|
-- This module is internal. Breaking changes to this module will not be
|
||||||
|
-- reflected in the major version of this package.
|
||||||
|
--
|
||||||
|
-- @since TODO
|
||||||
|
module Yesod.Test.Internal.SIO where
|
||||||
|
|
||||||
|
import Control.Monad.Trans.Reader (ReaderT (..))
|
||||||
|
import Conduit (MonadThrow)
|
||||||
|
import qualified Control.Monad.State.Class as MS
|
||||||
|
import Yesod.Core
|
||||||
|
import Data.IORef
|
||||||
|
|
||||||
|
-- | State + IO
|
||||||
|
--
|
||||||
|
-- @since 1.6.0
|
||||||
|
newtype SIO s a = SIO (ReaderT (IORef s) IO a)
|
||||||
|
deriving (Functor, Applicative, Monad, MonadIO, MonadThrow, MonadUnliftIO)
|
||||||
|
|
||||||
|
instance MS.MonadState s (SIO s)
|
||||||
|
where
|
||||||
|
get = getSIO
|
||||||
|
put = putSIO
|
||||||
|
|
||||||
|
getSIO :: SIO s s
|
||||||
|
getSIO = SIO $ ReaderT readIORef
|
||||||
|
|
||||||
|
putSIO :: s -> SIO s ()
|
||||||
|
putSIO s = SIO $ ReaderT $ \ref -> writeIORef ref $! s
|
||||||
|
|
||||||
|
modifySIO :: (s -> s) -> SIO s ()
|
||||||
|
modifySIO f = SIO $ ReaderT $ \ref -> modifyIORef' ref f
|
||||||
|
|
||||||
|
evalSIO :: SIO s a -> s -> IO a
|
||||||
|
evalSIO (SIO (ReaderT f)) s = newIORef s >>= f
|
||||||
|
|
||||||
|
execSIO :: SIO s () -> s -> IO s
|
||||||
|
execSIO (SIO (ReaderT f)) s = do
|
||||||
|
ref <- newIORef s
|
||||||
|
f ref
|
||||||
|
readIORef ref
|
||||||
@ -46,6 +46,7 @@ library
|
|||||||
Yesod.Test.CssQuery
|
Yesod.Test.CssQuery
|
||||||
Yesod.Test.TransversingCSS
|
Yesod.Test.TransversingCSS
|
||||||
Yesod.Test.Internal
|
Yesod.Test.Internal
|
||||||
|
Yesod.Test.Internal.SIO
|
||||||
ghc-options: -Wall
|
ghc-options: -Wall
|
||||||
|
|
||||||
test-suite test
|
test-suite test
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user