mechanize 2.0.1 → 2.1.pre.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of mechanize might be problematic. Click here for more details.

Files changed (148) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG.rdoc +82 -0
  3. data/EXAMPLES.rdoc +1 -1
  4. data/FAQ.rdoc +9 -9
  5. data/Manifest.txt +35 -48
  6. data/README.rdoc +2 -1
  7. data/Rakefile +16 -3
  8. data/lib/mechanize.rb +809 -392
  9. data/lib/mechanize/content_type_error.rb +10 -11
  10. data/lib/mechanize/cookie.rb +193 -60
  11. data/lib/mechanize/cookie_jar.rb +39 -86
  12. data/lib/mechanize/download.rb +59 -0
  13. data/lib/mechanize/element_matcher.rb +1 -0
  14. data/lib/mechanize/file.rb +61 -76
  15. data/lib/mechanize/file_saver.rb +37 -35
  16. data/lib/mechanize/form.rb +475 -410
  17. data/lib/mechanize/form/button.rb +4 -7
  18. data/lib/mechanize/form/check_box.rb +10 -9
  19. data/lib/mechanize/form/field.rb +52 -42
  20. data/lib/mechanize/form/file_upload.rb +17 -19
  21. data/lib/mechanize/form/hidden.rb +3 -0
  22. data/lib/mechanize/form/image_button.rb +15 -16
  23. data/lib/mechanize/form/keygen.rb +34 -0
  24. data/lib/mechanize/form/multi_select_list.rb +20 -9
  25. data/lib/mechanize/form/option.rb +48 -47
  26. data/lib/mechanize/form/radio_button.rb +52 -45
  27. data/lib/mechanize/form/reset.rb +3 -0
  28. data/lib/mechanize/form/select_list.rb +10 -6
  29. data/lib/mechanize/form/submit.rb +3 -0
  30. data/lib/mechanize/form/text.rb +3 -0
  31. data/lib/mechanize/form/textarea.rb +3 -0
  32. data/lib/mechanize/headers.rb +17 -19
  33. data/lib/mechanize/history.rb +60 -61
  34. data/lib/mechanize/http.rb +5 -0
  35. data/lib/mechanize/http/agent.rb +485 -218
  36. data/lib/mechanize/http/auth_challenge.rb +59 -0
  37. data/lib/mechanize/http/auth_realm.rb +31 -0
  38. data/lib/mechanize/http/content_disposition_parser.rb +188 -0
  39. data/lib/mechanize/http/www_authenticate_parser.rb +155 -0
  40. data/lib/mechanize/monkey_patch.rb +14 -35
  41. data/lib/mechanize/page.rb +34 -2
  42. data/lib/mechanize/page/base.rb +6 -7
  43. data/lib/mechanize/page/frame.rb +5 -5
  44. data/lib/mechanize/page/image.rb +23 -23
  45. data/lib/mechanize/page/label.rb +16 -16
  46. data/lib/mechanize/page/link.rb +16 -0
  47. data/lib/mechanize/page/meta_refresh.rb +19 -7
  48. data/lib/mechanize/parser.rb +173 -0
  49. data/lib/mechanize/pluggable_parsers.rb +126 -83
  50. data/lib/mechanize/redirect_limit_reached_error.rb +16 -13
  51. data/lib/mechanize/redirect_not_get_or_head_error.rb +18 -16
  52. data/lib/mechanize/response_code_error.rb +16 -17
  53. data/lib/mechanize/robots_disallowed_error.rb +22 -23
  54. data/lib/mechanize/test_case.rb +659 -0
  55. data/lib/mechanize/unauthorized_error.rb +3 -0
  56. data/lib/mechanize/unsupported_scheme_error.rb +4 -6
  57. data/lib/mechanize/util.rb +0 -12
  58. data/test/htdocs/form_order_test.html +11 -0
  59. data/test/htdocs/form_test.html +2 -2
  60. data/test/htdocs/tc_links.html +1 -0
  61. data/test/test_mechanize.rb +367 -59
  62. data/test/test_mechanize_cookie.rb +69 -4
  63. data/test/test_mechanize_cookie_jar.rb +200 -124
  64. data/test/test_mechanize_download.rb +43 -0
  65. data/test/test_mechanize_file.rb +53 -45
  66. data/test/{test_mechanize_file_response.rb → test_mechanize_file_connection.rb} +2 -2
  67. data/test/test_mechanize_file_request.rb +2 -2
  68. data/test/test_mechanize_file_saver.rb +21 -0
  69. data/test/test_mechanize_form.rb +345 -46
  70. data/test/test_mechanize_form_check_box.rb +5 -4
  71. data/test/test_mechanize_form_encoding.rb +10 -16
  72. data/test/test_mechanize_form_field.rb +45 -3
  73. data/test/test_mechanize_form_file_upload.rb +20 -0
  74. data/test/test_mechanize_form_image_button.rb +2 -2
  75. data/test/test_mechanize_form_keygen.rb +32 -0
  76. data/test/test_mechanize_form_multi_select_list.rb +84 -0
  77. data/test/test_mechanize_form_option.rb +55 -0
  78. data/test/test_mechanize_form_radio_button.rb +78 -0
  79. data/test/test_mechanize_form_select_list.rb +76 -0
  80. data/test/test_mechanize_form_textarea.rb +8 -7
  81. data/test/{test_headers.rb → test_mechanize_headers.rb} +4 -2
  82. data/test/test_mechanize_history.rb +103 -0
  83. data/test/test_mechanize_http_agent.rb +525 -17
  84. data/test/test_mechanize_http_auth_challenge.rb +39 -0
  85. data/test/test_mechanize_http_auth_realm.rb +49 -0
  86. data/test/test_mechanize_http_content_disposition_parser.rb +118 -0
  87. data/test/test_mechanize_http_www_authenticate_parser.rb +146 -0
  88. data/test/test_mechanize_link.rb +10 -14
  89. data/test/test_mechanize_page.rb +118 -0
  90. data/test/test_mechanize_page_encoding.rb +48 -13
  91. data/test/test_mechanize_page_frame.rb +16 -0
  92. data/test/test_mechanize_page_link.rb +27 -19
  93. data/test/test_mechanize_page_meta_refresh.rb +26 -14
  94. data/test/test_mechanize_parser.rb +289 -0
  95. data/test/test_mechanize_pluggable_parser.rb +52 -0
  96. data/test/test_mechanize_redirect_limit_reached_error.rb +24 -0
  97. data/test/test_mechanize_redirect_not_get_or_head_error.rb +3 -7
  98. data/test/test_mechanize_subclass.rb +2 -2
  99. data/test/test_mechanize_util.rb +24 -13
  100. data/test/test_multi_select.rb +23 -22
  101. metadata +145 -114
  102. metadata.gz.sig +0 -0
  103. data/lib/mechanize/inspect.rb +0 -88
  104. data/test/helper.rb +0 -175
  105. data/test/htdocs/form_select_all.html +0 -16
  106. data/test/htdocs/form_select_none.html +0 -17
  107. data/test/htdocs/form_select_noopts.html +0 -10
  108. data/test/htdocs/iframe_test.html +0 -16
  109. data/test/htdocs/nofollow.html +0 -9
  110. data/test/htdocs/norobots.html +0 -8
  111. data/test/htdocs/rel_nofollow.html +0 -8
  112. data/test/htdocs/tc_base_images.html +0 -10
  113. data/test/htdocs/tc_images.html +0 -8
  114. data/test/htdocs/tc_no_attributes.html +0 -16
  115. data/test/htdocs/tc_radiobuttons.html +0 -17
  116. data/test/htdocs/test_bad_encoding.html +0 -52
  117. data/test/servlets.rb +0 -402
  118. data/test/ssl_server.rb +0 -48
  119. data/test/test_cookies.rb +0 -129
  120. data/test/test_form_action.rb +0 -52
  121. data/test/test_form_as_hash.rb +0 -59
  122. data/test/test_form_button.rb +0 -46
  123. data/test/test_frames.rb +0 -34
  124. data/test/test_history.rb +0 -118
  125. data/test/test_history_added.rb +0 -16
  126. data/test/test_html_unscape_forms.rb +0 -46
  127. data/test/test_if_modified_since.rb +0 -20
  128. data/test/test_images.rb +0 -19
  129. data/test/test_no_attributes.rb +0 -13
  130. data/test/test_option.rb +0 -18
  131. data/test/test_pluggable_parser.rb +0 -136
  132. data/test/test_post_form.rb +0 -37
  133. data/test/test_pretty_print.rb +0 -22
  134. data/test/test_radiobutton.rb +0 -75
  135. data/test/test_redirect_limit_reached.rb +0 -39
  136. data/test/test_referer.rb +0 -81
  137. data/test/test_relative_links.rb +0 -40
  138. data/test/test_request.rb +0 -13
  139. data/test/test_response_code.rb +0 -53
  140. data/test/test_robots.rb +0 -72
  141. data/test/test_save_file.rb +0 -48
  142. data/test/test_scheme.rb +0 -48
  143. data/test/test_select.rb +0 -119
  144. data/test/test_select_all.rb +0 -15
  145. data/test/test_select_none.rb +0 -15
  146. data/test/test_select_noopts.rb +0 -18
  147. data/test/test_set_fields.rb +0 -44
  148. data/test/test_ssl_server.rb +0 -20
