@@ -54,13 +54,12 @@ import Data.Semigroup ((<>))
55spec :: Spec
55spec :: Spec
57− describe "config"
57+ describe "config" $
58− $ it "getHttpConfig has effect on resulting request"
58+ it "getHttpConfig has effect on resulting request" $
59− $ property
59+ property $ \config -> do
61− request <- runReq config (req_ GET url NoReqBody mempty)
60+ request <- runReq config (req_ GET url NoReqBody mempty)
62− L.proxy request `shouldBe` httpConfigProxy config
61+ L.proxy request `shouldBe` httpConfigProxy config
63− L.redirectCount request `shouldBe` httpConfigRedirectCount config
62+ L.redirectCount request `shouldBe` httpConfigRedirectCount config
65 describe "methods" $ do
64 describe "methods" $ do
66 let mnth ::
65 let mnth ::
@@ -72,9 +71,8 @@ spec = do
72 SpecM () ()
71 SpecM () ()
73 mnth method = do
72 mnth method = do
74 let name = httpMethodName (Proxy :: Proxy method)
73 let name = httpMethodName (Proxy :: Proxy method)
75− describe (B8.unpack name)
74+ describe (B8.unpack name) $
76− $ it "affects name of HTTP method"
75+ it "affects name of HTTP method" $ do
78 request <- req_ method url NoReqBody mempty
76 request <- req_ method url NoReqBody mempty
79 L.method request `shouldBe` name
77 L.method request `shouldBe` name
@@ -88,48 +86,42 @@ spec = do
88 mnth PATCH
86 mnth PATCH
90 describe "urls" $ do
88 describe "urls" $ do
91− describe "http"
89+ describe "http" $
92− $ it "sets all the params correctly"
90+ it "sets all the params correctly" $
94− $ \host -> do
91+ property $ \host -> do
95− request <- req_ GET (http host) NoReqBody mempty
92+ request <- req_ GET (http host) NoReqBody mempty
96− L.secure request `shouldBe` False
93+ L.secure request `shouldBe` False
97− L.port request `shouldBe` 80
94+ L.port request `shouldBe` 80
98− L.host request `shouldBe` urlEncode host
95+ L.host request `shouldBe` urlEncode host
99− describe "https"
96+ describe "https" $
100− $ it "sets all the params correctly"
97+ it "sets all the params correctly" $
102− $ \host -> do
98+ property $ \host -> do
103− request <- req_ GET (https host) NoReqBody mempty
99+ request <- req_ GET (https host) NoReqBody mempty
104− L.secure request `shouldBe` True
100+ L.secure request `shouldBe` True
105− L.port request `shouldBe` 443
101+ L.port request `shouldBe` 443
106− L.host request `shouldBe` urlEncode host
102+ L.host request `shouldBe` urlEncode host
107− describe "(/~)"
103+ describe "(/~)" $
108− $ it "attaches a path piece that is URL-encoded"
104+ it "attaches a path piece that is URL-encoded" $
110− $ \host pieces -> do
105+ property $ \host pieces -> do
111− let url' = foldl (/~) (https host) pieces
106+ let url' = foldl (/~) (https host) pieces
112− request <- req_ GET url' NoReqBody mempty
107+ request <- req_ GET url' NoReqBody mempty
113− L.host request `shouldBe` urlEncode host
108+ L.host request `shouldBe` urlEncode host
114− L.path request `shouldBe` encodePathPieces pieces
109+ L.path request `shouldBe` encodePathPieces pieces
115− describe "(/:)"
110+ describe "(/:)" $
116− $ it "attaches a path piece that is URL-encoded"
111+ it "attaches a path piece that is URL-encoded" $
118− $ \host pieces -> do
112+ property $ \host pieces -> do
119− let url' = foldl (/:) (https host) pieces
113+ let url' = foldl (/:) (https host) pieces
120− request <- req_ GET url' NoReqBody mempty
114+ request <- req_ GET url' NoReqBody mempty
121− L.host request `shouldBe` urlEncode host
115+ L.host request `shouldBe` urlEncode host
122− L.path request `shouldBe` encodePathPieces pieces
116+ L.path request `shouldBe` encodePathPieces pieces
124 describe "useHttpURI" $ do
118 describe "useHttpURI" $ do
125− it "does not recognize non-http schemes"
119+ it "does not recognize non-http schemes" $
126− $ property
120+ property $ \uri ->
128 when (URI.uriScheme uri /= Just [QQ.scheme|http|]) $
121 when (URI.uriScheme uri /= Just [QQ.scheme|http|]) $
129 useHttpURI uri `shouldSatisfy` isNothing
122 useHttpURI uri `shouldSatisfy` isNothing
130− it "accepts correct URLs"
123+ it "accepts correct URLs" $
131− $ property
124+ property $ \uri' -> do
133 unless (isRight (URI.uriAuthority uri')) discard
125 unless (isRight (URI.uriAuthority uri')) discard
134 let uri = uri' {URI.uriScheme = Just [QQ.scheme|http|]}
126 let uri = uri' {URI.uriScheme = Just [QQ.scheme|http|]}
135 (url', options) = fromJust (useHttpURI uri)
127 (url', options) = fromJust (useHttpURI uri)
@@ -141,14 +133,12 @@ spec = do
141 lookup "Authorization" (L.requestHeaders request)
133 lookup "Authorization" (L.requestHeaders request)
142 `shouldBe` uriBasicAuth uri
134 `shouldBe` uriBasicAuth uri
143 describe "useHttpsURI" $ do
135 describe "useHttpsURI" $ do
144− it "does not recognize non-https schemes"
136+ it "does not recognize non-https schemes" $
145− $ property
137+ property $ \uri ->
147 when (URI.uriScheme uri /= Just [QQ.scheme|https|]) $
138 when (URI.uriScheme uri /= Just [QQ.scheme|https|]) $
148 useHttpsURI uri `shouldSatisfy` isNothing
139 useHttpsURI uri `shouldSatisfy` isNothing
149− it "parses correct URLs"
140+ it "parses correct URLs" $
150− $ property
141+ property $ \uri' -> do
152 unless (isRight (URI.uriAuthority uri')) discard
142 unless (isRight (URI.uriAuthority uri')) discard
153 let uri = uri' {URI.uriScheme = Just [QQ.scheme|https|]}
143 let uri = uri' {URI.uriScheme = Just [QQ.scheme|https|]}
154 (url', options) = fromJust (useHttpsURI uri)
144 (url', options) = fromJust (useHttpsURI uri)
@@ -160,18 +150,16 @@ spec = do
160 lookup "Authorization" (L.requestHeaders request)
150 lookup "Authorization" (L.requestHeaders request)
161 `shouldBe` uriBasicAuth uri
151 `shouldBe` uriBasicAuth uri
162 describe "useURI" $ do
152 describe "useURI" $ do
163− it "does not recognize non-http and non-https schemes"
153+ it "does not recognize non-http and non-https schemes" $
164− $ property
154+ property $ \uri ->
167 ( ( URI.uriScheme uri /= Just [QQ.scheme|http|]
156 ( ( URI.uriScheme uri /= Just [QQ.scheme|http|]
168 && (URI.uriScheme uri /= Just [QQ.scheme|https|])
157 && (URI.uriScheme uri /= Just [QQ.scheme|https|])
171 $ useURI uri `shouldSatisfy` isNothing
160 $ useURI uri `shouldSatisfy` isNothing
172− it "parses correct URLs"
161+ it "parses correct URLs" $
173− $ property
162+ property $ \uri' -> do
175 unless (isRight (URI.uriAuthority uri')) discard
163 unless (isRight (URI.uriAuthority uri')) discard
176 let uriHttp = uri' {URI.uriScheme = Just [QQ.scheme|http|]}
164 let uriHttp = uri' {URI.uriScheme = Just [QQ.scheme|http|]}
177 uriHttps = uri' {URI.uriScheme = Just [QQ.scheme|https|]}
165 uriHttps = uri' {URI.uriScheme = Just [QQ.scheme|https|]}
@@ -195,56 +183,49 @@ spec = do
195 `shouldBe` uriBasicAuth uriHttps
183 `shouldBe` uriBasicAuth uriHttps
197 describe "bodies" $ do
185 describe "bodies" $ do
198− describe "NoReqBody"
186+ describe "NoReqBody" $
199− $ it "sets body to empty byte string"
187+ it "sets body to empty byte string" $ do
201 request <- req_ POST url NoReqBody mempty
188 request <- req_ POST url NoReqBody mempty
202 case L.requestBody request of
189 case L.requestBody request of
203 L.RequestBodyBS x -> x `shouldBe` B.empty
190 L.RequestBodyBS x -> x `shouldBe` B.empty
204 _ -> expectationFailure "Wrong request body constructor."
191 _ -> expectationFailure "Wrong request body constructor."
205− describe "ReqBodyJson"
192+ describe "ReqBodyJson" $
206− $ it "sets body to correct lazy byte string"
193+ it "sets body to correct lazy byte string" $
208− $ \thing -> do
194+ property $ \thing -> do
209− request <- req_ POST url (ReqBodyJson thing) mempty
195+ request <- req_ POST url (ReqBodyJson thing) mempty
210− case L.requestBody request of
196+ case L.requestBody request of
211− L.RequestBodyLBS x -> x `shouldBe` A.encode (thing :: Thing)
197+ L.RequestBodyLBS x -> x `shouldBe` A.encode (thing :: Thing)
212− _ -> expectationFailure "Wrong request body constructor."
198+ _ -> expectationFailure "Wrong request body constructor."
213− describe "ReqBodyBs"
199+ describe "ReqBodyBs" $
214− $ it "sets body to specified strict byte string"
200+ it "sets body to specified strict byte string" $
215− $ property
201+ property $ \bs -> do
217− request <- req_ POST url (ReqBodyBs bs) mempty
202+ request <- req_ POST url (ReqBodyBs bs) mempty
218− case L.requestBody request of
203+ case L.requestBody request of
219− L.RequestBodyBS x -> x `shouldBe` bs
204+ L.RequestBodyBS x -> x `shouldBe` bs
220− _ -> expectationFailure "Wrong request body constructor."
205+ _ -> expectationFailure "Wrong request body constructor."
221− describe "ReqBodyLbs"
206+ describe "ReqBodyLbs" $
222− $ it "sets body to specified lazy byte string"
207+ it "sets body to specified lazy byte string" $
224− $ \lbs -> do
208+ property $ \lbs -> do
225− request <- req_ POST url (ReqBodyLbs lbs) mempty
209+ request <- req_ POST url (ReqBodyLbs lbs) mempty
226− case L.requestBody request of
210+ case L.requestBody request of
227− L.RequestBodyLBS x -> x `shouldBe` lbs
211+ L.RequestBodyLBS x -> x `shouldBe` lbs
228− _ -> expectationFailure "Wrong request body constructor."
212+ _ -> expectationFailure "Wrong request body constructor."
229− describe "ReqBodyUrlEnc"
213+ describe "ReqBodyUrlEnc" $
230− $ it "sets body to correct lazy byte string"
214+ it "sets body to correct lazy byte string" $
232− $ \params -> do
215+ property $ \params -> do
233− request <- req_ POST url (ReqBodyUrlEnc (formUrlEnc params)) mempty
216+ request <- req_ POST url (ReqBodyUrlEnc (formUrlEnc params)) mempty
234− case L.requestBody request of
217+ case L.requestBody request of
235− L.RequestBodyLBS x -> x `shouldBe` renderQuery params
218+ L.RequestBodyLBS x -> x `shouldBe` renderQuery params
236− _ -> expectationFailure "Wrong request body constructor."
219+ _ -> expectationFailure "Wrong request body constructor."
238 describe "optional parameters" $ do
221 describe "optional parameters" $ do
239 describe "header" $ do
222 describe "header" $ do
240− it "sets specified header value"
223+ it "sets specified header value" $
242− $ \name value -> do
224+ property $ \name value -> do
243 request <- req_ GET url NoReqBody (header name value)
225 request <- req_ GET url NoReqBody (header name value)
244 lookup (CI.mk name) (L.requestHeaders request) `shouldBe` pure value
226 lookup (CI.mk name) (L.requestHeaders request) `shouldBe` pure value
245− it "left header wins"
227+ it "left header wins" $
247− $ \name value0 value1 -> do
228+ property $ \name value0 value1 -> do
248 request <-
229 request <-
@@ -252,9 +233,8 @@ spec = do
252 NoReqBody
233 NoReqBody
253 (header name value0 <> header name value1)
234 (header name value0 <> header name value1)
254 lookup (CI.mk name) (L.requestHeaders request) `shouldBe` pure value0
235 lookup (CI.mk name) (L.requestHeaders request) `shouldBe` pure value0
255− it "overwrites headers set by other parts of the lib"
236+ it "overwrites headers set by other parts of the lib" $
256− $ property
237+ property $ \value -> do
258 request <-
238 request <-
@@ -262,26 +242,23 @@ spec = do
262 (ReqBodyUrlEnc mempty)
242 (ReqBodyUrlEnc mempty)
263 (header "Content-Type" value)
243 (header "Content-Type" value)
264 lookup "Content-Type" (L.requestHeaders request) `shouldBe` pure value
244 lookup "Content-Type" (L.requestHeaders request) `shouldBe` pure value
265− describe "cookieJar"
245+ describe "cookieJar" $
266− $ it "cookie jar is set without modifications"
246+ it "cookie jar is set without modifications" $
267− $ property
247+ property $ \cjar -> do
269− request <- req_ GET url NoReqBody (cookieJar cjar)
248+ request <- req_ GET url NoReqBody (cookieJar cjar)
270#if MIN_VERSION_http_client(0,7,0)
249#if MIN_VERSION_http_client(0,7,0)
271− L.cookieJar request `shouldSatisfy` (maybe False (L.equalCookieJar cjar))
250+ L.cookieJar request `shouldSatisfy` (maybe False (L.equalCookieJar cjar))
273− L.cookieJar request `shouldBe` Just cjar
252+ L.cookieJar request `shouldBe` Just cjar
275 describe "basicAuth" $ do
254 describe "basicAuth" $ do
276− it "sets Authorization header to correct value"
255+ it "sets Authorization header to correct value" $
278− $ \username password -> do
256+ property $ \username password -> do
279 request <- req_ GET url NoReqBody (basicAuth username password)
257 request <- req_ GET url NoReqBody (basicAuth username password)
280 lookup "Authorization" (L.requestHeaders request)
258 lookup "Authorization" (L.requestHeaders request)
281 `shouldBe` Just (basicAuthHeader username password)
259 `shouldBe` Just (basicAuthHeader username password)
282− it "overwrites manual setting of header"
260+ it "overwrites manual setting of header" $
284− $ \username password value -> do
261+ property $ \username password value -> do
285 request0 <-
262 request0 <-
@@ -297,9 +274,8 @@ spec = do
297 let result = Just (basicAuthHeader username password)
274 let result = Just (basicAuthHeader username password)
298 lookup "Authorization" (L.requestHeaders request0) `shouldBe` result
275 lookup "Authorization" (L.requestHeaders request0) `shouldBe` result
299 lookup "Authorization" (L.requestHeaders request1) `shouldBe` result
276 lookup "Authorization" (L.requestHeaders request1) `shouldBe` result
300− it "left auth option wins"
277+ it "left auth option wins" $
302− $ \username0 password0 username1 password1 -> do
278+ property $ \username0 password0 username1 password1 -> do
303 request <-
279 request <-
@@ -309,15 +285,13 @@ spec = do
309 lookup "Authorization" (L.requestHeaders request)
285 lookup "Authorization" (L.requestHeaders request)
310 `shouldBe` Just (basicAuthHeader username0 password0)
286 `shouldBe` Just (basicAuthHeader username0 password0)
311 describe "oAuth2Bearer" $ do
287 describe "oAuth2Bearer" $ do
312− it "sets Authorization header to correct value"
288+ it "sets Authorization header to correct value" $
313− $ property
289+ property $ \token -> do
315 request <- req_ GET url NoReqBody (oAuth2Bearer token)
290 request <- req_ GET url NoReqBody (oAuth2Bearer token)
316 lookup "Authorization" (L.requestHeaders request)
291 lookup "Authorization" (L.requestHeaders request)
317 `shouldBe` pure ("Bearer " <> token)
292 `shouldBe` pure ("Bearer " <> token)
318− it "overwrites manual setting of header"
293+ it "overwrites manual setting of header" $
320− $ \token value -> do
294+ property $ \token value -> do
321 request0 <-
295 request0 <-
@@ -335,9 +309,8 @@ spec = do
335 `shouldBe` pure result
309 `shouldBe` pure result
336 lookup "Authorization" (L.requestHeaders request1)
310 lookup "Authorization" (L.requestHeaders request1)
337 `shouldBe` pure result
311 `shouldBe` pure result
338− it "left auth option wins"
312+ it "left auth option wins" $
340− $ \token0 token1 -> do
313+ property $ \token0 token1 -> do
341 request <-
314 request <-
@@ -346,23 +319,20 @@ spec = do
346 (oAuth2Bearer token0 <> oAuth2Bearer token1)
319 (oAuth2Bearer token0 <> oAuth2Bearer token1)
347 lookup "Authorization" (L.requestHeaders request)
320 lookup "Authorization" (L.requestHeaders request)
348 `shouldBe` pure ("Bearer " <> token0)
321 `shouldBe` pure ("Bearer " <> token0)
349− describe "ProxyAuthorization"
322+ describe "ProxyAuthorization" $
350− $ it "sets Authorization header to correct value"
323+ it "sets Authorization header to correct value" $
352− $ \username password -> do
324+ property $ \username password -> do
353− request <- req_ GET url NoReqBody (basicProxyAuth username password)
325+ request <- req_ GET url NoReqBody (basicProxyAuth username password)
354− lookup "Proxy-Authorization" (L.requestHeaders request)
326+ lookup "Proxy-Authorization" (L.requestHeaders request)
355− `shouldBe` pure (basicProxyAuthHeader username password)
327+ `shouldBe` pure (basicProxyAuthHeader username password)
356 describe "oAuth2Token" $ do
328 describe "oAuth2Token" $ do
357− it "sets Authorization header to correct value"
329+ it "sets Authorization header to correct value" $
358− $ property
330+ property $ \token -> do
360 request <- req_ GET url NoReqBody (oAuth2Token token)
331 request <- req_ GET url NoReqBody (oAuth2Token token)
361 lookup "Authorization" (L.requestHeaders request)
332 lookup "Authorization" (L.requestHeaders request)
362 `shouldBe` pure ("token " <> token)
333 `shouldBe` pure ("token " <> token)
363− it "overwrites manual setting of header"
334+ it "overwrites manual setting of header" $
365− $ \token value -> do
335+ property $ \token value -> do
366 request0 <-
336 request0 <-
@@ -380,9 +350,8 @@ spec = do
380 `shouldBe` pure result
350 `shouldBe` pure result
381 lookup "Authorization" (L.requestHeaders request1)
351 lookup "Authorization" (L.requestHeaders request1)
382 `shouldBe` pure result
352 `shouldBe` pure result
383− it "left auth option wins"
353+ it "left auth option wins" $
385− $ \token0 token1 -> do
354+ property $ \token0 token1 -> do
386 request <-
355 request <-
@@ -391,27 +360,24 @@ spec = do
391 (oAuth2Token token0 <> oAuth2Token token1)
360 (oAuth2Token token0 <> oAuth2Token token1)
392 lookup "Authorization" (L.requestHeaders request)
361 lookup "Authorization" (L.requestHeaders request)
393 `shouldBe` pure ("token " <> token0)
362 `shouldBe` pure ("token " <> token0)
394− describe "port"
363+ describe "port" $
395− $ it "sets port overwriting the defaults"
364+ it "sets port overwriting the defaults" $
397− $ \n -> do
365+ property $ \n -> do
398− request <- req_ GET url NoReqBody (port n)
366+ request <- req_ GET url NoReqBody (port n)
399− L.port request `shouldBe` n
367+ L.port request `shouldBe` n
400− describe "decompress"
368+ describe "decompress" $
401− $ it "sets decompress function overwriting the defaults"
369+ it "sets decompress function overwriting the defaults" $
403− $ \token -> do
370+ property $ \token -> do
404− request <- req_ GET url NoReqBody (decompress (/= token))
371+ request <- req_ GET url NoReqBody (decompress (/= token))
405− L.decompress request token `shouldBe` False
372+ L.decompress request token `shouldBe` False
406 -- FIXME Can't really test responseTimeout right new because the
373 -- FIXME Can't really test responseTimeout right new because the
407 -- ResponseTimeout data type does not implement Eq and its constructors
374 -- ResponseTimeout data type does not implement Eq and its constructors
408 -- are also not exported. Sent a PR.
375 -- are also not exported. Sent a PR.
409− describe "httpVersion"
376+ describe "httpVersion" $
410− $ it "sets HTTP version overwriting the defaults"
377+ it "sets HTTP version overwriting the defaults" $
412− $ \major minor -> do
378+ property $ \major minor -> do
413− request <- req_ GET url NoReqBody (httpVersion major minor)
379+ request <- req_ GET url NoReqBody (httpVersion major minor)
414− L.requestVersion request `shouldBe` Y.HttpVersion major minor
380+ L.requestVersion request `shouldBe` Y.HttpVersion major minor
416 describe "quasiquoter" $ do
382 describe "quasiquoter" $ do
417 it "works for valid urls" $
383 it "works for valid urls" $
@@ -422,9 +388,9 @@ spec = do
422 forall a s. Typeable a => (a, Option s) -> Bool
388 forall a s. Typeable a => (a, Option s) -> Bool
423 testTypeOfQuoterResult _ = isJust $ eqT @a @(Url 'Https)
389 testTypeOfQuoterResult _ = isJust $ eqT @a @(Url 'Https)
424 in property $ testTypeOfQuoterResult [urlQ|https://example.org/|]
390 in property $ testTypeOfQuoterResult [urlQ|https://example.org/|]
425− it "doesn't work for invalid urls"
391+ it "doesn't work for invalid urls" $
426− $ property
392+ property $
427− $ TH.runQ (TH.quoteExp urlQ "not a url") `shouldThrow` anyIOException
393+ TH.runQ (TH.quoteExp urlQ "not a url") `shouldThrow` anyIOException
429----------------------------------------------------------------------------
395----------------------------------------------------------------------------
430-- Instances
396-- Instances