diamond-mechanize 2.1 → 2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. metadata +222 -167
  2. data/Rakefile +0 -49
  3. data/lib/mechanize/content_type_error.rb +0 -13
  4. data/lib/mechanize/cookie.rb +0 -232
  5. data/lib/mechanize/cookie_jar.rb +0 -194
  6. data/lib/mechanize/download.rb +0 -59
  7. data/lib/mechanize/element_matcher.rb +0 -36
  8. data/lib/mechanize/file.rb +0 -65
  9. data/lib/mechanize/file_connection.rb +0 -17
  10. data/lib/mechanize/file_request.rb +0 -26
  11. data/lib/mechanize/file_response.rb +0 -74
  12. data/lib/mechanize/file_saver.rb +0 -39
  13. data/lib/mechanize/form/button.rb +0 -6
  14. data/lib/mechanize/form/check_box.rb +0 -12
  15. data/lib/mechanize/form/field.rb +0 -54
  16. data/lib/mechanize/form/file_upload.rb +0 -21
  17. data/lib/mechanize/form/hidden.rb +0 -3
  18. data/lib/mechanize/form/image_button.rb +0 -19
  19. data/lib/mechanize/form/keygen.rb +0 -34
  20. data/lib/mechanize/form/multi_select_list.rb +0 -94
  21. data/lib/mechanize/form/option.rb +0 -50
  22. data/lib/mechanize/form/radio_button.rb +0 -55
  23. data/lib/mechanize/form/reset.rb +0 -3
  24. data/lib/mechanize/form/select_list.rb +0 -44
  25. data/lib/mechanize/form/submit.rb +0 -3
  26. data/lib/mechanize/form/text.rb +0 -3
  27. data/lib/mechanize/form/textarea.rb +0 -3
  28. data/lib/mechanize/form.rb +0 -543
  29. data/lib/mechanize/headers.rb +0 -23
  30. data/lib/mechanize/history.rb +0 -82
  31. data/lib/mechanize/http/agent.rb +0 -1004
  32. data/lib/mechanize/http/auth_challenge.rb +0 -59
  33. data/lib/mechanize/http/auth_realm.rb +0 -31
  34. data/lib/mechanize/http/content_disposition_parser.rb +0 -188
  35. data/lib/mechanize/http/www_authenticate_parser.rb +0 -155
  36. data/lib/mechanize/http.rb +0 -8
  37. data/lib/mechanize/monkey_patch.rb +0 -16
  38. data/lib/mechanize/page/base.rb +0 -7
  39. data/lib/mechanize/page/frame.rb +0 -27
  40. data/lib/mechanize/page/image.rb +0 -30
  41. data/lib/mechanize/page/label.rb +0 -20
  42. data/lib/mechanize/page/link.rb +0 -98
  43. data/lib/mechanize/page/meta_refresh.rb +0 -68
  44. data/lib/mechanize/page.rb +0 -440
  45. data/lib/mechanize/parser.rb +0 -173
  46. data/lib/mechanize/pluggable_parsers.rb +0 -144
  47. data/lib/mechanize/redirect_limit_reached_error.rb +0 -19
  48. data/lib/mechanize/redirect_not_get_or_head_error.rb +0 -21
  49. data/lib/mechanize/response_code_error.rb +0 -21
  50. data/lib/mechanize/response_read_error.rb +0 -27
  51. data/lib/mechanize/robots_disallowed_error.rb +0 -28
  52. data/lib/mechanize/test_case.rb +0 -663
  53. data/lib/mechanize/unauthorized_error.rb +0 -3
  54. data/lib/mechanize/unsupported_scheme_error.rb +0 -6
  55. data/lib/mechanize/util.rb +0 -101
  56. data/lib/mechanize.rb +0 -1079
  57. data/test/data/htpasswd +0 -1
  58. data/test/data/server.crt +0 -16
  59. data/test/data/server.csr +0 -12
  60. data/test/data/server.key +0 -15
  61. data/test/data/server.pem +0 -15
  62. data/test/htdocs/alt_text.html +0 -10
  63. data/test/htdocs/bad_form_test.html +0 -9
  64. data/test/htdocs/button.jpg +0 -0
  65. data/test/htdocs/canonical_uri.html +0 -9
  66. data/test/htdocs/dir with spaces/foo.html +0 -1
  67. data/test/htdocs/empty_form.html +0 -6
  68. data/test/htdocs/file_upload.html +0 -26
  69. data/test/htdocs/find_link.html +0 -41
  70. data/test/htdocs/form_multi_select.html +0 -16
  71. data/test/htdocs/form_multival.html +0 -37
  72. data/test/htdocs/form_no_action.html +0 -18
  73. data/test/htdocs/form_no_input_name.html +0 -16
  74. data/test/htdocs/form_order_test.html +0 -11
  75. data/test/htdocs/form_select.html +0 -16
  76. data/test/htdocs/form_set_fields.html +0 -14
  77. data/test/htdocs/form_test.html +0 -188
  78. data/test/htdocs/frame_referer_test.html +0 -10
  79. data/test/htdocs/frame_test.html +0 -30
  80. data/test/htdocs/google.html +0 -13
  81. data/test/htdocs/index.html +0 -6
  82. data/test/htdocs/link with space.html +0 -5
  83. data/test/htdocs/meta_cookie.html +0 -11
  84. data/test/htdocs/no_title_test.html +0 -6
  85. data/test/htdocs/noindex.html +0 -9
  86. data/test/htdocs/rails_3_encoding_hack_form_test.html +0 -27
  87. data/test/htdocs/relative/tc_relative_links.html +0 -21
  88. data/test/htdocs/robots.html +0 -8
  89. data/test/htdocs/robots.txt +0 -2
  90. data/test/htdocs/tc_bad_charset.html +0 -9
  91. data/test/htdocs/tc_bad_links.html +0 -5
  92. data/test/htdocs/tc_base_link.html +0 -8
  93. data/test/htdocs/tc_blank_form.html +0 -11
  94. data/test/htdocs/tc_charset.html +0 -6
  95. data/test/htdocs/tc_checkboxes.html +0 -19
  96. data/test/htdocs/tc_encoded_links.html +0 -5
  97. data/test/htdocs/tc_field_precedence.html +0 -11
  98. data/test/htdocs/tc_follow_meta.html +0 -8
  99. data/test/htdocs/tc_form_action.html +0 -48
  100. data/test/htdocs/tc_links.html +0 -19
  101. data/test/htdocs/tc_meta_in_body.html +0 -9
  102. data/test/htdocs/tc_pretty_print.html +0 -17
  103. data/test/htdocs/tc_referer.html +0 -16
  104. data/test/htdocs/tc_relative_links.html +0 -19
  105. data/test/htdocs/tc_textarea.html +0 -23
  106. data/test/htdocs/test_click.html +0 -11
  107. data/test/htdocs/unusual______.html +0 -5
  108. data/test/test_mechanize.rb +0 -1164
  109. data/test/test_mechanize_cookie.rb +0 -451
  110. data/test/test_mechanize_cookie_jar.rb +0 -483
  111. data/test/test_mechanize_download.rb +0 -43
  112. data/test/test_mechanize_file.rb +0 -61
  113. data/test/test_mechanize_file_connection.rb +0 -21
  114. data/test/test_mechanize_file_request.rb +0 -19
  115. data/test/test_mechanize_file_saver.rb +0 -21
  116. data/test/test_mechanize_form.rb +0 -875
  117. data/test/test_mechanize_form_check_box.rb +0 -38
  118. data/test/test_mechanize_form_encoding.rb +0 -114
  119. data/test/test_mechanize_form_field.rb +0 -63
  120. data/test/test_mechanize_form_file_upload.rb +0 -20
  121. data/test/test_mechanize_form_image_button.rb +0 -12
  122. data/test/test_mechanize_form_keygen.rb +0 -32
  123. data/test/test_mechanize_form_multi_select_list.rb +0 -84
  124. data/test/test_mechanize_form_option.rb +0 -55
  125. data/test/test_mechanize_form_radio_button.rb +0 -78
  126. data/test/test_mechanize_form_select_list.rb +0 -76
  127. data/test/test_mechanize_form_textarea.rb +0 -52
  128. data/test/test_mechanize_headers.rb +0 -35
  129. data/test/test_mechanize_history.rb +0 -103
  130. data/test/test_mechanize_http_agent.rb +0 -1225
  131. data/test/test_mechanize_http_auth_challenge.rb +0 -39
  132. data/test/test_mechanize_http_auth_realm.rb +0 -49
  133. data/test/test_mechanize_http_content_disposition_parser.rb +0 -118
  134. data/test/test_mechanize_http_www_authenticate_parser.rb +0 -146
  135. data/test/test_mechanize_link.rb +0 -80
  136. data/test/test_mechanize_page.rb +0 -118
  137. data/test/test_mechanize_page_encoding.rb +0 -182
  138. data/test/test_mechanize_page_frame.rb +0 -16
  139. data/test/test_mechanize_page_link.rb +0 -390
  140. data/test/test_mechanize_page_meta_refresh.rb +0 -127
  141. data/test/test_mechanize_parser.rb +0 -289
  142. data/test/test_mechanize_pluggable_parser.rb +0 -52
  143. data/test/test_mechanize_redirect_limit_reached_error.rb +0 -24
  144. data/test/test_mechanize_redirect_not_get_or_head_error.rb +0 -14
  145. data/test/test_mechanize_subclass.rb +0 -22
  146. data/test/test_mechanize_util.rb +0 -103
  147. data/test/test_multi_select.rb +0 -119