@@ -1,15 +1,15 @@
1
1
  # -*- coding: utf-8 -*-
2
- require 'helper'
3
- require 'cgi'
2
+ require 'mechanize/test_case'
4
3
 
5
4
  # tests for Page encoding and charset and parsing
6
5
 
7
- class TestMechanizePageEncoding < MiniTest::Unit::TestCase
6
+ class TestMechanizePageEncoding < Mechanize::TestCase
8
7
 
9
8
  MECH_ASCII_ENCODING = Mechanize::Util::NEW_RUBY_ENCODING ? 'US-ASCII' : 'ISO-8859-1'
10
9
 
11
10
  def setup
12
- @agent = Mechanize.new
11
+ super
12
+
13
13
  @uri = URI('http://localhost/')
14
14
  @response_headers = { 'content-type' => 'text/html' }
15
15
  @body = '<title>hi</title>'
@@ -17,7 +17,7 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
17
17
 
18
18
  def util_page body = @body, headers = @response_headers
19
19
  body.force_encoding Encoding::BINARY if body.respond_to? :force_encoding
20
- Mechanize::Page.new @uri, headers, body, 200, @agent
20
+ Mechanize::Page.new @uri, headers, body, 200, @mech
21
21
  end
22
22
 
23
23
  def test_page_charset
