Merge pull request #302 from MichaelXavier/yesod-test-more-assertions
Add more assertions to yesod-test
This commit is contained in:
commit
81db921c85
@ -50,14 +50,15 @@ module Yesod.Test (
|
|||||||
runDB,
|
runDB,
|
||||||
|
|
||||||
-- * Assertions
|
-- * Assertions
|
||||||
assertEqual, statusIs, bodyContains, htmlAllContain, htmlCount,
|
assertEqual, assertHeader, assertNoHeader, statusIs, bodyEquals, bodyContains,
|
||||||
|
htmlAllContain, htmlCount,
|
||||||
|
|
||||||
-- * Utils for debugging tests
|
-- * Utils for debugging tests
|
||||||
printBody, printMatches,
|
printBody, printMatches,
|
||||||
|
|
||||||
-- * Utils for building your own assertions
|
-- * Utils for building your own assertions
|
||||||
-- | Please consider generalizing and contributing the assertions you write.
|
-- | Please consider generalizing and contributing the assertions you write.
|
||||||
htmlQuery, parseHTML
|
htmlQuery, parseHTML, withResponse
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -75,9 +76,10 @@ import qualified Test.HUnit as HUnit
|
|||||||
import qualified Test.Hspec.HUnit ()
|
import qualified Test.Hspec.HUnit ()
|
||||||
import qualified Network.HTTP.Types as H
|
import qualified Network.HTTP.Types as H
|
||||||
import qualified Network.Socket.Internal as Sock
|
import qualified Network.Socket.Internal as Sock
|
||||||
|
import Data.CaseInsensitive (CI)
|
||||||
import Text.XML.HXT.Core hiding (app, err)
|
import Text.XML.HXT.Core hiding (app, err)
|
||||||
import Network.Wai
|
import Network.Wai
|
||||||
import Network.Wai.Test
|
import Network.Wai.Test hiding (assertHeader, assertNoHeader)
|
||||||
import qualified Control.Monad.Trans.State as ST
|
import qualified Control.Monad.Trans.State as ST
|
||||||
import Control.Monad.IO.Class
|
import Control.Monad.IO.Class
|
||||||
import System.IO
|
import System.IO
|
||||||
@ -150,7 +152,8 @@ it label action = do
|
|||||||
return ()
|
return ()
|
||||||
ST.put $ SpecsData app conn (specs++spec)
|
ST.put $ SpecsData app conn (specs++spec)
|
||||||
|
|
||||||
-- Performs a given action using the last response.
|
-- Performs a given action using the last response. Use this to create
|
||||||
|
-- response-level assertions
|
||||||
withResponse :: HoldsResponse a => (SResponse -> ST.StateT a IO b) -> ST.StateT a IO b
|
withResponse :: HoldsResponse a => (SResponse -> ST.StateT a IO b) -> ST.StateT a IO b
|
||||||
withResponse f = maybe err f =<< fmap readResponse ST.get
|
withResponse f = maybe err f =<< fmap readResponse ST.get
|
||||||
where err = failure "There was no response, you should make a request"
|
where err = failure "There was no response, you should make a request"
|
||||||
@ -179,6 +182,45 @@ statusIs number = withResponse $ \ SResponse { simpleStatus = s } ->
|
|||||||
, " but received status was ", show $ H.statusCode s
|
, " but received status was ", show $ H.statusCode s
|
||||||
]
|
]
|
||||||
|
|
||||||
|
-- | Assert the given header key/value pair was returned.
|
||||||
|
assertHeader :: HoldsResponse a => CI BS8.ByteString -> BS8.ByteString -> ST.StateT a IO ()
|
||||||
|
assertHeader header value = withResponse $ \ SResponse { simpleHeaders = h } ->
|
||||||
|
case lookup header h of
|
||||||
|
Nothing -> failure $ concat
|
||||||
|
[ "Expected header "
|
||||||
|
, show header
|
||||||
|
, " to be "
|
||||||
|
, show value
|
||||||
|
, ", but it was not present"
|
||||||
|
]
|
||||||
|
Just value' -> liftIO $ flip HUnit.assertBool (value == value') $ concat
|
||||||
|
[ "Expected header "
|
||||||
|
, show header
|
||||||
|
, " to be "
|
||||||
|
, show value
|
||||||
|
, ", but received "
|
||||||
|
, show value'
|
||||||
|
]
|
||||||
|
|
||||||
|
-- | Assert the given header was not included in the response.
|
||||||
|
assertNoHeader :: HoldsResponse a => CI BS8.ByteString -> ST.StateT a IO ()
|
||||||
|
assertNoHeader header = withResponse $ \ SResponse { simpleHeaders = h } ->
|
||||||
|
case lookup header h of
|
||||||
|
Nothing -> return ()
|
||||||
|
Just s -> failure $ concat
|
||||||
|
[ "Unexpected header "
|
||||||
|
, show header
|
||||||
|
, " containing "
|
||||||
|
, show s
|
||||||
|
]
|
||||||
|
|
||||||
|
-- | Assert the last response is exactly equal to the given text. This is
|
||||||
|
-- useful for testing API responses.
|
||||||
|
bodyEquals :: HoldsResponse a => String -> ST.StateT a IO ()
|
||||||
|
bodyEquals text = withResponse $ \ res ->
|
||||||
|
liftIO $ HUnit.assertBool ("Expected body to equal " ++ text) $
|
||||||
|
(simpleBody res) == BSL8.pack text
|
||||||
|
|
||||||
-- | Assert the last response has the given text. The check is performed using the response
|
-- | Assert the last response has the given text. The check is performed using the response
|
||||||
-- body in full text form.
|
-- body in full text form.
|
||||||
bodyContains :: HoldsResponse a => String -> ST.StateT a IO ()
|
bodyContains :: HoldsResponse a => String -> ST.StateT a IO ()
|
||||||
|
|||||||
@ -32,6 +32,7 @@ library
|
|||||||
, HUnit >= 1.2 && < 1.3
|
, HUnit >= 1.2 && < 1.3
|
||||||
, hspec >= 0.9 && < 1.0
|
, hspec >= 0.9 && < 1.0
|
||||||
, bytestring >= 0.9
|
, bytestring >= 0.9
|
||||||
|
, case-insensitive >= 0.2
|
||||||
, text
|
, text
|
||||||
exposed-modules: Yesod.Test
|
exposed-modules: Yesod.Test
|
||||||
other-modules: Yesod.Test.TransversingCSS
|
other-modules: Yesod.Test.TransversingCSS
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user