diff --git a/yesod-test/ChangeLog.md b/yesod-test/ChangeLog.md index 8fa21c843..a24f9c2f4 100644 --- a/yesod-test/ChangeLog.md +++ b/yesod-test/ChangeLog.md @@ -1,5 +1,8 @@ # ChangeLog for yesod-test +## 1.6.16 + +* Add `htmlAnyContainPreEscaped`, `htmlAllContainPreEscaped`, `htmlNoneContainPreEscaped`. [#1786](https://github.com/yesodweb/yesod/pull/1786) ## 1.6.15 diff --git a/yesod-test/Yesod/Test.hs b/yesod-test/Yesod/Test.hs index 91884608c..a313b6463 100644 --- a/yesod-test/Yesod/Test.hs +++ b/yesod-test/Yesod/Test.hs @@ -204,6 +204,9 @@ module Yesod.Test , htmlAllContain , htmlAnyContain , htmlNoneContain + , htmlAllContainPreEscaped + , htmlAnyContainPreEscaped + , htmlNoneContainPreEscaped , htmlCount , requireJSONResponse @@ -754,6 +757,61 @@ htmlNoneContain query search = do found -> failure $ "Found " <> T.pack (show $ length found) <> " instances of " <> T.pack search <> " in " <> query <> " elements" +-- | Queries the HTML using a CSS selector, and all matched elements must contain +-- the given string verbatim. +-- +-- ==== __Examples__ +-- +-- > {-# LANGUAGE OverloadedStrings #-} +-- > get HomeR +-- > htmlAllContainPreEscaped "meta" " "content=\"site description\"" -- Every tag contains the string "content=site description" verbatim +-- +-- Since 16.6.6 +htmlAllContainPreEscaped :: HasCallStack => Query -> String -> YesodExample site () +htmlAllContainPreEscaped query search = do + matches <- htmlQuery query + case matches of + [] -> failure $ "Nothing matched css query: " <> query + _ -> liftIO $ HUnit.assertBool ("Not all "++T.unpack query++" contain "++search ++ " matches: " ++ show matches) $ + DL.all (DL.isInfixOf search) (map (TL.unpack . decodeUtf8) matches) + +-- | Queries the HTML using a CSS selector, and passes if any matched +-- element contains the given string verbatim. +-- +-- ==== __Examples__ +-- +-- > {-# LANGUAGE OverloadedStrings #-} +-- > get HomeR +-- > htmlAnyContainPreEscaped "meta" "content=\"site description\"" -- At least one tag contains the string "content=site description" verbatim +-- +-- Since 16.6.6 +htmlAnyContainPreEscaped :: HasCallStack => Query -> String -> YesodExample site () +htmlAnyContainPreEscaped query search = do + matches <- htmlQuery query + case matches of + [] -> failure $ "Nothing matched css query: " <> query + _ -> liftIO $ HUnit.assertBool ("None of "++T.unpack query++" contain "++search ++ " matches: " ++ show matches) $ + DL.any (DL.isInfixOf search) (map (TL.unpack . decodeUtf8) matches) + +-- | Queries the HTML using a CSS selector, and fails if any matched +-- element contains the given string verbatim (in other words, it is +-- the logical inverse of htmlAnyContainPreEscaped). +-- +-- ==== __Examples__ +-- +-- > {-# LANGUAGE OverloadedStrings #-} +-- > get HomeR +-- > htmlNoneContainPreEscaped "meta" "content=\"site description\"" -- No tag contains the string "content=site description" verbatim +-- +-- Since 16.6.6 +htmlNoneContainPreEscaped :: HasCallStack => Query -> String -> YesodExample site () +htmlNoneContainPreEscaped query search = do + matches <- htmlQuery query + case DL.filter (DL.isInfixOf search) (map (TL.unpack . decodeUtf8) matches) of + [] -> return () + found -> failure $ "Found " <> T.pack (show $ length found) <> + " instances of " <> T.pack search <> " in " <> query <> " elements" + -- | Performs a CSS query on the last response and asserts the matched elements -- are as many as expected. -- diff --git a/yesod-test/test/main.hs b/yesod-test/test/main.hs index 4276c8500..62711a677 100644 --- a/yesod-test/test/main.hs +++ b/yesod-test/test/main.hs @@ -201,6 +201,9 @@ main = hspec $ do yit "finding html" $ do get ("/html" :: Text) statusIs 200 + htmlAnyContainPreEscaped "meta" "content=\"site description\"" + htmlAllContainPreEscaped "meta" "content=\"site description" + htmlNoneContainPreEscaped "meta" "foobar" htmlCount "p" 2 htmlAllContain "p" "Hello" htmlAllContain "span" "O'Kon" @@ -230,7 +233,7 @@ main = hspec $ do get ("/htmlWithLink" :: Text) clickOn "a#thelink" statusIs 200 - bodyEquals "Hello

Hello World

Hello Moon and O'Kon

" + bodyEquals "Hello

Hello World

Hello Moon and O'Kon

" get ("/htmlWithLink" :: Text) bad <- tryAny (clickOn "a#nonexistentlink") @@ -579,7 +582,7 @@ app = liteApp $ do FormSuccess (foo, _) -> return $ toHtml foo _ -> defaultLayout widget onStatic "html" $ dispatchTo $ - return ("Hello

Hello World

Hello Moon and O'Kon

" :: Text) + return ("Hello

Hello World

Hello Moon and O'Kon

" :: Text) onStatic "htmlWithLink" $ dispatchTo $ return ("A linkLink!" :: Text) diff --git a/yesod-test/yesod-test.cabal b/yesod-test/yesod-test.cabal index 0e8f9f09e..c659ddef0 100644 --- a/yesod-test/yesod-test.cabal +++ b/yesod-test/yesod-test.cabal @@ -1,5 +1,5 @@ name: yesod-test -version: 1.6.15 +version: 1.6.16 license: MIT license-file: LICENSE author: Nubis