@@ -30,7 +30,7 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
30
30
  assert_equal 'UTF-8', charset
31
31
  end
32
32
 
33
- def test_page_semicolon
33
+ def test_page_charset_semicolon
34
34
  charset = Mechanize::Page.charset 'text/html;charset=UTF-8;'
35
35
  assert_equal 'UTF-8', charset
36
36
  end
@@ -53,7 +53,7 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
53
53
  end
54
54
 
55
55
  def test_page_response_header_charset
56
- headers = {'content-type' => 'text/html;charset=HEADER'}
56
+ headers = { 'content-type' => 'text/html;charset=HEADER' }
57
57
  charsets = Mechanize::Page.response_header_charset(headers)
58
58
 
59
59
  assert_equal ['HEADER'], charsets
@@ -71,6 +71,13 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
71
71
  assert_equal [], charsets
72
72
  end
73
73
 
74
+ def test_page_response_header_charset_wrong_header
75
+ headers = { 'x-content-type' => 'text/html;charset=bogus' }
76
+ charsets = Mechanize::Page.response_header_charset(headers)
77
+
78
+ assert_equal [], charsets
79
+ end
80
+
74
81
  def test_response_header_charset
75
82
  page = util_page nil, {'content-type' => 'text/html;charset=HEADER'}
76
83
 
@@ -90,6 +97,21 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
90
97
  assert_equal [], charsets
91
98
  end
92
99
 
100
+ def test_page_meta_charset_no_content
101
+ body = '<meta http-equiv="content-type">'
102
+
103
+ charsets = Mechanize::Page.meta_charset(body)
104
+
105
+ assert_empty charsets
106
+ end
107
+
108
+ # Test to fix issue: https://github.com/tenderlove/mechanize/issues/143
109
+ def test_page_meta_charset_handles_whitespace
110
+ body = '<meta http-equiv = "Content-Type" content = "text/html; charset=iso-8859-1">'
111
+ charsets = Mechanize::Page.meta_charset(body)
112
+ assert_equal ["iso-8859-1"], charsets
113
+ end
114
+
93
115
  def test_meta_charset
94
116
  body = '<meta http-equiv="content-type" content="text/html;charset=META">'
