yesod-test 1.6.5.1 → 1.6.6
raw patch · 4 files changed
+87/−2 lines, 4 filesnew-uploaderPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Yesod.Test: testClearCookies :: YesodExample site ()
+ Yesod.Test: testDeleteCookie :: ByteString -> YesodExample site ()
+ Yesod.Test: testModifyCookies :: (Cookies -> Cookies) -> YesodExample site ()
+ Yesod.Test: testSetCookie :: SetCookie -> YesodExample site ()
- Yesod.Test: YesodExampleData :: !Application -> !site -> !Cookies -> !(Maybe SResponse) -> YesodExampleData site
+ Yesod.Test: YesodExampleData :: !Application -> !site -> !Cookies -> !Maybe SResponse -> YesodExampleData site
- Yesod.Test: YesodSpecItem :: String -> (YesodExample site ()) -> YesodSpecTree site
+ Yesod.Test: YesodSpecItem :: String -> YesodExample site () -> YesodSpecTree site
- Yesod.Test: [yedResponse] :: YesodExampleData site -> !(Maybe SResponse)
+ Yesod.Test: [yedResponse] :: YesodExampleData site -> !Maybe SResponse
Files
- ChangeLog.md +4/−0
- Yesod/Test.hs +46/−0
- test/main.hs +35/−1
- yesod-test.cabal +2/−1
ChangeLog.md view
@@ -1,3 +1,7 @@+## 1.6.6++* Add utility functions to modify cookies [$1570](https://github.com/yesodweb/yesod/pull/1570)+ ## 1.6.5.1 * Make test suite build with GHC 8.6 [#1561](https://github.com/yesodweb/yesod/pull/1561)
Yesod/Test.hs view
@@ -45,6 +45,12 @@ , ydescribe , yit + -- * Modify test state+ , testSetCookie+ , testDeleteCookie+ , testModifyCookies+ , testClearCookies+ -- * Making requests -- | You can construct requests with the 'RequestBuilder' monad, which lets you -- set the URL and add parameters, headers, and files. Helper functions are provided to@@ -325,6 +331,46 @@ -- | Describe a single test that keeps cookies, and a reference to the last response. yit :: String -> YesodExample site () -> YesodSpec site yit label example = tell [YesodSpecItem label example]++-- | Sets a cookie+--+-- ==== __Examples__+--+-- > import qualified Data.Cookie as Cookie+-- > :set -XOverloadedStrings+-- > testSetCookie Cookie.defaultSetCookie { Cookie.setCookieName = "name" }+--+-- @since 1.6.6+testSetCookie :: Cookie.SetCookie -> YesodExample site ()+testSetCookie cookie = do+ let key = Cookie.setCookieName cookie+ modifySIO $ \yed -> yed { yedCookies = M.insert key cookie (yedCookies yed) }++-- | Deletes the cookie of the given name+--+-- ==== __Examples__+--+-- > :set -XOverloadedStrings+-- > testDeleteCookie "name"+--+-- @since 1.6.6+testDeleteCookie :: ByteString -> YesodExample site ()+testDeleteCookie k = do+ modifySIO $ \yed -> yed { yedCookies = M.delete k (yedCookies yed) }++-- | Modify the current cookies with the given mapping function+--+-- @since 1.6.6+testModifyCookies :: (Cookies -> Cookies) -> YesodExample site ()+testModifyCookies f = do+ modifySIO $ \yed -> yed { yedCookies = f (yedCookies yed) }++-- | Clears the current cookies+--+-- @since 1.6.6+testClearCookies :: YesodExample site ()+testClearCookies = do+ modifySIO $ \yed -> yed { yedCookies = M.empty } -- Performs a given action using the last response. Use this to create -- response-level assertions
test/main.hs view
@@ -38,8 +38,10 @@ import Data.ByteString.Lazy.Char8 () import qualified Data.Map as Map import qualified Text.HTML.DOM as HD-import Network.HTTP.Types.Status (status301, status303, unsupportedMediaType415)+import Network.HTTP.Types.Status (status301, status303, status422, unsupportedMediaType415) import UnliftIO.Exception (tryAny, SomeException, try)+import qualified Web.Cookie as Cookie+import Data.Maybe (isNothing) parseQuery_ :: Text -> [[SelectorGroup]] parseQuery_ = either error id . parseQuery@@ -314,6 +316,33 @@ statusIs 200 printBody bodyContains "Foo"+ yit "should 422 on the cookie named key" $ do+ get ("cookie/check-no-cookie" :: Text)+ statusIs 200+ testSetCookie Cookie.defaultSetCookie { Cookie.setCookieName = "key" }+ get ("cookie/check-no-cookie" :: Text)+ statusIs 422+ yit "should be able to delete a cookie" $ do+ testSetCookie Cookie.defaultSetCookie { Cookie.setCookieName = "key" }+ get ("cookie/check-no-cookie" :: Text)+ statusIs 422+ testDeleteCookie "key"+ get ("cookie/check-no-cookie" :: Text)+ statusIs 200+ yit "should be able to clear all cookies" $ do+ testSetCookie Cookie.defaultSetCookie { Cookie.setCookieName = "key" }+ get ("cookie/check-no-cookie" :: Text)+ statusIs 422+ testClearCookies+ get ("cookie/check-no-cookie" :: Text)+ statusIs 200+ yit "should be able to modify cookies" $ do+ testSetCookie Cookie.defaultSetCookie { Cookie.setCookieName = "key" }+ get ("cookie/check-no-cookie" :: Text)+ statusIs 422+ testModifyCookies (\_ -> Map.empty)+ get ("cookie/check-no-cookie" :: Text)+ statusIs 200 describe "CSRF with cookies/headers" $ yesodSpec RoutedApp $ do yit "Should receive a CSRF cookie and add its value to the headers" $ do get ("/" :: Text)@@ -463,6 +492,11 @@ setMessage "Foo" () <- redirect ("/cookie/home" :: Text) return ()+ onStatic "check-no-cookie" $ dispatchTo $ do+ mCookie <- lookupCookie "key"+ if isNothing mCookie+ then return ()+ else sendResponseStatus status422 () instance Yesod RoutedApp where yesodMiddleware = defaultYesodMiddleware . defaultCsrfMiddleware
yesod-test.cabal view
@@ -1,5 +1,5 @@ name: yesod-test-version: 1.6.5.1+version: 1.6.6 license: MIT license-file: LICENSE author: Nubis <nubis@woobiz.com.ar>@@ -63,6 +63,7 @@ , wai-extra , http-types , unliftio+ , cookie source-repository head type: git