From cab78b65c2dfc7bf18e595b7eaa38fd822d43841 Mon Sep 17 00:00:00 2001 From: pythonissam Date: Sun, 26 Nov 2017 04:45:02 +0000 Subject: [PATCH 01/26] Add a failure test case for byLabel --- yesod-test/test/main.hs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/yesod-test/test/main.hs b/yesod-test/test/main.hs index 67511ee9..f104bc19 100644 --- a/yesod-test/test/main.hs +++ b/yesod-test/test/main.hs @@ -215,6 +215,15 @@ main = hspec $ do setMethod "POST" setUrl ("/labels" :: Text) byLabel "Foo Bar" "yes" + ydescribe "labels2" $ do + yit "fails with \"More than one label contained\" error" $ do + get ("/labels2" :: Text) + (bad :: Either SomeException ()) <- try (request $ do + setMethod "POST" + setUrl ("labels2" :: Text) + byLabel "hobby" "fishing") + assertEq "failure wasn't called" (isLeft bad) True + ydescribe "Content-Type handling" $ do yit "can set a content-type" $ do request $ do @@ -362,6 +371,8 @@ app = liteApp $ do return ("A linkLink!" :: Text) onStatic "labels" $ dispatchTo $ return ("" :: Text) + onStatic "labels2" $ dispatchTo $ + return ("" :: Text) onStatic "checkContentType" $ dispatchTo $ do headers <- requestHeaders <$> waiRequest From 80aa45cf1837107a1ab5eb54c4bb431ef73ae19f Mon Sep 17 00:00:00 2001 From: pythonissam Date: Sun, 26 Nov 2017 07:22:25 +0000 Subject: [PATCH 02/26] Simply, create the exact version of byLabel --- yesod-test/Yesod/Test.hs | 73 ++++++++++++++++++++++++++++++++++++++++ yesod-test/test/main.hs | 7 ++++ 2 files changed, 80 insertions(+) diff --git a/yesod-test/Yesod/Test.hs b/yesod-test/Yesod/Test.hs index e359896b..e736ddd3 100644 --- a/yesod-test/Yesod/Test.hs +++ b/yesod-test/Yesod/Test.hs @@ -73,6 +73,7 @@ module Yesod.Test -- These functions let you add parameters to your request based -- on currently displayed label names. , byLabel + , byLabelExact , fileByLabel -- *** CSRF Tokens @@ -563,6 +564,46 @@ nameFromLabel label = do name:_ -> return name _ -> failure $ "More than one label contained " <> label +-- This looks up the name of a field based on the contents of the label pointing to it (exact). +nameFromLabelExact :: T.Text -> RequestBuilder site T.Text +nameFromLabelExact label = do + mres <- fmap rbdResponse ST.get + res <- + case mres of + Nothing -> failure "nameFromLabel: No response available" + Just res -> return res + let + body = simpleBody res + mlabel = parseHTML body + $// C.element "label" + >=> contentIs label + mfor = mlabel >>= attribute "for" + + contentIs x c + | x == T.concat (c $// content) = [c] + | otherwise = [] + + case mfor of + for:[] -> do + let mname = parseHTML body + $// attributeIs "id" for + >=> attribute "name" + case mname of + "":_ -> failure $ T.concat + [ "Label " + , label + , " resolved to id " + , for + , " which was not found. " + ] + name:_ -> return name + [] -> failure $ "No input with id " <> for + [] -> + case filter (/= "") $ mlabel >>= (child >=> C.element "input" >=> attribute "name") of + [] -> failure $ "No label contained: " <> label + name:_ -> return name + _ -> failure $ "More than one label contained " <> label + (<>) :: T.Text -> T.Text -> T.Text (<>) = T.append @@ -598,6 +639,38 @@ byLabel label value = do name <- nameFromLabel label addPostParam name value +-- How does this work for the alternate syntax? + +-- | Finds the @\