95
117
  page = util_page body
@@ -106,7 +128,7 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
106
128
  def test_encodings
107
129
  response = {'content-type' => 'text/html;charset=HEADER'}
108
130
  body = '<meta http-equiv="content-type" content="text/html;charset=META">'
109
- @agent.default_encoding = 'DEFAULT'
131
+ @mech.default_encoding = 'DEFAULT'
110
132
  page = util_page body, response
111
133
 
112
134
  assert_equal true, page.encodings.include?('HEADER')
@@ -119,23 +141,23 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
119
141
  # pre test
120
142
  assert_equal false, util_page.encodings.include?('Windows-1252')
121
143
 
122
- @agent.default_encoding = 'Windows-1252'
144
+ @mech.default_encoding = 'Windows-1252'
123
145
  page = util_page
124
146
 
125
147
  assert_equal true, page.encodings.include?('Windows-1252')
126
148
  end
127
149
 
128
150
  def test_parser_force_default_encoding
129
- @agent.default_encoding = 'Windows-1252'
130
- @agent.force_default_encoding = true
151
+ @mech.default_encoding = 'Windows-1252'
152
+ @mech.force_default_encoding = true
131
153
  page = util_page
132
154
 
133
155
  assert page.encodings.include? 'Windows-1252'
134
156
  end
135
157
 
136
158
  def test_parser_encoding_equals_overwrites_force_default_encoding
137
- @agent.default_encoding = 'Windows-1252'
138
- @agent.force_default_encoding = true
159
+ @mech.default_encoding = 'Windows-1252'
160
+ @mech.force_default_encoding = true
139
161
  page = util_page
140
162
 
141
163
  assert_equal 'Windows-1252', page.encoding
@@ -144,4 +166,17 @@ class TestMechanizePageEncoding < MiniTest::Unit::TestCase
144
166
 
145
167
  assert_equal 'ISO-8859-2', page.encoding
146
168
  end
169
+
170
+ def test_parser_encoding_when_searching_elements
171
+ skip "Encoding not implemented" unless Object.const_defined? :Encoding
172
+
173
+ body = '<span id="latin1">hi</span>'
174
+ page = util_page body, 'content-type' => 'text/html,charset=ISO-8859-1'
175
+
176
+ result = page.search('#latin1')
177
+
178
+ assert_equal Encoding::UTF_8, result.text.encoding
179
+ end
180
+
147
181
  end
182
+
@@ -0,0 +1,16 @@
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizePageFrame < Mechanize::TestCase
4
+
5
+ def test_content
6
+ page = page 'http://example/referer'
7
+ frame = node 'frame', 'name' => 'frame1', 'src' => 'http://example/'
8
+ frame = Mechanize::Page::Frame.new frame, @mech, page
9
+
10
+ frame.content
11
+
12
+ assert_equal 'http://example/referer', requests.first['Referer']
13
+ end
14
+
15
+ end
16
+
@@ -1,9 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- require 'helper'
4
- require 'cgi'
3
+ require 'mechanize/test_case'
5
4
 
6
- class TestMechanizePage < MiniTest::Unit::TestCase
5
+ class TestMechanizePageLink < Mechanize::TestCase
7
6
 
8
7
  WINDOWS_1255 = <<-HTML
9
8
  <meta http-equiv="content-type" content="text/html; charset=windows-1255">
@@ -41,7 +40,8 @@ class TestMechanizePage < MiniTest::Unit::TestCase
41
40
  ENCODING_ERROR_CLASS = Nokogiri::XML::SyntaxError
42
41
 
43
42
  def setup
44
- @agent = Mechanize.new
43
+ super
44
+
45
45
  @uri = URI('http://example')
46
46
  @res = { 'content-type' => 'text/html' }
47
47
  @body = '<title>hi</title>'
@@ -49,7 +49,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
49
49
 
50
50
  def util_page body = @body, res = @res
51
51
  body.force_encoding Encoding::BINARY if body.respond_to? :force_encoding
52
- Mechanize::Page.new @uri, res, body, 200, @agent
52
+ Mechanize::Page.new @uri, res, body, 200, @mech
53
53
  end
54
54
 
55
55
  def test_initialize_supported_content_type
@@ -91,10 +91,10 @@ class TestMechanizePage < MiniTest::Unit::TestCase
91
91
  end
