http.rb 0.21.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,408 @@
1
+ # test/HTTP/put_test.rb
2
+
3
+ require_relative '../helper'
4
+
5
+ describe ".put" do
6
+ describe "with uri-only supplied" do
7
+ before do
8
+ stub_request(:put, 'http://example.com/path').
9
+ with(headers: {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'Ruby'}).
10
+ to_return(status: 200, body: '', headers: {})
11
+ end
12
+
13
+ describe "uri as a string" do
14
+ let(:uri){'http://example.com/path'}
15
+
16
+ it "creates an instance of URI" do
17
+ received_arg = nil
18
+ parsed_uri = URI.parse(uri)
19
+ URI.stub(:parse, ->(arg){received_arg = arg; parsed_uri}) do
20
+ response = HTTP.put(uri)
21
+ _(received_arg).must_equal(uri)
22
+ _(response.success?).must_equal(true)
23
+ end
24
+ end
25
+
26
+ it "creates a new Net::HTTP object" do
27
+ received_args = nil
28
+ parsed_uri = URI.parse(uri)
29
+ net_http_object = Net::HTTP.new(parsed_uri.host, parsed_uri.port)
30
+ Net::HTTP.stub(:new, ->(*args){received_args = args; net_http_object}) do
31
+ response = HTTP.put(uri)
32
+ _(received_args).must_equal([parsed_uri.host, parsed_uri.port])
33
+ _(response.success?).must_equal(true)
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "uri as a URI" do
39
+ let(:uri){URI.parse('http://example.com/path')}
40
+
41
+ it "creates a new Net::HTTP object" do
42
+ received_args = nil
43
+ net_http_object = Net::HTTP.new(uri.host, uri.port)
44
+ Net::HTTP.stub(:new, ->(*args){received_args = args; net_http_object}) do
45
+ response = HTTP.put(uri)
46
+ _(received_args).must_equal([uri.host, uri.port])
47
+ _(response.success?).must_equal(true)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "with form data supplied" do
54
+ let(:uri){'http://example.com/path'}
55
+ let(:parsed_uri){URI.parse(uri)}
56
+ let(:args){{a: 1, b: 2}}
57
+ let(:headers){{'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'Ruby'}}
58
+ let(:encoded_form_data){args.x_www_form_urlencode}
59
+
60
+ before do
61
+ stub_request(:put, 'http://example.com/path').
62
+ with(body: encoded_form_data, headers: headers).
63
+ to_return(status: 200, body: '', headers: {})
64
+ end
65
+
66
+ it "sets the form data" do
67
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
68
+ Net::HTTP::Put.stub(:new, request_object) do
69
+ response = HTTP.put(uri, args, headers)
70
+ _(request_object.body).must_equal(encoded_form_data)
71
+ _(response.success?).must_equal(true)
72
+ end
73
+ end
74
+
75
+ it "creates a new Net::HTTP::Put object" do
76
+ received_arg = nil
77
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
78
+ Net::HTTP::Put.stub(:new, ->(arg){received_arg = arg; request_object}) do
79
+ response = HTTP.put(uri, args, headers)
80
+ _(received_arg).must_equal(parsed_uri.request_uri)
81
+ _(response.success?).must_equal(true)
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "with raw form data supplied" do
87
+ let(:uri){'http://example.com/path'}
88
+ let(:parsed_uri){URI.parse(uri)}
89
+ let(:args){{a: 1, b: 2}.x_www_form_urlencode}
90
+ let(:headers){{'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'Ruby'}}
91
+
92
+ before do
93
+ stub_request(:put, 'http://example.com/path').
94
+ with(body: args, headers: headers).
95
+ to_return(status: 200, body: '', headers: {})
96
+ end
97
+
98
+ it "sets the form data" do
99
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
100
+ Net::HTTP::Put.stub(:new, request_object) do
101
+ response = HTTP.put(uri, args, headers)
102
+ _(request_object.body).must_equal(args)
103
+ _(response.success?).must_equal(true)
104
+ end
105
+ end
106
+
107
+ it "creates a new Net::HTTP::Put object" do
108
+ received_arg = nil
109
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
110
+ Net::HTTP::Put.stub(:new, ->(arg){received_arg = arg; request_object}) do
111
+ response = HTTP.put(uri, args, headers)
112
+ _(received_arg).must_equal(parsed_uri.request_uri)
113
+ _(response.success?).must_equal(true)
114
+ end
115
+ end
116
+ end
117
+
118
+ describe "with JSON data supplied" do
119
+ let(:uri){'http://example.com/path'}
120
+ let(:parsed_uri){URI.parse(uri)}
121
+ let(:args){{a: 1, b: 2}}
122
+ let(:headers){{'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/json', 'User-Agent' => 'Ruby'}}
123
+ let(:json_data){JSON.dump(args)}
124
+
125
+ before do
126
+ stub_request(:put, 'http://example.com/path').
127
+ with(body: json_data, headers: headers).
128
+ to_return(status: 200, body: '', headers: {})
129
+ end
130
+
131
+ it "sets the body" do
132
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
133
+ Net::HTTP::Put.stub(:new, request_object) do
134
+ response = HTTP.put(uri, args, headers)
135
+ _(request_object.body).must_equal(json_data)
136
+ _(response.success?).must_equal(true)
137
+ end
138
+ end
139
+
140
+ it "creates a new Net::HTTP::Put object" do
141
+ received_arg = nil
142
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
143
+ Net::HTTP::Put.stub(:new, ->(arg){received_arg = arg; request_object}) do
144
+ response = HTTP.put(uri, args, headers)
145
+ _(received_arg).must_equal(parsed_uri.request_uri)
146
+ _(response.success?).must_equal(true)
147
+ end
148
+ end
149
+ end
150
+
151
+ describe "with raw JSON data supplied" do
152
+ let(:uri){'http://example.com/path'}
153
+ let(:parsed_uri){URI.parse(uri)}
154
+ let(:args){JSON.dump({a: 1, b: 2})}
155
+ let(:headers){{'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/json', 'User-Agent' => 'Ruby'}}
156
+
157
+ before do
158
+ stub_request(:put, 'http://example.com/path').
159
+ with(body: args, headers: headers).
160
+ to_return(status: 200, body: '', headers: {})
161
+ end
162
+
163
+ it "sets the body" do
164
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
165
+ Net::HTTP::Put.stub(:new, request_object) do
166
+ response = HTTP.put(uri, args, headers)
167
+ _(request_object.body).must_equal(args)
168
+ _(response.success?).must_equal(true)
169
+ end
170
+ end
171
+
172
+ it "creates a new Net::HTTP::Put object" do
173
+ received_arg = nil
174
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
175
+ Net::HTTP::Put.stub(:new, ->(arg){received_arg = arg; request_object}) do
176
+ response = HTTP.put(uri, args, headers)
177
+ _(received_arg).must_equal(parsed_uri.request_uri)
178
+ _(response.success?).must_equal(true)
179
+ end
180
+ end
181
+ end
182
+
183
+ describe "with headers supplied" do
184
+ let(:uri){'http://example.com/path'}
185
+ let(:parsed_uri){URI.parse(uri)}
186
+
187
+ before do
188
+ stub_request(:put, 'http://example.com/path').
189
+ with(headers: {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'Minitest'}).
190
+ to_return(status: 200, body: '', headers: {})
191
+ end
192
+
193
+ it "sets the headers on the request object" do
194
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
195
+ Net::HTTP::Put.stub(:new, request_object) do
196
+ response = HTTP.put(uri, {}, {'User-Agent' => 'Minitest'})
197
+ _(request_object['User-Agent']).must_equal('Minitest')
198
+ _(response.success?).must_equal(true)
199
+ end
200
+ end
201
+ end
202
+
203
+ describe "when different content-type header key cases are supplied" do
204
+ let(:uri){'http://example.com/path'}
205
+ let(:parsed_uri){URI.parse(uri)}
206
+ let(:args){{a: 1, b: 2}}
207
+
208
+ before do
209
+ stub_request(:put, 'http://example.com/path').
210
+ with(headers: {'Content-Type' => 'application/json'}).
211
+ to_return(status: 200, body: '', headers: {})
212
+ end
213
+
214
+ describe "title-cased" do
215
+ it "detects the content type" do
216
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
217
+ Net::HTTP::Put.stub(:new, request_object) do
218
+ HTTP.put(uri, args, {'Content-Type' => 'application/json'})
219
+ _(request_object['Content-Type']).must_equal('application/json')
220
+ _(request_object.body).must_equal(JSON.dump(args))
221
+ end
222
+ end
223
+ end
224
+
225
+ describe "title-case only at the start" do
226
+ it "detects the content type" do
227
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
228
+ Net::HTTP::Put.stub(:new, request_object) do
229
+ HTTP.put(uri, args, {'Content-type' => 'application/json'})
230
+ _(request_object['Content-Type']).must_equal('application/json')
231
+ _(request_object.body).must_equal(JSON.dump(args))
232
+ end
233
+ end
234
+ end
235
+
236
+ describe "lowercase" do
237
+ it "detects the content type" do
238
+ request_object = Net::HTTP::Put.new(parsed_uri.request_uri)
239
+ Net::HTTP::Put.stub(:new, request_object) do
240
+ HTTP.put(uri, args, {'content-type' => 'application/json'})
241
+ _(request_object['Content-Type']).must_equal('application/json')
242
+ _(request_object.body).must_equal(JSON.dump(args))
243
+ end
244
+ end
245
+ end
246
+ end
247
+
248
+ describe "with options supplied" do
249
+ let(:uri){'http://example.com/path'}
250
+ let(:parsed_uri){URI.parse(uri)}
251
+
252
+ before do
253
+ stub_request(:put, 'https://example.com:80/path').
254
+ with(headers: {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'Ruby'}).
255
+ to_return(status: 200, body: '', headers: {})
256
+ end
257
+
258
+ it "sets the use_ssl option on the Net::HTTP instance" do
259
+ net_http_object = Net::HTTP.new(parsed_uri.host, parsed_uri.port)
260
+ Net::HTTP.stub(:new, net_http_object) do
261
+ response = HTTP.put(uri, {}, {}, {use_ssl: true})
262
+ _(net_http_object.instance_variable_get(:@use_ssl)).must_equal(true)
263
+ _(response.success?).must_equal(true)
264
+ end
265
+ end
266
+ end
267
+
268
+ describe "with block supplied" do
269
+ let(:uri){'http://example.com/path'}
270
+
271
+ before do
272
+ stub_request(:put, 'http://example.com/path').
273
+ with(headers: {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'Ruby'}).
274
+ to_return(status: 200, body: '', headers: {})
275
+ end
276
+
277
+ it "yields an instance of Net::HTTPResponse" do
278
+ yielded = nil
279
+ HTTP.put(uri){|response| yielded = response}
280
+ _(yielded).must_be_kind_of(Net::HTTPResponse)
281
+ end
282
+ end
283
+
284
+ describe "with redirection" do
285
+ let(:request_uri){'http://example.com/path'}
286
+ let(:redirect_uri){'http://redirected.com'}
287
+
288
+ before do
289
+ stub_request(:get, redirect_uri).
290
+ to_return(status: 200, body: '', headers: {})
291
+ end
292
+
293
+ describe "via 301" do
294
+ before do
295
+ stub_request(:put, request_uri).
296
+ to_return(status: 301, headers: {'location' => redirect_uri})
297
+ end
298
+
299
+ it "follows the redirect with GET" do
300
+ response = HTTP.put(request_uri)
301
+ _(response.success?).must_equal(true)
302
+ assert_requested(:put, request_uri)
303
+ assert_requested(:get, redirect_uri)
304
+ end
305
+ end
306
+
307
+ describe "via 302" do
308
+ before do
309
+ stub_request(:put, request_uri).
310
+ to_return(status: 302, headers: {'location' => redirect_uri})
311
+ end
312
+
313
+ it "follows the redirect with GET" do
314
+ response = HTTP.put(request_uri)
315
+ _(response.success?).must_equal(true)
316
+ assert_requested(:put, request_uri)
317
+ assert_requested(:get, redirect_uri)
318
+ end
319
+ end
320
+ end
321
+
322
+ describe "with path only redirection" do
323
+ let(:request_uri){'http://example.com/path'}
324
+ let(:redirect_path){'/new_path'}
325
+ let(:redirect_uri){"http://example.com#{redirect_path}"}
326
+
327
+ before do
328
+ stub_request(:get, redirect_uri).
329
+ to_return(status: 200, body: '', headers: {})
330
+ end
331
+
332
+ describe "via 301" do
333
+ before do
334
+ stub_request(:put, request_uri).
335
+ to_return(status: 301, headers: {'location' => redirect_path})
336
+ end
337
+
338
+ it "resolves the relative redirect against the original URI" do
339
+ response = HTTP.put(request_uri)
340
+ _(response.success?).must_equal(true)
341
+ assert_requested(:get, redirect_uri)
342
+ end
343
+ end
344
+
345
+ describe "via 302" do
346
+ before do
347
+ stub_request(:put, request_uri).
348
+ to_return(status: 302, headers: {'location' => redirect_path})
349
+ end
350
+
351
+ it "resolves the relative redirect against the original URI" do
352
+ response = HTTP.put(request_uri)
353
+ _(response.success?).must_equal(true)
354
+ assert_requested(:get, redirect_uri)
355
+ end
356
+ end
357
+ end
358
+
359
+ describe "with verb-preserving redirection via 307" do
360
+ let(:request_uri){'http://example.com/path'}
361
+ let(:redirect_uri){'http://redirected.com'}
362
+
363
+ before do
364
+ stub_request(:put, request_uri).
365
+ to_return(status: 307, headers: {'location' => redirect_uri})
366
+ stub_request(:put, redirect_uri).
367
+ to_return(status: 200, body: '', headers: {})
368
+ end
369
+
370
+ it "preserves the verb" do
371
+ response = HTTP.put(request_uri)
372
+ _(response.success?).must_equal(true)
373
+ assert_requested(:put, request_uri)
374
+ assert_requested(:put, redirect_uri)
375
+ end
376
+ end
377
+
378
+ describe "no_redirect true" do
379
+ let(:request_uri){'http://example.com/path'}
380
+ let(:redirect_uri){'http://redirected.com'}
381
+
382
+ describe "via 301" do
383
+ before do
384
+ stub_request(:put, request_uri).
385
+ to_return(status: 301, headers: {'location' => redirect_uri})
386
+ end
387
+
388
+ it "returns the redirect response without following it" do
389
+ response = HTTP.put(request_uri, {}, {}, {no_redirect: true})
390
+ _(response.redirection?).must_equal(true)
391
+ assert_not_requested(:get, redirect_uri)
392
+ end
393
+ end
394
+
395
+ describe "via 302" do
396
+ before do
397
+ stub_request(:put, request_uri).
398
+ to_return(status: 302, headers: {'location' => redirect_uri})
399
+ end
400
+
401
+ it "returns the redirect response without following it" do
402
+ response = HTTP.put(request_uri, {}, {}, {no_redirect: true})
403
+ _(response.redirection?).must_equal(true)
404
+ assert_not_requested(:get, redirect_uri)
405
+ end
406
+ end
407
+ end
408
+ end
@@ -0,0 +1,246 @@
1
+ # test/HTTP/trace_test.rb
2
+
3
+ require_relative '../helper'
4
+
5
+ describe ".trace" do
6
+ describe "with uri-only supplied" do
7
+ before do
8
+ stub_request(:trace, 'http://example.com/path').
9
+ with(headers: {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent' => 'Ruby'}).
10
+ to_return(status: 200, body: '', headers: {})
11
+ end
12
+
13
+ describe "uri as a string" do
14
+ let(:uri){'http://example.com/path'}
15
+
16
+ it "creates an instance of URI" do
17
+ received_arg = nil
18
+ parsed_uri = URI.parse(uri)
19
+ URI.stub(:parse, ->(arg){received_arg = arg; parsed_uri}) do
20
+ response = HTTP.trace(uri)
21
+ _(received_arg).must_equal(uri)
22
+ _(response.success?).must_equal(true)
23
+ end
24
+ end
25
+
26
+ it "creates a new Net::HTTP object" do
27
+ received_args = nil
28
+ parsed_uri = URI.parse(uri)
29
+ net_http_object = Net::HTTP.new(parsed_uri.host, parsed_uri.port)
30
+ Net::HTTP.stub(:new, ->(*args){received_args = args; net_http_object}) do
31
+ response = HTTP.trace(uri)
32
+ _(received_args).must_equal([parsed_uri.host, parsed_uri.port])
33
+ _(response.success?).must_equal(true)
34
+ end
35
+ end
36
+ end
37
+
38
+ describe "uri as a URI" do
39
+ let(:uri){URI.parse('http://example.com/path')}
40
+
41
+ it "creates a new Net::HTTP object" do
42
+ received_args = nil
43
+ net_http_object = Net::HTTP.new(uri.host, uri.port)
44
+ Net::HTTP.stub(:new, ->(*args){received_args = args; net_http_object}) do
45
+ response = HTTP.trace(uri)
46
+ _(received_args).must_equal([uri.host, uri.port])
47
+ _(response.success?).must_equal(true)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "with args supplied" do
54
+ let(:uri){'http://example.com/path'}
55
+ let(:parsed_uri){URI.parse(uri)}
56
+
57
+ before do
58
+ stub_request(:trace, 'http://example.com/path?a=1&b=2').
59
+ with(headers: {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent' => 'Ruby'}).
60
+ to_return(status: 200, body: '', headers: {})
61
+ end
62
+
63
+ it "x_www_form_urlencode's the args" do
64
+ args = {a: 1, b: 2}
65
+ called = false
66
+ args.stub(:x_www_form_urlencode, ->{called = true; 'a=1&b=2'}) do
67
+ response = HTTP.trace(uri, args)
68
+ _(called).must_equal(true)
69
+ _(response.success?).must_equal(true)
70
+ end
71
+ end
72
+
73
+ it "creates a new Net::HTTP::Trace object" do
74
+ received_arg = nil
75
+ trace_argument = parsed_uri.request_uri + '?a=1&b=2'
76
+ request_object = Net::HTTP::Trace.new(trace_argument)
77
+ Net::HTTP::Trace.stub(:new, ->(arg){received_arg = arg; request_object}) do
78
+ response = HTTP.trace(uri, {a: 1, b: 2})
79
+ _(received_arg).must_equal(trace_argument)
80
+ _(response.success?).must_equal(true)
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "with headers supplied" do
86
+ let(:uri){'http://example.com/path'}
87
+ let(:parsed_uri){URI.parse(uri)}
88
+
89
+ before do
90
+ stub_request(:trace, 'http://example.com/path').
91
+ with(headers: {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent' => 'Minitest'}).
92
+ to_return(status: 200, body: '', headers: {})
93
+ end
94
+
95
+ it "sets the headers on the request object" do
96
+ request_object = Net::HTTP::Trace.new(parsed_uri.request_uri)
97
+ Net::HTTP::Trace.stub(:new, request_object) do
98
+ response = HTTP.trace(uri, {}, {'User-Agent' => 'Minitest'})
99
+ _(request_object['User-Agent']).must_equal('Minitest')
100
+ _(response.success?).must_equal(true)
101
+ end
102
+ end
103
+ end
104
+
105
+ describe "with options supplied" do
106
+ let(:uri){'http://example.com/path'}
107
+ let(:parsed_uri){URI.parse(uri)}
108
+
109
+ before do
110
+ stub_request(:trace, 'https://example.com:80/path').
111
+ with(headers: {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent' => 'Ruby'}).
112
+ to_return(status: 200, body: '', headers: {})
113
+ end
114
+
115
+ it "sets the use_ssl option on the Net::HTTP instance" do
116
+ net_http_object = Net::HTTP.new(parsed_uri.host, parsed_uri.port)
117
+ Net::HTTP.stub(:new, net_http_object) do
118
+ response = HTTP.trace(uri, {}, {}, {use_ssl: true})
119
+ _(net_http_object.instance_variable_get(:@use_ssl)).must_equal(true)
120
+ _(response.success?).must_equal(true)
121
+ end
122
+ end
123
+ end
124
+
125
+ describe "with block supplied" do
126
+ let(:uri){'http://example.com/path'}
127
+
128
+ before do
129
+ stub_request(:trace, 'http://example.com/path').
130
+ with(headers: {'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent' => 'Ruby'}).
131
+ to_return(status: 200, body: '', headers: {})
132
+ end
133
+
134
+ it "yields an instance of Net::HTTPResponse" do
135
+ yielded = nil
136
+ HTTP.trace(uri){|response| yielded = response}
137
+ _(yielded).must_be_kind_of(Net::HTTPResponse)
138
+ end
139
+ end
140
+
141
+ describe "with redirection" do
142
+ let(:request_uri){'http://example.com/path'}
143
+ let(:redirect_uri){'http://redirected.com'}
144
+
145
+ before do
146
+ stub_request(:get, redirect_uri).
147
+ to_return(status: 200, body: '', headers: {})
148
+ end
149
+
150
+ describe "via 301" do
151
+ before do
152
+ stub_request(:trace, request_uri).
153
+ to_return(status: 301, headers: {'location' => redirect_uri})
154
+ end
155
+
156
+ it "follows the redirect" do
157
+ response = HTTP.trace(request_uri)
158
+ _(response.success?).must_equal(true)
159
+ assert_requested(:trace, request_uri)
160
+ assert_requested(:get, redirect_uri)
161
+ end
162
+ end
163
+
164
+ describe "via 302" do
165
+ before do
166
+ stub_request(:trace, request_uri).
167
+ to_return(status: 302, headers: {'location' => redirect_uri})
168
+ end
169
+
170
+ it "follows the redirect" do
171
+ response = HTTP.trace(request_uri)
172
+ _(response.success?).must_equal(true)
173
+ assert_requested(:trace, request_uri)
174
+ assert_requested(:get, redirect_uri)
175
+ end
176
+ end
177
+ end
178
+
179
+ describe "with path only redirection" do
180
+ let(:request_uri){'http://example.com/path'}
181
+ let(:redirect_path){'/new_path'}
182
+ let(:redirect_uri){"http://example.com#{redirect_path}"}
183
+
184
+ before do
185
+ stub_request(:get, redirect_uri).
186
+ to_return(status: 200, body: '', headers: {})
187
+ end
188
+
189
+ describe "via 301" do
190
+ before do
191
+ stub_request(:trace, request_uri).
192
+ to_return(status: 301, headers: {'location' => redirect_path})
193
+ end
194
+
195
+ it "resolves the relative redirect against the original URI" do
196
+ response = HTTP.trace(request_uri)
197
+ _(response.success?).must_equal(true)
198
+ assert_requested(:get, redirect_uri)
199
+ end
200
+ end
201
+
202
+ describe "via 302" do
203
+ before do
204
+ stub_request(:trace, request_uri).
205
+ to_return(status: 302, headers: {'location' => redirect_path})
206
+ end
207
+
208
+ it "resolves the relative redirect against the original URI" do
209
+ response = HTTP.trace(request_uri)
210
+ _(response.success?).must_equal(true)
211
+ assert_requested(:get, redirect_uri)
212
+ end
213
+ end
214
+ end
215
+
216
+ describe "no_redirect true" do
217
+ let(:request_uri){'http://example.com/path'}
218
+ let(:redirect_uri){'http://redirected.com'}
219
+
220
+ describe "via 301" do
221
+ before do
222
+ stub_request(:trace, request_uri).
223
+ to_return(status: 301, headers: {'location' => redirect_uri})
224
+ end
225
+
226
+ it "returns the redirect response without following it" do
227
+ response = HTTP.trace(request_uri, {}, {}, {no_redirect: true})
228
+ _(response.redirection?).must_equal(true)
229
+ assert_not_requested(:get, redirect_uri)
230
+ end
231
+ end
232
+
233
+ describe "via 302" do
234
+ before do
235
+ stub_request(:trace, request_uri).
236
+ to_return(status: 302, headers: {'location' => redirect_uri})
237
+ end
238
+
239
+ it "returns the redirect response without following it" do
240
+ response = HTTP.trace(request_uri, {}, {}, {no_redirect: true})
241
+ _(response.redirection?).must_equal(true)
242
+ assert_not_requested(:get, redirect_uri)
243
+ end
244
+ end
245
+ end
246
+ end
@@ -1,4 +1,4 @@
1
- # spec/spec_helper.rb
1
+ # test/helper.rb
2
2
 
3
3
  lib_dir = File.expand_path(File.join(__FILE__, '..', '..', 'lib'))
4
4
  $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
@@ -6,10 +6,23 @@ $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
6
6
  # Skip webmock's http_rb adapter: it auto-requires 'http', which collides
7
7
  # with this gem's lib/HTTP.rb on case-insensitive filesystems and crashes
8
8
  # while trying to monkey-patch the wrong HTTP module.
9
+
9
10
  gem 'webmock'
11
+
10
12
  $LOADED_FEATURES << File.join(
11
13
  Gem.loaded_specs['webmock'].full_gem_path,
12
14
  'lib/webmock/http_lib_adapters/http_rb_adapter.rb'
13
15
  )
14
16
 
15
- require 'webmock/rspec'
17
+ require 'minitest/autorun'
18
+ require 'minitest/mock'
19
+ require 'minitest/spec'
20
+ require 'webmock/minitest'
21
+
22
+ require 'http'
23
+
24
+ MockResponse = Struct.new(:code, :message, :body, :headers_hash, keyword_init: true) do
25
+ def [](key)
26
+ headers_hash&.dig(key)
27
+ end
28
+ end