From 62fc67a444b473d28166dd7d8684a861f9dd5376 Mon Sep 17 00:00:00 2001 From: Maxime Bourget Date: Mon, 11 Apr 2016 21:15:27 +0100 Subject: [PATCH 1/3] Fix addToken_ needing a trailing space to work. The fix can add spaces in place where none or only one where expected. The css parser has been modified to remove trailing or multiple spaces. This might be a bit more lax that official CSS spec. --- yesod-test/Yesod/Test.hs | 2 +- yesod-test/Yesod/Test/CssQuery.hs | 4 ++-- yesod-test/test/main.hs | 12 ++++++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/yesod-test/Yesod/Test.hs b/yesod-test/Yesod/Test.hs index 36bbb582..07191788 100644 --- a/yesod-test/Yesod/Test.hs +++ b/yesod-test/Yesod/Test.hs @@ -577,7 +577,7 @@ fileByLabel label path mime = do -- > addToken_ "#formID" addToken_ :: Query -> RequestBuilder site () addToken_ scope = do - matches <- htmlQuery' rbdResponse ["Tried to get CSRF token with addToken'"] $ scope <> "input[name=_token][type=hidden][value]" + matches <- htmlQuery' rbdResponse ["Tried to get CSRF token with addToken'"] $ scope <> " input[name=_token][type=hidden][value]" case matches of [] -> failure $ "No CSRF token found in the current page" element:[] -> addPostParam "_token" $ head $ attribute "value" $ parseHTML element diff --git a/yesod-test/Yesod/Test/CssQuery.hs b/yesod-test/Yesod/Test/CssQuery.hs index 0618da7a..ee37e373 100644 --- a/yesod-test/Yesod/Test/CssQuery.hs +++ b/yesod-test/Yesod/Test/CssQuery.hs @@ -51,14 +51,14 @@ parseQuery = parseOnly cssQuery -- Below this line is the Parsec parser for css queries. cssQuery :: Parser [[SelectorGroup]] -cssQuery = sepBy rules (char ',' >> optional (char ' ')) +cssQuery = many (char ' ') >> sepBy rules (char ',' >> optional (char ' ')) rules :: Parser [SelectorGroup] rules = many $ directChildren <|> deepChildren directChildren :: Parser SelectorGroup directChildren = - string "> " >> DirectChildren <$> pOptionalTrailingSpace parseSelectors + string "> " >> (many (char ' ')) >> DirectChildren <$> pOptionalTrailingSpace parseSelectors deepChildren :: Parser SelectorGroup deepChildren = pOptionalTrailingSpace $ DeepChildren <$> parseSelectors diff --git a/yesod-test/test/main.hs b/yesod-test/test/main.hs index 0ef4354c..9956ca82 100644 --- a/yesod-test/test/main.hs +++ b/yesod-test/test/main.hs @@ -140,6 +140,18 @@ main = hspec $ do htmlAnyContain "p" "World" htmlAnyContain "p" "Moon" htmlNoneContain "p" "Sun" + yit "CSRF token" $ do + get ("/form" :: Text) + statusIs 200 + + request $ do + setMethod "POST" + setUrl ("/form" :: Text) + byLabel "Some Label" "12345" + fileByLabel "Some File" "test/main.hs" "text/plain" + addToken_ "body" + statusIs 200 + bodyEquals "12345" ydescribe "utf8 paths" $ do yit "from path" $ do From 3fecebd5bacbb24ce14ceba8c4eb437077032c58 Mon Sep 17 00:00:00 2001 From: Maxime Bourget Date: Mon, 11 Apr 2016 21:58:50 +0100 Subject: [PATCH 2/3] Allows more that one space between css selector. This is needed to support addToken_ workaround before the fix. Before the fix, an extra space was needed in the selector like this example: addToken "form.foo " With the fix adding the missing space, code already adding a space will end up with two spaces between the scope selector and the input one : form.foo input[name=token_] --- yesod-test/Yesod/Test/CssQuery.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yesod-test/Yesod/Test/CssQuery.hs b/yesod-test/Yesod/Test/CssQuery.hs index ee37e373..f264e1dc 100644 --- a/yesod-test/Yesod/Test/CssQuery.hs +++ b/yesod-test/Yesod/Test/CssQuery.hs @@ -51,7 +51,7 @@ parseQuery = parseOnly cssQuery -- Below this line is the Parsec parser for css queries. cssQuery :: Parser [[SelectorGroup]] -cssQuery = many (char ' ') >> sepBy rules (char ',' >> optional (char ' ')) +cssQuery = many (char ' ') >> sepBy rules (char ',' >> many (char ' ')) rules :: Parser [SelectorGroup] rules = many $ directChildren <|> deepChildren @@ -102,4 +102,4 @@ pSquare :: Parser a -> Parser a pSquare p = char '[' *> p <* char ']' pOptionalTrailingSpace :: Parser a -> Parser a -pOptionalTrailingSpace p = p <* optional (char ' ') +pOptionalTrailingSpace p = p <* many (char ' ') From 6addf3923d4fd17e7cd632b0b64ac378ff480114 Mon Sep 17 00:00:00 2001 From: Maxime Bourget Date: Tue, 12 Apr 2016 21:42:33 +0100 Subject: [PATCH 3/3] Changes spec name and bump version to 1.5.1.1 --- yesod-test/ChangeLog.md | 4 ++++ yesod-test/test/main.hs | 2 +- yesod-test/yesod-test.cabal | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/yesod-test/ChangeLog.md b/yesod-test/ChangeLog.md index f3b2b3a6..a9c52aa4 100644 --- a/yesod-test/ChangeLog.md +++ b/yesod-test/ChangeLog.md @@ -1,3 +1,7 @@ +## 1.5.1.1 + +* Fix `addToken_` needing a trailing space and allows multiples spaces in css selector. + ## 1.5.1.0 * Better error provenance for stuff invoking withResponse' [#1191](https://github.com/yesodweb/yesod/pull/1191) diff --git a/yesod-test/test/main.hs b/yesod-test/test/main.hs index 9956ca82..d97d5339 100644 --- a/yesod-test/test/main.hs +++ b/yesod-test/test/main.hs @@ -140,7 +140,7 @@ main = hspec $ do htmlAnyContain "p" "World" htmlAnyContain "p" "Moon" htmlNoneContain "p" "Sun" - yit "CSRF token" $ do + yit "finds the CSRF token by css selector" $ do get ("/form" :: Text) statusIs 200 diff --git a/yesod-test/yesod-test.cabal b/yesod-test/yesod-test.cabal index 9f2ee0da..0a65ce07 100644 --- a/yesod-test/yesod-test.cabal +++ b/yesod-test/yesod-test.cabal @@ -1,5 +1,5 @@ name: yesod-test -version: 1.5.1.0 +version: 1.5.1.1 license: MIT license-file: LICENSE author: Nubis