92
92
 
93
93
  def test_canonical_uri
94
- page = @agent.get("http://localhost/canonical_uri.html")
94
+ page = @mech.get("http://localhost/canonical_uri.html")
95
95
  assert_equal(URI("http://localhost/canonical_uri"), page.canonical_uri)
96
96
 
97
- page = @agent.get("http://localhost/file_upload.html")
97
+ page = @mech.get("http://localhost/file_upload.html")
98
98
  assert_equal(nil, page.canonical_uri)
99
99
  end
100
100
 
@@ -254,7 +254,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
254
254
  end
255
255
 
256
256
  def test_frames_with
257
- page = @agent.get("http://localhost/frame_test.html")
257
+ page = @mech.get("http://localhost/frame_test.html")
258
258
  assert_equal(3, page.frames.size)
259
259
 
260
260
  find_orig = page.frames.find_all { |f| f.name == 'frame1' }
@@ -267,7 +267,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
267
267
  end
268
268
 
269
269
  def test_links_with_dom_id
270
- page = @agent.get("http://localhost/tc_links.html")
270
+ page = @mech.get("http://localhost/tc_links.html")
271
271
  link = page.links_with(:dom_id => 'bold_aaron_link')
272
272
  link_by_id = page.links_with(:id => 'bold_aaron_link')
273
273
  assert_equal(1, link.length)
@@ -275,34 +275,42 @@ class TestMechanizePage < MiniTest::Unit::TestCase
275
275
  assert_equal(link, link_by_id)
276
276
  end
277
277
 
278
+ def test_links_with_dom_class
279
+ page = @mech.get("http://localhost/tc_links.html")
280
+ link = page.links_with(:dom_class => 'thing_link')
281
+ link_by_class = page.links_with(:class => 'thing_link')
282
+ assert_equal(1, link.length)
283
+ assert_equal(link, link_by_class)
284
+ end
285
+
278
286
  def test_link_with_encoded_space
279
- page = @agent.get("http://localhost/tc_links.html")
287
+ page = @mech.get("http://localhost/tc_links.html")
280
288
  link = page.link_with(:text => 'encoded space')
281
- page = @agent.click link
289
+ page = @mech.click link
282
290
  end
283
291
 
284
292
  def test_link_with_space
285
- page = @agent.get("http://localhost/tc_links.html")
293
+ page = @mech.get("http://localhost/tc_links.html")
286
294
  link = page.link_with(:text => 'not encoded space')
287
- page = @agent.click link
295
+ page = @mech.click link
288
296
  end
289
297
 
290
298
  def test_link_with_unusual_characters
291
- page = @agent.get("http://localhost/tc_links.html")
299
+ page = @mech.get("http://localhost/tc_links.html")
292
300
  link = page.link_with(:text => 'unusual characters')
293
301
 
294
- @agent.click link
302
+ @mech.click link
295
303
 
296
304
  # HACK no assertion
297
305
  end
298
306
 
299
307
  def test_links
300
- page = @agent.get("http://localhost/find_link.html")
308
+ page = @mech.get("http://localhost/find_link.html")
301
309
  assert_equal(18, page.links.length)
302
310
  end
303
311
 
304
312
  def test_links_with_bold
305
- page = @agent.get("http://localhost/tc_links.html")
313
+ page = @mech.get("http://localhost/tc_links.html")
306
314
  link = page.links_with(:text => /Bold Dude/)
307
315
  assert_equal(1, link.length)
308
316
  assert_equal('Bold Dude', link.first.text)
@@ -330,7 +338,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
330
338
  end
331
339
 
332
340
  def test_meta_refresh
333
- page = @agent.get("http://localhost/find_link.html")
341
+ page = @mech.get("http://localhost/find_link.html")
334
342
  assert_equal(3, page.meta_refresh.length)