@@ -1,5 +0,0 @@
1
- <html>
2
- <body>
3
- This is a webpage that has a very unusual name.
4
- </body>
5
- </html>
@@ -1,1164 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'mechanize/test_case'
4
-
5
- class TestMechanize < Mechanize::TestCase
6
-
7
- def setup
8
- super
9
-
10
- @uri = URI 'http://example/'
11
- @req = Net::HTTP::Get.new '/'
12
-
13
- @res = Net::HTTPOK.allocate
14
- @res.instance_variable_set :@code, 200
15
- @res.instance_variable_set :@header, {}
16
-
17
- @headers = if RUBY_VERSION > '1.9' then
18
- %w[accept user-agent]
19
- else
20
- %w[accept]
21
- end
22
- end
23
-
24
- def test_back
25
- 0.upto(5) do |i|
26
- assert_equal(i, @mech.history.size)
27
- @mech.get("http://localhost/")
28
- end
29
- @mech.get("http://localhost/form_test.html")
30
-
31
- assert_equal("http://localhost/form_test.html",
32
- @mech.history.last.uri.to_s)
33
- assert_equal("http://localhost/",
34
- @mech.history[-2].uri.to_s)
35
-
36
- assert_equal(7, @mech.history.size)
37
- @mech.back
38
- assert_equal(6, @mech.history.size)
39
- assert_equal("http://localhost/",
40
- @mech.history.last.uri.to_s)
41
- end
42
-
43
- def test_basic_auth
44
- @mech.basic_auth('user', 'pass')
45
- page = @mech.get("http://localhost/basic_auth")
46
- assert_equal('You are authenticated', page.body)
47
- end
48
-
49
- def test_cert_key_file
50
- in_tmpdir do
51
- open 'key.pem', 'w' do |io| io.write ssl_private_key.to_pem end
52
- open 'cert.pem', 'w' do |io| io.write ssl_certificate.to_pem end
53
-
54
- mech = Mechanize.new do |a|
55
- a.cert = 'cert.pem'
56
- a.key = 'key.pem'
57
- end
58
-
59
- # Certificate#== seems broken
60
- assert_equal ssl_certificate.to_pem, mech.certificate.to_pem
61
- end
62
- end
63
-
64
- def test_cert_key_object
65
- mech = Mechanize.new do |a|
66
- a.cert = ssl_certificate
67
- a.key = ssl_private_key
68
- end
69
-
70
- assert_equal ssl_certificate, mech.certificate
71
- end
72
-
73
- def test_cert_store
74
- assert_nil @mech.cert_store
75
-
76
- store = OpenSSL::X509::Store.new
77
- @mech.cert_store = store
78
-
79
- assert_equal store, @mech.cert_store
80
- end
81
-
82
- def test_click
83
- @mech.user_agent_alias = 'Mac Safari'
84
- page = @mech.get("http://localhost/frame_test.html")
85
- link = page.link_with(:text => "Form Test")
86
-
87
- page = @mech.click(link)
88
-
89
- assert_equal("http://localhost/form_test.html",
90
- @mech.history.last.uri.to_s)
91
- end
92
-
93
- def test_click_frame
94
- frame = node 'frame', 'src' => '/index.html'
95
- frame = Mechanize::Page::Frame.new frame, @mech, fake_page
96
-
97
- @mech.click frame
98
-
99
- assert_equal '/index.html', requests.first.path
100
- end
101
-
102
- def test_click_frame_hpricot_style
103
- page = @mech.get("http://localhost/frame_test.html")
104
- link = (page/"//frame[@name='frame2']").first
105
-
106
- page = @mech.click(link)
107
-
108
- assert_equal("http://localhost/form_test.html",
109
- @mech.history.last.uri.to_s)
110
- end
111
-
112
- def test_click_hpricot_style # HACK move to test_divide in Page
113
- page = @mech.get("http://localhost/frame_test.html")
114
- link = (page/"//a[@class='bar']").first
115
-
116
- page = @mech.click(link)
117
-
118
- assert_equal("http://localhost/form_test.html",
119
- @mech.history.last.uri.to_s)
120
- end
121
-
122
- def test_click_link
123
- link = node 'a', 'href' => '/index.html'
124
- link = Mechanize::Page::Link.new link, @mech, fake_page
125
-
126
- @mech.click link
127
-
128
- assert_equal '/index.html', requests.first.path
129
- assert_equal 'http://fake.example/', requests.first['Referer']
130
- end
131
-
132
- def test_click_link_nofollow
133
- page = html_page <<-BODY
134
- <meta name="ROBOTS" content="nofollow">
135
-
136
- <p>Do not follow <a href="/index.html">this</a> or <a href="/">this</a>!
137
- BODY
138
-
139
- page.links[0].click
140
- page.links[1].click
141
-
142
- @mech.robots = true
143
-
144
- assert_raises Mechanize::RobotsDisallowedError do
145
- page.links[0].click
146
- end
147
-
148
- assert_raises Mechanize::RobotsDisallowedError do
149
- page.links[1].click
150
- end
151
- end
152
-
153
- def test_click_link_noreferrer
154
- link = node 'a', 'href' => '/index.html', 'rel' => 'noreferrer'
155
- link = Mechanize::Page::Link.new link, @mech, fake_page
156
-
157
- @mech.click link
158
-
159
- assert_nil requests.first['referer']
160
- end
161
-
162
- def test_click_link_rel_nofollow
163
- page = html_page <<-BODY
164
- <p>You can follow <a href="/index.html">this link</a>
165
- but not <a href="/" rel="me nofollow">this</a>!
166
- BODY
167
-
168
- page.links[0].click
169
- page.links[1].click
170
-
171
- @mech.robots = true
172
-
173
- page.links[0].click
174
-
175
- assert_raises Mechanize::RobotsDisallowedError do
176
- page.links[1].click
177
- end
178
- end
179
-
180
- def test_click_link_parent
181
- page = page URI 'http://example/a/index.html'
182
- link = node 'a', 'href' => '../index.html'
183
- link = Mechanize::Page::Link.new link, @mech, page
184
-
185
- @mech.click link
186
-
187
- assert_equal '/index.html', requests.first.path
188
- end
189
-
190
- def test_click_link_parent_extra
191
- page = page URI 'http://example/a/index.html'
192
- link = node 'a', 'href' => '../../index.html'
193
- link = Mechanize::Page::Link.new link, @mech, page
194
-
195
- @mech.click link
196
-
197
- assert_equal '/index.html', requests.first.path
198
- end
199
-
200
- def test_click_link_hpricot_style # HACK move to test_search in Page
201
- page = @mech.get("http://localhost/tc_encoded_links.html")
202
-
203
- page = @mech.click(page.search('a').first)
204
-
205
- assert_equal("http://localhost/form_post?a=b&b=c", page.uri.to_s)
206
- end
207
-
208
- def test_click_link_query
209
- page = @mech.get("http://localhost/tc_encoded_links.html")
210
- link = page.links.first
211
- assert_equal('/form_post?a=b&b=c', link.href)
212
-
213
- page = @mech.click(link)
214
-
215
- assert_equal("http://localhost/form_post?a=b&b=c", page.uri.to_s)
216
- end
217
-
218
- def test_click_link_space
219
- page = @mech.get("http://localhost/tc_bad_links.html")
220
-
221
- @mech.click page.links.first
222
-
223
- assert_match(/alt_text.html$/, @mech.history.last.uri.to_s)
224
- assert_equal(2, @mech.history.length)
225
- end
226
-
227
- def test_click_more
228
- @mech.get 'http://localhost/test_click.html'
229
- @mech.click 'A Button'
230
- assert_equal 'http://localhost/frame_test.html?words=nil',
231
- @mech.page.uri.to_s
232
- @mech.back
233
- @mech.click 'A Link'
234
- assert_equal 'http://localhost/index.html',
235
- @mech.page.uri.to_s
236
- @mech.back
237
- @mech.click @mech.page.link_with(:text => 'A Link')
238
- assert_equal 'http://localhost/index.html',
239
- @mech.page.uri.to_s
240
- end
241
-
242
- def test_cookies
243
- uri = URI 'http://example'
244
- jar = Mechanize::CookieJar.new
245
- Mechanize::Cookie.parse uri, 'a=b' do |cookie|
246
- jar.add uri, cookie
247
- end
248
-
249
- @mech.cookie_jar = jar
250
-
251
- refute_empty @mech.cookies
252
- end
253
-
254
- def test_cookie_jar
255
- assert_kind_of Mechanize::CookieJar, @mech.cookie_jar
256
-
257
- jar = Mechanize::CookieJar.new
258
-
259
- @mech.cookie_jar = jar
260
-
261
- assert_equal jar, @mech.cookie_jar
262
- end
263
-
264
- def test_delete
265
- page = @mech.delete('http://localhost/verb', { 'q' => 'foo' })
266
- assert_equal 1, @mech.history.length
267
- assert_equal 'DELETE', page.header['X-Request-Method']
268
- end
269
-
270
- def test_delete_redirect
271
- page = @mech.delete('http://localhost/redirect')
272
-
273
- assert_equal(page.uri.to_s, 'http://localhost/verb')
274
-
275
- assert_equal 'GET', page.header['X-Request-Method']
276
- end
277
-
278
- #def test_download
279
- # Dir.mktmpdir do |dir|
280
- # file = "#{dir}/download"
281
- # open file, 'w' do |io|
282
- # @mech.download 'http://example', io
283
- # end
284
-
285
- # assert_equal 1, File.stat(file).size
286
- # end
287
- #end
288
-
289
- def test_get
290
- uri = URI 'http://localhost'
291
-
292
- page = @mech.get uri, { :q => 'h' }, 'http://example', { 'X-H' => 'v' }
293
-
294
- assert_equal URI('http://localhost/?q=h'), page.uri
295
- assert_equal URI('http://localhost'), uri
296
- end
297
-
298
- def test_get_HTTP
299
- page = @mech.get('HTTP://localhost/', { :q => 'hello' })
300
- assert_equal('HTTP://localhost/?q=hello', page.uri.to_s)
301
- end
302
-
303
- def test_get_anchor
304
- page = @mech.get('http://localhost/?foo=bar&#34;')
305
- assert_equal('http://localhost/?foo=bar%22', page.uri.to_s)
306
- end
307
-
308
- def test_get_bad_url
309
- assert_raises ArgumentError do
310
- @mech.get '/foo.html'
311
- end
312
- end
313
-
314
- def test_get_basic_auth_bad
315
- @mech.basic_auth('aaron', 'aaron')
316
-
317
- e = assert_raises Mechanize::UnauthorizedError do
318
- @mech.get("http://localhost/basic_auth")
319
- end
320
-
321
- assert_equal("401", e.response_code)
322
- end
323
-
324
- def test_get_basic_auth_none
325
- e = assert_raises Mechanize::UnauthorizedError do
326
- @mech.get("http://localhost/basic_auth")
327
- end
328
-
329
- assert_equal("401", e.response_code)
330
- end
331
-
332
- def test_get_conditional
333
- assert_empty @mech.history
334
-
335
- page = @mech.get 'http://localhost/if_modified_since'
336
- assert_match(/You did not send/, page.body)
337
-
338
- assert_equal 1, @mech.history.length
339
- page2 = @mech.get 'http://localhost/if_modified_since'
340
-
341
- assert_equal 2, @mech.history.length
342
- assert_equal page.object_id, page2.object_id
343
- end
344
-
345
- def test_get_digest_auth
346
- block_called = false
347
-
348
- @mech.basic_auth('user', 'pass')
349
-
350
- @mech.pre_connect_hooks << lambda { |_, request|
351
- block_called = true
352
- request.to_hash.each do |k,v|
353
- assert_equal(1, v.length)
354
- end
355
- }
356
-
357
- page = @mech.get("http://localhost/digest_auth")
358
- assert_equal('You are authenticated', page.body)
359
- assert block_called
360
- end
361
-
362
- def test_get_file
363
- page = @mech.get("http://localhost/frame_test.html")
364
- content_length = page.header['Content-Length']
365
- page_as_string = @mech.get_file("http://localhost/frame_test.html")
366
- assert_equal(content_length.to_i, page_as_string.length.to_i)
367
- end
368
-
369
- def test_get_follow_meta_refresh
370
- @mech.follow_meta_refresh = true
371
-
372
- page = @mech.get('http://localhost/tc_follow_meta.html')
373
-
374
- assert_equal(2, @mech.history.length)
375
-
376
- assert_equal('http://localhost/tc_follow_meta.html',
377
- @mech.history.first.uri.to_s)
378
- assert_equal('http://localhost/index.html', page.uri.to_s)
379
- assert_equal('http://localhost/index.html', @mech.history.last.uri.to_s)
380
- end
381
-
382
- def test_get_follow_meta_refresh_anywhere
383
- @mech.follow_meta_refresh = :anywhere
384
- requests = []
385
- @mech.pre_connect_hooks << lambda { |_, request|
386
- requests << request
387
- }
388
-
389
- @mech.get('http://localhost/tc_meta_in_body.html')
390
- assert_equal 2, requests.length
391
- end
392
-
393
- def test_get_follow_meta_refresh_disabled
394
- page = @mech.get('http://localhost/tc_follow_meta.html')
395
- assert_equal('http://localhost/tc_follow_meta.html', page.uri.to_s)
396
- assert_equal(1, page.meta_refresh.length)
397
- end
398
-
399
- def test_get_follow_meta_refresh_empty_url
400
- @mech.follow_meta_refresh = true
401
- @mech.follow_meta_refresh_self = true
402
-
403
- page = @mech.get('http://localhost/refresh_with_empty_url')
404
-
405
- assert_equal(3, @mech.history.length)
406
- assert_equal('http://localhost/refresh_with_empty_url',
407
- @mech.history[0].uri.to_s)
408
- assert_equal('http://localhost/refresh_with_empty_url',
409
- @mech.history[1].uri.to_s)
410
- assert_equal('http://localhost/index.html', page.uri.to_s)
411
- assert_equal('http://localhost/index.html', @mech.history.last.uri.to_s)
412
- end
413
-
414
- def test_get_follow_meta_refresh_in_body
415
- @mech.follow_meta_refresh = true
416
- requests = []
417
- @mech.pre_connect_hooks << lambda { |_, request|
418
- requests << request
419
- }
420
-
421
- @mech.get('http://localhost/tc_meta_in_body.html')
422
- assert_equal 1, requests.length
423
- end
424
-
425
- def test_get_follow_meta_refresh_no_url
426
- @mech.follow_meta_refresh = true
427
- @mech.follow_meta_refresh_self = true
428
-
429
- page = @mech.get('http://localhost/refresh_without_url')
430
-
431
- assert_equal(3, @mech.history.length)
432
- assert_equal('http://localhost/refresh_without_url',
433
- @mech.history[0].uri.to_s)
434
- assert_equal('http://localhost/refresh_without_url',
435
- @mech.history[1].uri.to_s)
436
- assert_equal('http://localhost/index.html', page.uri.to_s)
437
- assert_equal('http://localhost/index.html', @mech.history.last.uri.to_s)
438
- end
439
-
440
- def test_get_follow_meta_refresh_referer_not_sent
441
- @mech.follow_meta_refresh = true
442
-
443
- requests = []
444
-
445
- @mech.pre_connect_hooks << lambda { |_, request|
446
- requests << request
447
- }
448
-
449
- @mech.get('http://localhost/tc_follow_meta.html')
450
-
451
- assert_equal 2, @mech.history.length
452
- assert_nil requests.last['referer']
453
- end
454
-
455
- def test_get_referer_download
456
- download = Mechanize::Download.new URI 'http://example/prev'
457
-
458
- uri = URI 'http://example'
459
-
460
- page = @mech.get uri, { :q => 'h' }, download, { 'X-H' => 'v' }
461
-
462
- assert_equal URI('http://example/?q=h'), page.uri
463
- assert_equal URI('http://example'), uri
464
-
465
- assert_equal 'http://example/prev', requests.first['referer']
466
- end
467
-
468
- def test_get_robots
469
- @mech.robots = true
470
-
471
- assert_equal "Page Title", @mech.get("http://localhost/index.html").title
472
-
473
- assert_raises Mechanize::RobotsDisallowedError do
474
- @mech.get "http://localhost/norobots.html"
475
- end
476
- end
477
-
478
- def test_follow_meta_refresh_self
479
- refute @mech.agent.follow_meta_refresh_self
480
-
481
- @mech.follow_meta_refresh_self = true
482
-
483
- assert @mech.agent.follow_meta_refresh_self
484
- end
485
-
486
- def test_get_gzip
487
- page = @mech.get("http://localhost/gzip?file=index.html")
488
-
489
- assert_kind_of(Mechanize::Page, page)
490
-
491
- assert_match('Hello World', page.body)
492
- end
493
-
494
- def test_content_encoding_hooks_header
495
- h = {'X-ResponseContentEncoding' => 'agzip'}
496
-
497
- # test of X-ResponseContentEncoding feature
498
- assert_raises(Mechanize::Error, 'Unsupported Content-Encoding: agzip') do
499
- @mech.get("http://localhost/gzip?file=index.html", nil, nil, h)
500
- end
501
-
502
- @mech.content_encoding_hooks << lambda{|agent, uri, response, response_body_io|
503
- response['content-encoding'] = 'gzip' if response['content-encoding'] == 'agzip'}
504
-
505
- page = @mech.get("http://localhost/gzip?file=index.html", nil, nil, h)
506
-
507
- assert_match('Hello World', page.body)
508
- end
509
-
510
- def external_cmd(io); Zlib::GzipReader.new(io).read; end
511
-
512
- def test_content_encoding_hooks_body_io
513
- h = {'X-ResponseContentEncoding' => 'unsupported_content_encoding'}
514
-
515
- @mech.content_encoding_hooks << lambda{|agent, uri, response, response_body_io|
516
- if response['content-encoding'] == 'unsupported_content_encoding'
517
- response['content-encoding'] = 'none'
518
- response_body_io.string = external_cmd(response_body_io)
519
- end}
520
-
521
- page = @mech.get("http://localhost/gzip?file=index.html", nil, nil, h)
522
-
523
- assert_match('Hello World', page.body)
524
- end
525
-
526
- def test_get_http_refresh
527
- @mech.follow_meta_refresh = true
528
-
529
- requests = []
530
-
531
- @mech.pre_connect_hooks << lambda { |_, request|
532
- requests << request
533
- }
534
-
535
- page = @mech.get('http://localhost/http_refresh?refresh_time=0')
536
-
537
- assert_equal('http://localhost/index.html', page.uri.to_s)
538
- assert_equal(2, @mech.history.length)
539
- assert_nil requests.last['referer']
540
- end
541
-
542
- def test_get_http_refresh_delay
543
- @mech.follow_meta_refresh = true
544
- class << @mech.agent
545
- attr_accessor :slept
546
- def sleep *args
547
- @slept = args
548
- end
549
- end
550
-
551
- @mech.get('http://localhost/http_refresh?refresh_time=1')
552
- assert_equal [1], @mech.agent.slept
553
- end
554
-
555
- def test_get_http_refresh_disabled
556
- page = @mech.get('http://localhost/http_refresh?refresh_time=0')
557
- assert_equal('http://localhost/http_refresh?refresh_time=0', page.uri.to_s)
558
- end
559
-
560
- def test_get_kcode
561
- $KCODE = 'u'
562
- page = @mech.get("http://localhost/?a=#{[0xd6].pack('U')}")
563
-
564
- assert_equal('http://localhost/?a=%D6', page.uri.to_s)
565
-
566
- $KCODE = 'NONE'
567
- end unless RUBY_VERSION >= '1.9.0'
568
-
569
- def test_get_query
570
- page = @mech.get('http://localhost/', { :q => 'hello' })
571
- assert_equal('http://localhost/?q=hello', page.uri.to_s)
572
- end
573
-
574
- def test_get_redirect
575
- page = @mech.get('http://localhost/redirect')
576
-
577
- assert_equal(page.uri.to_s, 'http://localhost/verb')
578
-
579
- assert_equal 'GET', page.header['X-Request-Method']
580
- end
581
-
582
- def test_get_redirect_found
583
- page = @mech.get('http://localhost/response_code?code=302&ct=test/xml')
584
-
585
- assert_equal('http://localhost/index.html', page.uri.to_s)
586
-
587
- assert_equal(2, @mech.history.length)
588
- end
589
-
590
- def test_get_redirect_infinite
591
- assert_raises(Mechanize::RedirectLimitReachedError) {
592
- @mech.get('http://localhost/infinite_refresh')
593
- }
594
- end
595
-
596
- def test_get_referer
597
- request = nil
598
- @mech.pre_connect_hooks << lambda { |_, req|
599
- request = req
600
- }
601
-
602
- @mech.get('http://localhost/', [], 'http://tenderlovemaking.com/')
603
- assert_equal 'http://tenderlovemaking.com/', request['Referer']
604
- end
605
-
606
- def test_get_referer_file
607
- uri = URI 'http://tenderlovemaking.com/crossdomain.xml'
608
- file = Mechanize::File.new uri
609
-
610
- @mech.get('http://localhost', [], file)
611
-
612
- # HACK no assertion of behavior
613
- end
614
-
615
- def test_get_referer_none
616
- requests = []
617
- @mech.pre_connect_hooks << lambda { |_, request|
618
- requests << request
619
- }
620
-
621
- @mech.get('http://localhost/')
622
- @mech.get('http://localhost/')
623
- assert_equal(2, requests.length)
624
- requests.each do |request|
625
- assert_nil request['referer']
626
- end
627
- end
628
-
629
- def test_get_scheme_unsupported
630
- assert_raises Mechanize::UnsupportedSchemeError do
631
- @mech.get('ftp://server.com/foo.html')
632
- end
633
- end
634
-
635
- def test_get_space
636
- page = nil
637
-
638
- page = @mech.get("http://localhost/tc_bad_links.html ")
639
-
640
- assert_match(/tc_bad_links.html$/, @mech.history.last.uri.to_s)
641
-
642
- assert_equal(1, @mech.history.length)
643
- end
644
-
645
- def test_get_tilde
646
- page = @mech.get('http://localhost/?foo=~2')
647
-
648
- assert_equal('http://localhost/?foo=~2', page.uri.to_s)
649
- end
650
-
651
- def test_get_weird
652
- @mech.get('http://localhost/?action=bing&bang=boom=1|a=|b=|c=')
653
- @mech.get('http://localhost/?a=b&#038;b=c&#038;c=d')
654
- @mech.get("http://localhost/?a=#{[0xd6].pack('U')}")
655
-
656
- # HACK no assertion of behavior
657
- end
658
-
659
- def test_get_yield
660
- pages = nil
661
-
662
- @mech.get("http://localhost/file_upload.html") { |page|
663
- pages = page
664
- }
665
-
666
- assert pages
667
- assert_equal('File Upload Form', pages.title)
668
- end
669
-
670
- def test_head
671
- page = @mech.head('http://localhost/verb', { 'q' => 'foo' })
672
- assert_equal 0, @mech.history.length
673
- assert_equal 'HEAD', page.header['X-Request-Method']
674
- end
675
-
676
- def test_head_redirect
677
- page = @mech.head('http://localhost/redirect')
678
-
679
- assert_equal(page.uri.to_s, 'http://localhost/verb')
680
-
681
- assert_equal 'HEAD', page.header['X-Request-Method']
682
- end
683
-
684
- def test_history
685
- 2.times do |i|
686
- assert_equal(i, @mech.history.size)
687
-
688
- @mech.get("http://localhost/")
689
- end
690
-
691
- page = @mech.get("http://localhost/form_test.html")
692
-
693
- assert_equal("http://localhost/form_test.html",
694
- @mech.history.last.uri.to_s)
695
- assert_equal("http://localhost/",
696
- @mech.history[-2].uri.to_s)
697
-
698
- assert @mech.visited?("http://localhost/")
699
- assert @mech.visited?("/form_test.html"), 'relative'
700
- assert !@mech.visited?("http://google.com/")
701
- assert @mech.visited?(page.links.first)
702
- end
703
-
704
- def test_history_added_gets_called
705
- added_page = nil
706
-
707
- @mech.history_added = lambda { |page|
708
- added_page = page
709
- }
710
-
711
- assert_equal @mech.get('http://localhost/tc_blank_form.html'), added_page
712
- end
713
-
714
- def test_history_order
715
- @mech.max_history = 2
716
- assert_equal(0, @mech.history.length)
717
-
718
- @mech.get('http://localhost/form_test.html')
719
- assert_equal(1, @mech.history.length)
720
-
721
- @mech.get('http://localhost/empty_form.html')
722
- assert_equal(2, @mech.history.length)
723
-
724
- @mech.get('http://localhost/tc_checkboxes.html')
725
- assert_equal(2, @mech.history.length)
726
- assert_equal('http://localhost/empty_form.html', @mech.history[0].uri.to_s)
727
- assert_equal('http://localhost/tc_checkboxes.html',
728
- @mech.history[1].uri.to_s)
729
- end
730
-
731
- def test_html_parser_equals
732
- @mech.html_parser = {}
733
- assert_raises(NoMethodError) {
734
- @mech.get('http://localhost/?foo=~2').links
735
- }
736
- end
737
-
738
- def test_idle_timeout_equals
739
- @mech.idle_timeout = 5
740
-
741
- assert_equal 5, @mech.idle_timeout
742
- end
743
-
744
- def test_keep_alive_equals
745
- assert @mech.keep_alive
746
-
747
- @mech.keep_alive = false
748
-
749
- refute @mech.keep_alive
750
- end
751
-
752
- def test_keep_alive_time
753
- assert_equal 0, @mech.keep_alive_time
754
-
755
- @mech.keep_alive_time = 1
756
-
757
- assert_equal 1, @mech.keep_alive_time
758
- end
759
-
760
- def test_log
761
- assert_nil @mech.log
762
- end
763
-
764
- def test_log_equals
765
- @mech.log = Logger.new $stderr
766
-
767
- refute_nil @mech.log
768
- assert_nil Mechanize.log
769
- end
770
-
771
- def test_max_file_buffer_equals
772
- @mech.max_file_buffer = 1024
773
-
774
- assert_equal 1024, @mech.agent.max_file_buffer
775
- end
776
-
777
- def test_max_history_equals
778
- @mech.max_history = 10
779
- 0.upto(10) do |i|
780
- assert_equal(i, @mech.history.size)
781
- @mech.get("http://localhost/")
782
- end
783
-
784
- 0.upto(10) do |i|
785
- assert_equal(10, @mech.history.size)
786
- @mech.get("http://localhost/")
787
- end
788
- end
789
-
790
- def test_open_timeout_equals
791
- @mech.open_timeout = 5
792
-
793
- assert_equal 5, @mech.open_timeout
794
- end
795
-
796
- def test_parse_download
797
- @mech.pluggable_parser['application/octet-stream'] = Mechanize::Download
798
-
799
- response = Net::HTTPOK.allocate
800
- response.instance_variable_set(:@header,
801
- 'content-type' =>
802
- ['application/octet-stream'])
803
-
804
- download = @mech.parse @uri, response, StringIO.new('raw')
805
-
806
- assert_kind_of Mechanize::Download, download
807
- assert_kind_of StringIO, download.content
808
- end
809
-
810
- def test_parse_html
811
- response = Net::HTTPOK.allocate
812
- response.instance_variable_set :@header, 'content-type' => ['text/html']
813
-
814
- page = @mech.parse URI('http://example/'), response, ''
815
-
816
- assert_kind_of Mechanize::Page, page
817
- end
818
-
819
- def test_post
820
- @mech.post "http://example", 'gender' => 'female'
821
-
822
- assert_equal "gender=female", requests.first.body
823
- end
824
-
825
- def test_post_basic_auth
826
- requests = []
827
-
828
- @mech.pre_connect_hooks << proc { |agent, request|
829
- requests << request.class
830
- }
831
-
832
- @mech.basic_auth('user', 'pass')
833
- page = @mech.post("http://localhost/basic_auth")
834
- assert_equal('You are authenticated', page.body)
835
- assert_equal(2, requests.length)
836
- r1 = requests[0]
837
- r2 = requests[1]
838
- assert_equal(r1, r2)
839
- end
840
-
841
- def test_post_entity
842
- @mech.post "http://localhost/form_post", 'json' => '["&quot;"]'
843
-
844
- assert_equal "json=%5B%22%22%22%5D", requests.first.body
845
- end
846
-
847
- def test_post_multiple_values
848
- @mech.post "http://localhost/form_post",
849
- [%w[gender female], %w[gender male]]
850
-
851
- assert_equal "gender=female&gender=male", requests.first.body
852
- end
853
-
854
- def test_post_multipart
855
- page = @mech.post('http://localhost/file_upload', {
856
- :name => 'Some file',
857
- :userfile1 => File.open(__FILE__)
858
- })
859
-
860
- name = File.basename __FILE__
861
- assert_match(
862
- "Content-Disposition: form-data; name=\"userfile1\"; filename=\"#{name}\"",
863
- page.body
864
- )
865
- assert page.body.length > File.read(__FILE__).length
866
- end
867
-
868
- def test_post_redirect
869
- page = @mech.post('http://localhost/redirect')
870
-
871
- assert_equal(page.uri.to_s, 'http://localhost/verb')
872
-
873
- assert_equal 'GET', page.header['X-Request-Method']
874
- end
875
-
876
- def test_put
877
- page = @mech.put('http://localhost/verb', 'foo')
878
- assert_equal 1, @mech.history.length
879
- assert_equal 'PUT', page.header['X-Request-Method']
880
- end
881
-
882
- def test_put_redirect
883
- page = @mech.put('http://localhost/redirect', 'foo')
884
-
885
- assert_equal(page.uri.to_s, 'http://localhost/verb')
886
-
887
- assert_equal 'GET', page.header['X-Request-Method']
888
- end
889
-
890
- def test_read_timeout_equals
891
- @mech.read_timeout = 5
892
-
893
- assert_equal 5, @mech.read_timeout
894
- end
895
-
896
- def test_retry_change_requests_equals
897
- refute @mech.retry_change_requests
898
-
899
- @mech.retry_change_requests = true
900
-
901
- assert @mech.retry_change_requests
902
- end
903
-
904
- def test_set_proxy
905
- http = @mech.agent.http
906
-
907
- @mech.set_proxy 'localhost', 8080, 'user', 'pass'
908
-
909
- assert_equal 'localhost', @mech.proxy_addr
910
- assert_equal 8080, @mech.proxy_port
911
- assert_equal 'user', @mech.proxy_user
912
- assert_equal 'pass', @mech.proxy_pass
913
-
914
- refute_same http, @mech.agent.http
915
- end
916
-
917
- def test_submit_bad_form_method
918
- page = @mech.get("http://localhost/bad_form_test.html")
919
- assert_raises ArgumentError do
920
- @mech.submit(page.forms.first)
921
- end
922
- end
923
-
924
- def test_submit_check_one
925
- page = @mech.get('http://localhost/tc_checkboxes.html')
926
- form = page.forms.first
927
- form.checkboxes_with(:name => 'green')[1].check
928
-
929
- page = @mech.submit(form)
930
-
931
- assert_equal(1, page.links.length)
932
- assert_equal('green:on', page.links.first.text)
933
- end
934
-
935
- def test_submit_check_two
936
- page = @mech.get('http://localhost/tc_checkboxes.html')
937
- form = page.forms.first
938
- form.checkboxes_with(:name => 'green')[0].check
939
- form.checkboxes_with(:name => 'green')[1].check
940
-
941
- page = @mech.submit(form)
942
-
943
- assert_equal(2, page.links.length)
944
- assert_equal('green:on', page.links[0].text)
945
- assert_equal('green:on', page.links[1].text)
946
- end
947
-
948
- def test_submit_enctype
949
- page = @mech.get("http://localhost/file_upload.html")
950
- assert_equal('multipart/form-data', page.forms[0].enctype)
951
-
952
- form = page.forms.first
953
- form.file_uploads.first.file_name = __FILE__
954
- form.file_uploads.first.mime_type = "text/plain"
955
- form.file_uploads.first.file_data = "Hello World\n\n"
956
-
957
- page = @mech.submit(form)
958
-
959
- basename = File.basename __FILE__
960
-
961
- assert_match(
962
- "Content-Disposition: form-data; name=\"userfile1\"; filename=\"#{basename}\"",
963
- page.body
964
- )
965
- assert_match(
966
- "Content-Disposition: form-data; name=\"name\"",
967
- page.body
968
- )
969
- assert_match('Content-Type: text/plain', page.body)
970
- assert_match('Hello World', page.body)
971
- assert_match('foo[aaron]', page.body)
972
- end
973
-
974
- def test_submit_file_data
975
- page = @mech.get("http://localhost/file_upload.html")
976
- assert_equal('multipart/form-data', page.forms[1].enctype)
977
-
978
- form = page.forms[1]
979
- form.file_uploads.first.file_name = __FILE__
980
- form.file_uploads.first.file_data = File.read __FILE__
981
-
982
- page = @mech.submit(form)
983
-
984
- contents = File.read __FILE__
985
- basename = File.basename __FILE__
986
-
987
- assert_match(
988
- "Content-Disposition: form-data; name=\"green[eggs]\"; filename=\"#{basename}\"",
989
- page.body
990
- )
991
-
992
- assert_match(contents, page.body)
993
- end
994
-
995
- def test_submit_file_name
996
- page = @mech.get("http://localhost/file_upload.html")
997
- assert_equal('multipart/form-data', page.forms[1].enctype)
998
-
999
- form = page.forms[1]
1000
- form.file_uploads.first.file_name = __FILE__
1001
-
1002
- page = @mech.submit(form)
1003
-
1004
- contents = File.read __FILE__
1005
- basename = File.basename __FILE__
1006
- assert_match(
1007
- "Content-Disposition: form-data; name=\"green[eggs]\"; filename=\"#{basename}\"",
1008
- page.body
1009
- )
1010
- assert_match(contents, page.body)
1011
- end
1012
-
1013
- def test_submit_get
1014
- form = node 'form', 'method' => 'GET', 'action' => '/?a=b'
1015
- form = Mechanize::Form.new form, @mech, fake_page
1016
-
1017
- @mech.submit form
1018
-
1019
- assert_equal '/', requests.first.path
1020
- end
1021
-
1022
- def test_submit_headers
1023
- page = @mech.get 'http://localhost:2000/form_no_action.html'
1024
-
1025
- assert form = page.forms.first
1026
- form.action = '/http_headers'
1027
-
1028
- page = @mech.submit form, nil, 'foo' => 'bar'
1029
-
1030
- headers = page.body.split("\n").map { |x| x.split('|', 2) }.flatten
1031
- headers = Hash[*headers]
1032
-
1033
- assert_equal 'bar', headers['foo']
1034
- end
1035
-
1036
- def test_submit_multipart
1037
- page = @mech.get("http://localhost/file_upload.html")
1038
-
1039
- assert_equal('multipart/form-data', page.forms[1].enctype)
1040
-
1041
- form = page.forms[1]
1042
- form.file_uploads.first.file_name = __FILE__
1043
- form.file_uploads.first.mime_type = "text/plain"
1044
- form.file_uploads.first.file_data = "Hello World\n\n"
1045
-
1046
- page = @mech.submit(form)
1047
-
1048
- basename = File.basename __FILE__
1049
-
1050
- assert_match(
1051
- "Content-Disposition: form-data; name=\"green[eggs]\"; filename=\"#{basename}\"",
1052
- page.body
1053
- )
1054
- end
1055
-
1056
- def test_submit_no_file
1057
- page = @mech.get("http://localhost/file_upload.html")
1058
- form = page.forms.first
1059
- form.field_with(:name => 'name').value = 'Aaron'
1060
- @page = @mech.submit(form)
1061
- assert_match('Aaron', @page.body)
1062
- assert_match(
1063
- "Content-Disposition: form-data; name=\"userfile1\"; filename=\"\"",
1064
- @page.body
1065
- )
1066
- end
1067
-
1068
- def test_submit_post
1069
- form = node 'form', 'method' => 'POST', 'action' => '/?a=b'
1070
- form = Mechanize::Form.new form, @mech, fake_page
1071
-
1072
- @mech.submit form
1073
-
1074
- assert_equal '/?a=b', requests.first.path
1075
- end
1076
-
1077
- def test_submit_post_pound
1078
- form = node 'form', 'method' => 'POST', 'action' => '/#1'
1079
- form = Mechanize::Form.new form, @mech, fake_page
1080
-
1081
- @mech.submit form
1082
-
1083
- assert_equal '/', requests.first.path
1084
- end
1085
-
1086
- def test_submit_too_many_radiobuttons
1087
- page = @mech.get("http://localhost/form_test.html")
1088
- form = page.form_with(:name => 'post_form1')
1089
- form.radiobuttons.each { |r| r.checked = true }
1090
-
1091
- assert_raises Mechanize::Error do
1092
- @mech.submit(form)
1093
- end
1094
- end
1095
-
1096
- def test_transact
1097
- @mech.get("http://localhost/frame_test.html")
1098
- assert_equal(1, @mech.history.length)
1099
- @mech.transact { |a|
1100
- 5.times {
1101
- @mech.get("http://localhost/frame_test.html")
1102
- }
1103
- assert_equal(6, @mech.history.length)
1104
- }
1105
- assert_equal(1, @mech.history.length)
1106
- end
1107
-
1108
- def test_user_agent_alias_equals_unknown
1109
- assert_raises ArgumentError do
1110
- @mech.user_agent_alias = "Aaron's Browser"
1111
- end
1112
- end
1113
-
1114
- def test_verify_mode
1115
- assert_equal OpenSSL::SSL::VERIFY_PEER, @mech.verify_mode
1116
-
1117
- @mech.verify_mode = OpenSSL::SSL::VERIFY_NONE
1118
-
1119
- assert_equal OpenSSL::SSL::VERIFY_NONE, @mech.verify_mode
1120
- end
1121
-
1122
- def test_visited_eh
1123
- @mech.get("http://localhost/content_type_test?ct=application/pdf")
1124
-
1125
- assert \
1126
- @mech.visited?("http://localhost/content_type_test?ct=application/pdf")
1127
- assert \
1128
- !@mech.visited?("http://localhost/content_type_test")
1129
- assert \
1130
- !@mech.visited?("http://localhost/content_type_test?ct=text/html")
1131
- end
1132
-
1133
- def test_visited_eh_link
1134
- @mech.get("http://example/index.html")
1135
-
1136
- page = page URI 'http://example'
1137
- link = node 'a', 'href' => '/index.html'
1138
- link = Mechanize::Page::Link.new link, page, @mech
1139
-
1140
- assert @mech.visited? link
1141
- end
1142
-
1143
- def test_visited_eh_redirect
1144
- @mech.get("http://localhost/response_code?code=302")
1145
-
1146
- assert_equal("http://localhost/index.html", @mech.current_page.uri.to_s)
1147
-
1148
- assert @mech.visited?('http://localhost/response_code?code=302')
1149
- end
1150
-
1151
- def assert_header(page, header)
1152
- headers = {}
1153
-
1154
- page.body.split(/[\r\n]+/).each do |page_header|
1155
- headers.[]=(*page_header.chomp.split(/\|/))
1156
- end
1157
-
1158
- header.each do |key, value|
1159
- assert(headers.has_key?(key))
1160
- assert_equal(value, headers[key])
1161
- end
1162
- end
1163
- end
1164
-