Add postBody and setRequestBody functions to POST some data in a test.

This commit is contained in:
Konstantine Rybnikov 2013-07-29 11:26:32 +03:00
parent 5d3572d792
commit ee168c7829

View File

@ -42,6 +42,7 @@ module Yesod.Test
-- --
, get , get
, post , post
, postBody
, request , request
, addRequestHeader , addRequestHeader
, setMethod , setMethod
@ -176,7 +177,8 @@ data RequestBuilderData site = RequestBuilderData
-- | Request parts let us discern regular key/values from files sent in the request. -- | Request parts let us discern regular key/values from files sent in the request.
data RequestPart data RequestPart
= ReqPlainPart T.Text T.Text = ReqKvPart T.Text T.Text
| ReqTextPart T.Text
| ReqFilePart T.Text FilePath BSL8.ByteString T.Text | ReqFilePart T.Text FilePath BSL8.ByteString T.Text
-- | The RequestBuilder state monad constructs an url encoded string of arguments -- | The RequestBuilder state monad constructs an url encoded string of arguments
@ -371,7 +373,7 @@ printMatches query = do
addPostParam :: T.Text -> T.Text -> RequestBuilder site () addPostParam :: T.Text -> T.Text -> RequestBuilder site ()
addPostParam name value = addPostParam name value =
ST.modify $ \rbd -> rbd ST.modify $ \rbd -> rbd
{ rbdPosts = ReqPlainPart name value : rbdPosts rbd { rbdPosts = ReqKvPart name value : rbdPosts rbd
} }
addGetParam :: T.Text -> T.Text -> RequestBuilder site () addGetParam :: T.Text -> T.Text -> RequestBuilder site ()
@ -458,9 +460,17 @@ addNonce = addNonce_ ""
post :: (Yesod site, RedirectUrl site url) post :: (Yesod site, RedirectUrl site url)
=> url => url
-> YesodExample site () -> YesodExample site ()
post url = request $ do post url = postBody url ""
setMethod "POST"
setUrl url -- | Perform a POST request to url with sending a body into it.
postBody :: (Yesod site, RedirectUrl site url)
=> url
-> T.Text
-> YesodExample site ()
postBody url body = request $ do
setRequestBody body
setMethod "POST"
setUrl url
-- | Perform a GET request to url, using params -- | Perform a GET request to url, using params
get :: (Yesod site, RedirectUrl site url) get :: (Yesod site, RedirectUrl site url)
@ -494,6 +504,12 @@ setUrl url' = do
, rbdGets = rbdGets rbd ++ H.parseQuery (TE.encodeUtf8 urlQuery) , rbdGets = rbdGets rbd ++ H.parseQuery (TE.encodeUtf8 urlQuery)
} }
-- | Simple way to set HTTP request body
setRequestBody :: (Yesod site)
=> T.Text
-> RequestBuilder site ()
setRequestBody body = ST.modify $ \rbd -> rbd { rbdPosts = [ ReqTextPart body ] }
addRequestHeader :: H.Header -> RequestBuilder site () addRequestHeader :: H.Header -> RequestBuilder site ()
addRequestHeader header = ST.modify $ \rbd -> rbd addRequestHeader header = ST.modify $ \rbd -> rbd
{ rbdHeaders = header : rbdHeaders rbd { rbdHeaders = header : rbdHeaders rbd
@ -556,10 +572,12 @@ request reqBuilder = do
] method extraHeaders urlPath urlQuery ] method extraHeaders urlPath urlQuery
multiPartBody parts = multiPartBody parts =
BS8.concat $ separator : [BS8.concat [multipartPart p, separator] | p <- parts] BS8.concat $ separator : [BS8.concat [multipartPart p, separator] | p <- parts]
multipartPart (ReqPlainPart k v) = BS8.concat multipartPart (ReqKvPart k v) = BS8.concat
[ "Content-Disposition: form-data; " [ "Content-Disposition: form-data; "
, "name=\"", TE.encodeUtf8 k, "\"\r\n\r\n" , "name=\"", TE.encodeUtf8 k, "\"\r\n\r\n"
, TE.encodeUtf8 v, "\r\n"] , TE.encodeUtf8 v, "\r\n"]
multipartPart (ReqTextPart v) = BS8.concat
[ TE.encodeUtf8 v, "\r\n" ]
multipartPart (ReqFilePart k v bytes mime) = BS8.concat multipartPart (ReqFilePart k v bytes mime) = BS8.concat
[ "Content-Disposition: form-data; " [ "Content-Disposition: form-data; "
, "name=\"", TE.encodeUtf8 k, "\"; " , "name=\"", TE.encodeUtf8 k, "\"; "
@ -568,15 +586,29 @@ request reqBuilder = do
, BS8.concat $ BSL8.toChunks bytes, "\r\n"] , BS8.concat $ BSL8.toChunks bytes, "\r\n"]
-- For building the regular non-multipart requests -- For building the regular non-multipart requests
makeSinglepart cookies parts method extraHeaders urlPath urlQuery = SRequest (mkRequest makeSinglepart :: M.Map a0 Cookie.SetCookie
[ ("Cookie", Builder.toByteString $ Cookie.renderCookies -> [RequestPart]
[(Cookie.setCookieName c, Cookie.setCookieValue c) | c <- map snd $ M.toList cookies]) -> H.Method
, ("Content-Type", "application/x-www-form-urlencoded") -> [H.Header]
] method extraHeaders urlPath urlQuery) $ -> T.Text
BSL8.fromChunks $ return $ TE.encodeUtf8 $ T.intercalate "&" $ map singlepartPart parts -> H.Query
-> SRequest
singlepartPart (ReqFilePart _ _ _ _) = "" makeSinglepart cookies parts method extraHeaders urlPath urlQuery =
singlepartPart (ReqPlainPart k v) = T.concat [k,"=",v] SRequest simpleRequest' simpleRequestBody'
where
simpleRequest' = (mkRequest
[ ("Cookie", cookieValue)
, ("Content-Type", "application/x-www-form-urlencoded")]
method extraHeaders urlPath urlQuery)
simpleRequestBody' = BSL8.fromChunks $ return $ TE.encodeUtf8 $ T.intercalate "&"
$ map singlepartPart parts
cookieValue = Builder.toByteString
$ Cookie.renderCookies cookiePairs
cookiePairs = [ (Cookie.setCookieName c, Cookie.setCookieValue c)
| c <- map snd $ M.toList cookies ]
singlepartPart (ReqFilePart _ _ _ _) = ""
singlepartPart (ReqKvPart k v) = T.concat [k,"=",v]
singlepartPart (ReqTextPart v) = v
-- General request making -- General request making
mkRequest headers method extraHeaders urlPath urlQuery = defaultRequest mkRequest headers method extraHeaders urlPath urlQuery = defaultRequest