335
343
  assert_equal(%w{
336
344
  http://www.drphil.com/
@@ -359,7 +367,7 @@ class TestMechanizePage < MiniTest::Unit::TestCase
359
367
  end
360
368
 
361
369
  def test_form
362
- page = @agent.get("http://localhost/tc_form_action.html")
370
+ page = @mech.get("http://localhost/tc_form_action.html")
363
371
 
364
372
  form = page.form(:name => 'post_form1')
365
373
  assert form
@@ -1,11 +1,12 @@
1
- require 'helper'
1
+ require 'mechanize/test_case'
2
2
 
3
- class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
3
+ class TestMechanizePageMetaRefresh < Mechanize::TestCase
4
4
 
5
5
  def setup
6
+ super
7
+
6
8
  @MR = Mechanize::Page::MetaRefresh
7
9
 
8
- @agent = Mechanize.new
9
10
  @uri = URI 'http://example/here/'
10
11
  end
11
12
 
@@ -15,7 +16,7 @@ class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
15
16
  BODY
16
17
 
17
18
  Mechanize::Page.new(@uri, { 'content-type' => 'text/html' }, body, 200,
18
- @agent)
19
+ @mech)
19
20
  end
20
21
 
21
22
  def util_meta_refresh page
@@ -24,37 +25,48 @@ class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
24
25
  end
25
26
 
26
27
  def test_class_parse
27
- delay, uri = @MR.parse "0; url=http://localhost:8080/path", @uri
28
+ delay, uri, link_self = @MR.parse "0; url=http://localhost:8080/path", @uri
28
29
  assert_equal "0", delay
29
30
  assert_equal "http://localhost:8080/path", uri.to_s
31
+ refute link_self
30
32
 
31
- delay, uri = @MR.parse "100.001; url=http://localhost:8080/path", @uri
33
+ delay, uri, link_self =
34
+ @MR.parse "100.001; url=http://localhost:8080/path", @uri
32
35
  assert_equal "100.001", delay
33
36
  assert_equal "http://localhost:8080/path", uri.to_s
37
+ refute link_self
34
38
 
35
- delay, uri = @MR.parse "0; url='http://localhost:8080/path'", @uri
39
+ delay, uri, link_self =
40
+ @MR.parse "0; url='http://localhost:8080/path'", @uri
36
41
  assert_equal "0", delay
37
42
  assert_equal "http://localhost:8080/path", uri.to_s
43
+ refute link_self
38
44
 
39
- delay, uri = @MR.parse "0; url=\"http://localhost:8080/path\"", @uri
45
+ delay, uri, link_self =
46
+ @MR.parse "0; url=\"http://localhost:8080/path\"", @uri
40
47
  assert_equal "0", delay
41
48
  assert_equal "http://localhost:8080/path", uri.to_s
49
+ refute link_self
42
50
 
43
- delay, uri = @MR.parse "0; url=", @uri
51
+ delay, uri, link_self = @MR.parse "0; url=", @uri
44
52
  assert_equal "0", delay
45
53
  assert_equal "http://example/here/", uri.to_s
54
+ assert link_self
46
55
 
47
- delay, uri = @MR.parse "0", @uri
56
+ delay, uri, link_self = @MR.parse "0", @uri
48
57
  assert_equal "0", delay
49
58
  assert_equal "http://example/here/", uri.to_s
59
+ assert link_self
50
60
 
51
- delay, uri = @MR.parse " 0; ", @uri
61
+ delay, uri, link_self = @MR.parse " 0; ", @uri
52
62
  assert_equal "0", delay
53
63
  assert_equal "http://example/here/", uri.to_s
64
+ assert link_self
54
65
 
55
- delay, uri = @MR.parse "0; UrL=http://localhost:8080/path", @uri
66
+ delay, uri, link_self = @MR.parse "0; UrL=http://localhost:8080/path", @uri
56
67
  assert_equal "0", delay
57
68
  assert_equal "http://localhost:8080/path", uri.to_s
69
+ refute link_self
58
70
  end
59
71
 
60
72
  def test_class_from_node
@@ -95,7 +107,7 @@ class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
95
107
  BODY
96
108
 
97
109
  page = Mechanize::Page.new(@uri, { 'content-type' => 'text/html' }, body,
98
- 200, @agent)
110
+ 200, @mech)
99
111
 
100
112
  assert_nil util_meta_refresh page
101
113
  end
@@ -106,7 +118,7 @@ class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
106
118
  BODY
107
119
 
108
120
  page = Mechanize::Page.new(@uri, { 'content-type' => 'text/html' }, body,
109
- 200, @agent)
121
+ 200, @mech)
110
122
 
111
123
  assert_nil util_meta_refresh page
112
124
  end
