on master help sign in
Some more tests in ‘httpbin-tests’
commit821adfbb827ed37c085ecdde334c1a77d2d7e291 authormrkkrp <markkarpov@opmbx.org> dateWed 9 Nov 2016, 15:39 (10 years ago) parent3a7fc0c
4 files changed+362−3
httpbin-data/robots.txt+2 httpbin-data/utf8.html+220 httpbin-tests/Network/HTTP/ReqSpec.hs+134−2 req.cabal+6−1
httpbin-data/robots.txtnew file+2
@@ -0,0 +1,2 @@
1+User-agent: *
2+Disallow: /deny
httpbin-data/utf8.htmlnew file+220
@@ -0,0 +1,220 @@
1+<h1>Unicode Demo</h1>
2+
3+<p>Taken from <a
4+href="http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt">http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt</a></p>
5+
6+<pre>
7+
8+UTF-8 encoded sample plain-text file
9+‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
10+
11+Markus Kuhn [ˈmaʳkʊs kuːn] <http://www.cl.cam.ac.uk/~mgk25/> — 2002-07-25
12+
13+
14+The ASCII compatible UTF-8 encoding used in this plain-text file
15+is defined in Unicode, ISO 10646-1, and RFC 2279.
16+
17+
18+Using Unicode/UTF-8, you can write in emails and source code things such as
19+
20+Mathematics and sciences:
21+
22+ ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ⎧⎡⎛┌─────┐⎞⎤⎫
23+ ⎪⎢⎜│a²+b³ ⎟⎥⎪
24+ ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪
25+ ⎪⎢⎜⎷ c₈ ⎟⎥⎪
26+ ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⎨⎢⎜ ⎟⎥⎬
27+ ⎪⎢⎜ ∞ ⎟⎥⎪
28+ ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪
29+ ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪
30+ 2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣⎝i=1 ⎠⎦⎭
31+
32+Linguistics and dictionaries:
33+
34+ ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn
35+ Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ]
36+
37+APL:
38+
39+ ((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈
40+
41+Nicer typography in plain text files:
42+
43+ ╔══════════════════════════════════════════╗
44+ ║ ║
45+ ║ • ‘single’ and “double” quotes ║
46+ ║ ║
47+ ║ • Curly apostrophes: “We’ve been here” ║
48+ ║ ║
49+ ║ • Latin-1 apostrophe and accents: '´` ║
50+ ║ ║
51+ ║ • ‚deutsche‘ „Anführungszeichen“ ║
52+ ║ ║
53+ ║ • †, ‡, ‰, •, 3–4, —, −5/+5, ™, … ║
54+ ║ ║
55+ ║ • ASCII safety test: 1lI|, 0OD, 8B ║
56+ ║ ╭─────────╮ ║
57+ ║ • the euro symbol: │ 14.95 € │ ║
58+ ║ ╰─────────╯ ║
59+ ╚══════════════════════════════════════════╝
60+
61+Combining characters:
62+
63+ STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑
64+
65+Greek (in Polytonic):
66+
67+ The Greek anthem:
68+
69+ Σὲ γνωρίζω ἀπὸ τὴν κόψη
70+ τοῦ σπαθιοῦ τὴν τρομερή,
71+ σὲ γνωρίζω ἀπὸ τὴν ὄψη
72+ ποὺ μὲ βία μετράει τὴ γῆ.
73+
74+ ᾿Απ᾿ τὰ κόκκαλα βγαλμένη
75+ τῶν ῾Ελλήνων τὰ ἱερά
76+ καὶ σὰν πρῶτα ἀνδρειωμένη
77+ χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά!
78+
79+ From a speech of Demosthenes in the 4th century BC:
80+
81+ Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,
82+ ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς
83+ λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ
84+ τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿
85+ εἰς τοῦτο προήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ
86+ πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν
87+ οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,
88+ οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν
89+ ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
90+ τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι
91+ γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
92+ προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους
93+ σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ
94+ τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ
95+ τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς
96+ τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.
97+
98+ Δημοσθένους, Γ´ ᾿Ολυνθιακὸς
99+
100+Georgian:
101+
102+ From a Unicode conference invitation:
103+
104+ გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო
105+ კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს,
106+ ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს
107+ ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი,
108+ ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება
109+ ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში,
110+ ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში.
111+
112+Russian:
113+
114+ From a Unicode conference invitation:
115+
116+ Зарегистрируйтесь сейчас на Десятую Международную Конференцию по
117+ Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии.
118+ Конференция соберет широкий круг экспертов по вопросам глобального
119+ Интернета и Unicode, локализации и интернационализации, воплощению и
120+ применению Unicode в различных операционных системах и программных
121+ приложениях, шрифтах, верстке и многоязычных компьютерных системах.
122+
123+Thai (UCS Level 2):
124+
125+ Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese
126+ classic 'San Gua'):
127+
128+ [----------------------------|------------------------]
129+ ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่
130+ สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา
131+ ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนักหนา
132+ โฮจิ๋นเรียกทัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัญ
133+ เหมือนขับไสไล่เสือจากเคหา รับหมาป่าเข้ามาเลยอาสัญ
134+ ฝ่ายอ้องอุ้นยุแยกให้แตกกัน ใช้สาวนั้นเป็นชนวนชื่นชวนใจ
135+ พลันลิฉุยกุยกีกลับก่อเหตุ ช่างอาเพศจริงหนาฟ้าร้องไห้
136+ ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ
137+
138+ (The above is a two-column text. If combining characters are handled
139+ correctly, the lines of the second column should be aligned with the
140+ | character above.)
141+
142+Ethiopian:
143+
144+ Proverbs in the Amharic language:
145+
146+ ሰማይ አይታረስ ንጉሥ አይከሰስ።
147+ ብላ ካለኝ እንደአባቴ በቆመጠኝ።
148+ ጌጥ ያለቤቱ ቁምጥና ነው።
149+ ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው።
150+ የአፍ ወለምታ በቅቤ አይታሽም።
151+ አይጥ በበላ ዳዋ ተመታ።
152+ ሲተረጉሙ ይደረግሙ።
153+ ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል።
154+ ድር ቢያብር አንበሳ ያስር።
155+ ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም።
156+ እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም።
157+ የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ።
158+ ሥራ ከመፍታት ልጄን ላፋታት።
159+ ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል።
160+ የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ።
161+ ተንጋሎ ቢተፉ ተመልሶ ባፉ።
162+ ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው።
163+ እግርህን በፍራሽህ ልክ ዘርጋ።
164+
165+Runes:
166+
167+ ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ
168+
169+ (Old English, which transcribed into Latin reads 'He cwaeth that he
170+ bude thaem lande northweardum with tha Westsae.' and means 'He said
171+ that he lived in the northern land near the Western Sea.')
172+
173+Braille:
174+
175+ ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌
176+
177+ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞
178+ ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎
179+ ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂
180+ ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙
181+ ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑
182+ ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲
183+
184+ ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
185+
186+ ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹
187+ ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞
188+ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕
189+ ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹
190+ ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎
191+ ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎
192+ ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳
193+ ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞
194+ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
195+
196+ (The first couple of paragraphs of "A Christmas Carol" by Dickens)
197+
198+Compact font selection example text:
199+
200+ ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
201+ abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
202+ –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд
203+ ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა
204+
205+Greetings in various languages:
206+
207+ Hello world, Καλημέρα κόσμε, コンニチハ
208+
209+Box drawing alignment tests: █
210+ ▉
211+ ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳
212+ ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳
213+ ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳
214+ ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
215+ ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎
216+ ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏
217+ ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█
218+ ▝▀▘▙▄▟
219+
220+</pre>
httpbin-tests/Network/HTTP/ReqSpec.hs+134−2
@@ -35,6 +35,7 @@
3535{-# LANGUAGE DataKinds #-}
3636{-# LANGUAGE FlexibleInstances #-}
3737{-# LANGUAGE OverloadedStrings #-}
38+{-# LANGUAGE RankNTypes #-}
3839{-# OPTIONS_GHC -fno-warn-orphans #-}
3940
4041module Network.HTTP.ReqSpec
@@ -44,15 +45,20 @@ where
4445import Control.Exception (throwIO)
4546import Control.Monad.Reader
4647import Data.Aeson (Value (..), object, (.=))
48+import Data.Default.Class
4749import Data.HashMap.Strict (HashMap)
4850import Data.Monoid ((<>))
4951import Data.Text (Text)
5052import Network.HTTP.Req
5153import Test.Hspec
54+import Test.QuickCheck
55+import qualified Data.ByteString as B
5256import qualified Data.HashMap.Strict as HM
57+import qualified Data.Text.Encoding as T
5358
5459#if !MIN_VERSION_base(4,8,0)
5560import Data.Monoid (mempty)
61+import Data.Word (Word)
5662#endif
5763
5864spec :: Spec
@@ -97,8 +103,114 @@ spec = do
97103 , "headers" .= object
98104 [ "Accept-Encoding" .= ("gzip" :: Text)
99105 , "Host" .= ("httpbin.org" :: Text) ] ]
100− responseStatusCode r `shouldBe` 200
101− responseStatusMessage r `shouldBe` "OK"
106+ responseStatusCode r `shouldBe` 200
107+ responseStatusMessage r `shouldBe` "OK"
108+
109+ -- TODO /post
110+ -- TODO /patch
111+ -- TODO /put
112+ -- TODO /delete
113+
114+ describe "receiving UTF-8 encoded Unicode data" $
115+ it "works" $ do
116+ r <- req GET (httpbin /: "encoding" /: "utf8")
117+ NoReqBody bsResponse mempty
118+ utf8data <- B.readFile "httpbin-data/utf8.html"
119+ responseBody r `shouldBe` utf8data
120+ responseStatusCode r `shouldBe` 200
121+ responseStatusMessage r `shouldBe` "OK"
122+
123+ -- TODO /gzip
124+ -- TODO /deflate
125+
126+ forM_ [101..102] checkStatusCode
127+ forM_ [200..208] checkStatusCode
128+ -- forM_ [300..308] checkStatusCode
129+ forM_ [400..431] checkStatusCode
130+ forM_ [500..511] checkStatusCode
131+
132+ -- TODO /response-headers
133+ -- TODO /redirect
134+
135+ describe "redirects" $
136+ it "follows redirects" $ do
137+ r <- req GET (httpbin /: "redirect-to") NoReqBody ignoreResponse
138+ ("url" =: ("https://httpbin.org" :: Text))
139+ responseStatusCode r `shouldBe` 200
140+ responseStatusMessage r `shouldBe` "OK"
141+
142+ -- TODO /relative-redicet
143+ -- TODO /absolute-redirect
144+ -- TODO /cookies
145+
146+ describe "basicAuth" $ do
147+ let user, password :: Text
148+ user = "Scooby"
149+ password = "Doo"
150+ context "when we do not send appropriate basic auth data" $
151+ it "fails with 401" $ do
152+ r <- prepareForShit $ req GET
153+ (httpbin /: "basic-auth" /~ user /~ password)
154+ NoReqBody ignoreResponse mempty
155+ responseStatusCode r `shouldBe` 401
156+ responseStatusMessage r `shouldBe` "UNAUTHORIZED"
157+ context "when we provide appropriate basic auth data" $
158+ it "succeeds" $ do
159+ r <- req GET (httpbin /: "basic-auth" /~ user /~ password)
160+ NoReqBody ignoreResponse
161+ (basicAuth (T.encodeUtf8 user) (T.encodeUtf8 password))
162+ responseStatusCode r `shouldBe` 200
163+ responseStatusMessage r `shouldBe` "OK"
164+
165+ -- TODO /hidden-basic-auth
166+ -- TODO /digest-auth
167+ -- TODO /stream
168+ -- TODO /delay
169+ -- TODO /drip
170+ -- TODO /range
171+ -- TODO /html
172+
173+ describe "robots.txt" $
174+ it "works" $ do
175+ r <- req GET (httpbin /: "robots.txt") NoReqBody bsResponse mempty
176+ robots <- B.readFile "httpbin-data/robots.txt"
177+ responseBody r `shouldBe` robots
178+ responseStatusCode r `shouldBe` 200
179+ responseStatusMessage r `shouldBe` "OK"
180+
181+ -- TODO /deny
182+ -- TODO /cache
183+
184+ describe "getting random bytes" $
185+ it "works" $
186+ property $ \n' -> do
187+ let n :: Word
188+ n = getSmall n'
189+ r <- req GET (httpbin /: "bytes" /~ n)
190+ NoReqBody bsResponse mempty
191+ responseBody r `shouldSatisfy` ((== n) . fromIntegral . B.length)
192+ responseStatusCode r `shouldBe` 200
193+ responseStatusMessage r `shouldBe` "OK"
194+
195+ describe "streaming random bytes" $
196+ it "works" $
197+ property $ \n' -> do
198+ let n :: Word
199+ n = getSmall n'
200+ r <- req GET (httpbin /: "stream-bytes" /~ n)
201+ NoReqBody bsResponse mempty
202+ responseBody r `shouldSatisfy` ((== n) . fromIntegral . B.length)
203+ responseStatusCode r `shouldBe` 200
204+ responseStatusMessage r `shouldBe` "OK"
205+
206+ -- TODO /links
207+ -- TODO /image
208+ -- TODO /image/png
209+ -- TODO /image/jpeg
210+ -- TODO /image/webp
211+ -- TODO /image/svg
212+ -- TODO /forms/post
213+ -- TODO /xml
102214
103215----------------------------------------------------------------------------
104216-- Instances
@@ -113,6 +225,15 @@ instance MonadHttp (ReaderT HttpConfig IO) where
113225----------------------------------------------------------------------------
114226-- Helpers
115227
228+-- | Run request with such settings that it does not signal error on adverse
229+-- response status codes.
230+
231+prepareForShit
232+ :: (forall m. MonadHttp m => m a)
233+ -> IO a
234+prepareForShit m = runReaderT m def { httpConfigCheckResponse = noNoise }
235+ where noNoise _ _ = return ()
236+
116237-- | 'Url' representing <https://httpbin.org>.
117238
118239httpbin :: Url 'Https
@@ -124,3 +245,14 @@ httpbin = https "httpbin.org"
124245stripOrigin :: Value -> Value
125246stripOrigin (Object m) = Object (HM.delete "origin" m)
126247stripOrigin value = value
248+
249+-- | This is a complete test case that makes use of <https://httpbin.org> to
250+-- get various response status codes.
251+
252+checkStatusCode :: Int -> SpecWith ()
253+checkStatusCode code =
254+ describe ("receiving status code " ++ show code) $
255+ it "works" $ do
256+ r <- prepareForShit $ req GET (httpbin /: "status" /~ code)
257+ NoReqBody ignoreResponse mempty
258+ responseStatusCode r `shouldBe` code
req.cabal+6−1
@@ -45,6 +45,8 @@ build-type: Simple
4545description: Easy-to-use, type-safe, expandable, high-level HTTP library.
4646extra-doc-files: CHANGELOG.md
4747 , README.md
48+data-files: httpbin-data/utf8.html
49+ , httpbin-data/robots.txt
4850
4951source-repository head
5052 type: git
@@ -111,8 +113,11 @@ test-suite httpbin-tests
111113 other-modules: Network.HTTP.ReqSpec
112114 hs-source-dirs: httpbin-tests
113115 type: exitcode-stdio-1.0
114− build-depends: aeson >= 0.11 && < 1.1
116+ build-depends: QuickCheck >= 2.7 && < 3.0
117+ , aeson >= 0.11 && < 1.1
115118 , base >= 4.7 && < 5.0
119+ , bytestring >= 0.10.8 && < 0.11
120+ , data-default-class
116121 , hspec >= 2.0 && < 3.0
117122 , mtl >= 2.0 && < 3.0
118123 , req >= 0.1.0