@@ -0,0 +1,289 @@
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizeParser < Mechanize::TestCase
4
+
5
+ class P
6
+ include Mechanize::Parser
7
+
8
+ attr_accessor :filename
9
+ attr_accessor :response
10
+ attr_accessor :uri
11
+
12
+ def initialize
13
+ @uri = URI 'http://example'
14
+ @full_path = false
15
+ end
16
+ end
17
+
18
+ def setup
19
+ super
20
+
21
+ @parser = P.new
22
+ end
23
+
24
+ def test_extract_filename
25
+ @parser.response = {}
26
+
27
+ assert_equal 'index.html', @parser.extract_filename
28
+ end
29
+
30
+ def test_extract_filename_content_disposition
31
+ @parser.uri = URI 'http://example/foo'
32
+
33
+ @parser.response = {
34
+ 'content-disposition' => 'attachment; filename=genome.jpeg'
35
+ }
36
+
37
+ assert_equal 'genome.jpeg', @parser.extract_filename
38
+ end
39
+
40
+ def test_extract_filename_content_disposition_path
41
+ @parser.uri = URI 'http://example'
42
+
43
+ @parser.response = {
44
+ 'content-disposition' => 'attachment; filename="../genome.jpeg"'
45
+ }
46
+
47
+ assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
48
+
49
+ @parser.response = {
50
+ 'content-disposition' => 'attachment; filename="foo/genome.jpeg"'
51
+ }
52
+
53
+ assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
54
+ end
55
+
56
+ def test_extract_filename_content_disposition_path_windows
57
+ @parser.uri = URI 'http://example'
58
+
59
+ @parser.response = {
60
+ 'content-disposition' => 'attachment; filename="..\\\\genome.jpeg"'
61
+ }
62
+
63
+ assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
64
+
65
+ @parser.response = {
66
+ 'content-disposition' => 'attachment; filename="foo\\\\genome.jpeg"'
67
+ }
68
+
69
+ assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
70
+ end
71
+
72
+ def test_extract_filename_content_disposition_full_path
73
+ @parser.uri = URI 'http://example/foo'
74
+
75
+ @parser.response = {
76
+ 'content-disposition' => 'attachment; filename=genome.jpeg'
77
+ }
78
+
79
+ assert_equal 'example/genome.jpeg', @parser.extract_filename(true)
80
+ end
81
+
82
+ def test_extract_filename_content_disposition_quoted
83
+ @parser.uri = URI 'http://example'
84
+
85
+ @parser.response = {
86
+ 'content-disposition' => 'attachment; filename="some \"file\""'
87
+ }
88
+
89
+ assert_equal 'some__file_', @parser.extract_filename
90
+ end
91
+
92
+ def test_extract_filename_content_disposition_special
93
+ @parser.uri = URI 'http://example/foo'
94
+
95
+ @parser.response = {
96
+ 'content-disposition' => 'attachment; filename="/\\\\<>:\\"|?*"'
97
+ }
98
+
99
+ assert_equal '_______', @parser.extract_filename
100
+
101
+ chars = (0..12).map { |c| c.chr }.join
102
+ chars += "\\\r"
103
+ chars += (14..31).map { |c| c.chr }.join
104
+
105
+ @parser.response = {
106
+ 'content-disposition' => "attachment; filename=\"#{chars}\""
107
+ }
108
+
109
+ assert_equal '_' * 32, @parser.extract_filename
110
+ end
111
+
112
+ def test_extract_filename_content_disposition_windows_special
113
+ @parser.uri = URI 'http://example'
114
+
115
+ windows_special = %w[
116
+ AUX
117
+ COM1
118
+ COM2
119
+ COM3
120
+ COM4
121
+ COM5
122
+ COM6
123
+ COM7
124
+ COM8
125
+ COM9
126
+ CON
127
+ LPT1
128
+ LPT2
129
+ LPT3
130
+ LPT4
131
+ LPT5
132
+ LPT6
133
+ LPT7
134
+ LPT8
135
+ LPT9
136
+ NUL
137
+ PRN
138
+ ]
139
+
140
+ windows_special.each do |special|
141
+ @parser.response = {
142
+ 'content-disposition' => "attachment; filename=#{special}"
143
+ }
144
+
145
+ assert_equal "_#{special}", @parser.extract_filename
146
+ end
147
+ end
148
+
149
+ def test_extract_filename_host
150
+ @parser.response = {}
151
+ @parser.uri = URI 'http://example'
152
+
153
+ assert_equal 'example/index.html', @parser.extract_filename(true)
154
+ end
155
+
156
+ def test_extract_filename_special_character
157
+ @parser.response = {}
158
+
159
+ invisible = "\t\n\v\f\r"
160
+
161
+ invisible.chars.each do |char|
162
+ begin
163
+ @parser.uri = URI "http://example/#{char}"
164
+
165
+ assert_equal 'index.html', @parser.extract_filename, char.inspect
166
+ rescue URI::InvalidURIError
167
+ # ignore
168
+ end
169
+ end
170
+
171
+ escaped = "<>\"\\|"
172
+
173
+ escaped.chars.each do |char|
174
+ escaped_char = CGI.escape char
175
+
176
+ @parser.uri = URI "http://example/#{escaped_char}"
177
+
178
+ assert_equal "#{escaped_char}.html", @parser.extract_filename, char
179
+ end
180
+
181
+ @parser.uri = URI "http://example/?"
182
+
183
+ assert_equal 'index.html_', @parser.extract_filename, 'empty query'
184
+
185
+ @parser.uri = URI "http://example/:"
186
+
187
+ assert_equal '_.html', @parser.extract_filename, 'colon'
188
+
189
+ @parser.uri = URI "http://example/*"
190
+
191
+ assert_equal '_.html', @parser.extract_filename, 'asterisk'
192
+ end
193
+
194
+ def test_extract_filename_uri
195
+ @parser.response = {}
196
+ @parser.uri = URI 'http://example/foo'
197
+
198
+ assert_equal 'foo.html', @parser.extract_filename
199
+
200
+ @parser.uri += '/foo.jpg'
201
+
202
+ assert_equal 'foo.jpg', @parser.extract_filename
203
+ end
204
+
205
+ def test_extract_filename_uri_full_path
206
+ @parser.response = {}
207
+ @parser.uri = URI 'http://example/foo'
208
+
209
+ assert_equal 'example/foo.html', @parser.extract_filename(true)
210
+
211
+ @parser.uri += '/foo.jpg'
212
+
213
+ assert_equal 'example/foo.jpg', @parser.extract_filename(true)
214
+ end
215
+
216
+ def test_extract_filename_uri_query
217
+ @parser.response = {}
218
+ @parser.uri = URI 'http://example/?id=5'
219
+
220
+ assert_equal 'index.html_id=5', @parser.extract_filename
221
+
222
+ @parser.uri += '/foo.html?id=5'
223
+
224
+ assert_equal 'foo.html_id=5', @parser.extract_filename
225
+ end
226
+
227
+ def test_extract_filename_uri_slash
228
+ @parser.response = {}
229
+ @parser.uri = URI 'http://example/foo/'
230
+
231
+ assert_equal 'example/foo/index.html', @parser.extract_filename(true)
232
+
233
+ @parser.uri += '/foo///'
234
+
235
+ assert_equal 'example/foo/index.html', @parser.extract_filename(true)
236
+ end
237
+
238
+ def test_extract_filename_windows_special
239
+ @parser.uri = URI 'http://example'
240
+ @parser.response = {}
241
+
242
+ windows_special = %w[
243
+ AUX
244
+ COM1
245
+ COM2
246
+ COM3
247
+ COM4
248
+ COM5
249
+ COM6
250
+ COM7
251
+ COM8
252
+ COM9
253
+ CON
254
+ LPT1
255
+ LPT2
256
+ LPT3
257
+ LPT4
258
+ LPT5
259
+ LPT6
260
+ LPT7
261
+ LPT8
262
+ LPT9
263
+ NUL
264
+ PRN
265
+ ]
266
+
267
+ windows_special.each do |special|
268
+ @parser.uri += "/#{special}"
269
+
270
+ assert_equal "_#{special}.html", @parser.extract_filename
271
+ end
272
+ end
273
+
274
+ def test_fill_header
275
+ @parser.fill_header 'a' => 'b'
276
+
277
+ expected = { 'a' => 'b' }
278
+
279
+ assert_equal expected, @parser.response
280
+ end
281
+
282
+ def test_fill_header_nil
283
+ @parser.fill_header nil
284
+
285
+ assert_empty @parser.response
286
+ end
287
+
288
+ end
289
+