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
@@ -0,0 +1,43 @@
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizeDownload < Mechanize::TestCase
4
+
5
+ def setup
6
+ super
7
+
8
+ @parser = Mechanize::Download
9
+ end
10
+
11
+ def test_save_string_io
12
+ uri = URI.parse 'http://example/foo.html'
13
+ body_io = StringIO.new '0123456789'
14
+
15
+ download = @parser.new uri, nil, body_io
16
+
17
+ in_tmpdir do
18
+ download.save
19
+
20
+ assert File.exist? 'foo.html'
21
+ end
22
+ end
23
+
24
+ def test_save_tempfile
25
+ uri = URI.parse 'http://example/foo.html'
26
+ Tempfile.new __name__ do |body_io|
27
+ body_io.write '0123456789'
28
+
29
+ body_io.flush
30
+ body_io.rewind
31
+
32
+ download = @parser.new uri, nil, body_io
33
+
34
+ in_tmpdir do
35
+ download.save
36
+
37
+ assert File.exist? 'foo.html'
38
+ end
39
+ end
40
+ end
41
+
42
+ end
43
+
@@ -1,53 +1,61 @@
1
- require "helper"
2
-
3
- class TestMechanizeFile < MiniTest::Unit::TestCase
4
- def test_content_disposition
5
- file = Mechanize::File.new(
6
- URI.parse('http://localhost/foo'),
7
- { 'content-disposition' => 'attachment; filename=genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500"', }
8
- )
9
- assert_equal('genome.jpeg', file.filename)
10
-
11
- file = Mechanize::File.new(
12
- URI.parse('http://localhost/foo'),
13
- { 'content-disposition' => 'filename=genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500"', }
14
- )
15
- assert_equal('genome.jpeg', file.filename)
16
-
17
- file = Mechanize::File.new(
18
- URI.parse('http://localhost/foo'),
19
- { 'content-disposition' => 'filename=genome.jpeg', }
20
- )
21
- assert_equal('genome.jpeg', file.filename)
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizeFile < Mechanize::TestCase
4
+
5
+ def setup
6
+ super
7
+
8
+ @parser = Mechanize::File
22
9
  end
23
10
 
24
- def test_content_disposition_double_semicolon
25
- agent = Mechanize.new
26
- page = agent.get("http://localhost/http_headers?content-disposition=#{CGI.escape('attachment;; filename=fooooo')}")
27
- assert page.parser
11
+ def test_save
12
+ uri = URI 'http://example/name.html'
13
+ page = Mechanize::File.new uri, nil, '0123456789'
14
+
15
+ Dir.mktmpdir do |dir|
16
+ Dir.chdir dir do
17
+ page.save 'test.html'
18
+
19
+ assert_equal '0123456789', File.read('test.html')
20
+ end
21
+ end
28
22
  end
29
23
 
30
- def test_from_uri
31
- file = Mechanize::File.new(
32
- URI.parse('http://localhost/foo'),
33
- {}
34
- )
35
- assert_equal('foo.html', file.filename)
36
-
37
- file = Mechanize::File.new(
38
- URI.parse('http://localhost/foo.jpg'),
39
- {}
40
- )
41
- assert_equal('foo.jpg', file.filename)
42
-
43
- file = Mechanize::File.new(
44
- URI.parse('http://localhost/foo.jpg')
45
- )
46
- assert_equal('foo.jpg', file.filename)
24
+ def test_save_default
25
+ uri = URI 'http://example/test.html'
26
+ page = Mechanize::File.new uri, nil, ''
27
+
28
+ Dir.mktmpdir do |dir|
29
+ Dir.chdir dir do
30
+ page.save
31
+
32
+ assert File.exist? 'test.html'
33
+
34
+ page.save
35
+
36
+ assert File.exist? 'test.html.1'
37
+
38
+ page.save
39
+
40
+ assert File.exist? 'test.html.2'
41
+ end
42
+ end
47
43
  end
48
44
 
49
- def test_no_uri
50
- file = Mechanize::File.new()
51
- assert_equal('index.html', file.filename)
45
+ def test_save_default_dots
46
+ uri = URI 'http://localhost/../test.html'
47
+ page = Mechanize::File.new uri, nil, ''
48
+
49
+ Dir.mktmpdir do |dir|
50
+ Dir.chdir dir do
51
+ page.save
52
+ assert File.exist? 'test.html'
53
+
54
+ page.save
55
+ assert File.exist? 'test.html.1'
56
+ end
57
+ end
52
58
  end
59
+
53
60
  end
61
+
@@ -1,6 +1,6 @@
1
- require 'helper'
1
+ require 'mechanize/test_case'
2
2
 
3
- class TestMechanizeFileConnection < MiniTest::Unit::TestCase
3
+ class TestMechanizeFileConnection < Mechanize::TestCase
4
4
 
5
5
  def test_request
6
6
  uri = URI.parse "file://#{File.expand_path __FILE__}"
@@ -1,6 +1,6 @@
1
- require 'helper'
1
+ require 'mechanize/test_case'
2
2
 
3
- class TestMechanizeFileRequest < MiniTest::Unit::TestCase
3
+ class TestMechanizeFileRequest < Mechanize::TestCase
4
4
 
5
5
  def test_initialize
6
6
  uri = URI.parse 'http://example/'
@@ -0,0 +1,21 @@
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizeFileSaver < Mechanize::TestCase
4
+
5
+ def setup
6
+ super
7
+
8
+ @uri = URI 'http://example'
9
+ @io = StringIO.new 'hello world'
10
+ end
11
+
12
+ def test_initialize
13
+ in_tmpdir do
14
+ Mechanize::FileSaver.new @uri, nil, @io, 200
15
+
16
+ assert File.exist? 'example/index.html'
17
+ end
18
+ end
19
+
20
+ end
21
+
@@ -1,28 +1,137 @@
1
- require "helper"
1
+ require 'mechanize/test_case'
2
2
 
3
- class TestMechanizeForm < MiniTest::Unit::TestCase
3
+ class TestMechanizeForm < Mechanize::TestCase
4
4
 
5
5
  def setup
6
- @agent = Mechanize.new
6
+ super
7
+
8
+ @form = Mechanize::Form.new node 'form'
9
+ end
10
+
11
+ def test_action
12
+ form = Mechanize::Form.new node('form', 'action' => '?a=b&amp;b=c')
13
+
14
+ assert_equal '?a=b&b=c', form.action
15
+ end
16
+
17
+ def test_aset
18
+ assert_empty @form.keys
19
+
20
+ @form['intarweb'] = 'Aaron'
21
+
22
+ assert_equal 'Aaron', @form['intarweb']
23
+ end
24
+
25
+ def test_aset_exists
26
+ page = html_page <<-BODY
27
+ <title>Page Title</title>
28
+ <form name="post_form">
29
+ <input name="first" type="text" id="name_first">
30
+ <input name="first" type="text">
31
+ <input type="submit" value="Submit">
32
+ </form>
33
+ BODY
34
+
35
+ form = page.form_with(:name => 'post_form')
36
+
37
+ assert_equal %w[first first], form.keys
38
+
39
+ form['first'] = 'Aaron'
40
+
41
+ assert_equal 'Aaron', form['first']
42
+ assert_equal ['Aaron', ''], form.values
7
43
  end
8
44
 
9
45
  def test_build_query_blank_form
10
- page = @agent.get('http://localhost/tc_blank_form.html')
46
+ page = @mech.get('http://localhost/tc_blank_form.html')
11
47
  form = page.forms.first
12
48
  query = form.build_query
13
49
  assert(query.length > 0)
14
50
  assert query.all? { |x| x[1] == '' }
15
51
  end
16
52
 
53
+ def test_method_missing_get
54
+ page = html_page <<-BODY
55
+ <form>
56
+ <input name="not_a_method" value="some value">
57
+ </form>
58
+ BODY
59
+
60
+ form = page.forms.first
61
+
62
+ assert_equal 'some value', form.not_a_method
63
+ end
64
+
65
+ def test_method_missing_set
66
+ page = html_page <<-BODY
67
+ <form>
68
+ <input name="not_a_method">
69
+ </form>
70
+ BODY
71
+
72
+ form = page.forms.first
73
+
74
+ form.not_a_method = 'some value'
75
+
76
+ assert_equal [%w[not_a_method some\ value]], form.build_query
77
+ end
78
+
79
+ def test_parse_buttons
80
+ page = html_page <<-BODY
81
+ <form>
82
+ <input type="submit" value="submit">
83
+ <input type="button" value="submit">
84
+ <button type="submit" value="submit">
85
+ <button type="button" value="submit">
86
+ <input type="image" name="submit" src="/button.jpeg">
87
+ <input type="image" src="/button.jpeg">
88
+ </form>
89
+ BODY
90
+
91
+ form = page.forms.first
92
+ buttons = form.buttons.sort
93
+
94
+ assert buttons.all? { |b| Mechanize::Form::Button === b }
95
+
96
+ assert_equal 'submit', buttons.shift.type
97
+ assert_equal 'button', buttons.shift.type
98
+ assert_equal 'submit', buttons.shift.type
99
+ assert_equal 'button', buttons.shift.type
100
+ assert_equal 'image', buttons.shift.type
101
+ assert_equal 'image', buttons.shift.type
102
+
103
+ assert_empty buttons
104
+ end
105
+
106
+ def test_parse_select
107
+ page = html_page <<-BODY
108
+ <form>
109
+ <select name="multi" multiple></select>
110
+ <select name="single"></select>
111
+ </form>
112
+ BODY
113
+
114
+ form = page.forms.first
115
+ selects = form.fields.sort
116
+
117
+ multi = selects.shift
118
+ assert_kind_of Mechanize::Form::MultiSelectList, multi
119
+
120
+ single = selects.shift
121
+ assert_kind_of Mechanize::Form::SelectList, single
122
+
123
+ assert_empty selects
124
+ end
125
+
17
126
  def test_checkboxes_no_input_name
18
- page = @agent.get('http://localhost/form_no_input_name.html')
127
+ page = @mech.get('http://localhost/form_no_input_name.html')
19
128
  form = page.forms.first
20
129
 
21
130
  assert_equal(0, form.checkboxes.length)
22
131
  end
23
132
 
24
133
  def test_field_with
25
- page = @agent.get("http://localhost/google.html")
134
+ page = @mech.get("http://localhost/google.html")
26
135
  search = page.forms.find { |f| f.name == "f" }
27
136
 
28
137
  assert(search.field_with(:name => 'q'))
@@ -31,26 +140,50 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
31
140
  end
32
141
 
33
142
  def test_fields_no_input_name
34
- page = @agent.get('http://localhost/form_no_input_name.html')
143
+ page = @mech.get('http://localhost/form_no_input_name.html')
35
144
  form = page.forms.first
36
145
 
37
146
  assert_equal(0, form.fields.length)
38
147
  end
39
148
 
40
149
  def test_file_uploads_no_value
41
- page = @agent.get("http://localhost/file_upload.html")
150
+ page = @mech.get("http://localhost/file_upload.html")
42
151
  form = page.form('value_test')
43
152
  assert_nil(form.file_uploads.first.value)
44
153
  assert_nil(form.file_uploads.first.file_name)
45
154
  end
46
155
 
47
156
  def test_forms_no_input_name
48
- page = @agent.get('http://localhost/form_no_input_name.html')
157
+ page = @mech.get('http://localhost/form_no_input_name.html')
49
158
  form = page.forms.first
50
159
 
51
160
  assert_equal(0, form.radiobuttons.length)
52
161
  end
53
162
 
163
+ def test_has_field_eh
164
+ refute @form.has_field? 'name'
165
+
166
+ @form['name'] = 'Aaron'
167
+
168
+ assert @form.has_field?('name')
169
+ end
170
+
171
+ def test_has_value_eh
172
+ refute @form.has_value? 'Aaron'
173
+
174
+ @form['name'] = 'Aaron'
175
+
176
+ assert @form.has_value?('Aaron')
177
+ end
178
+
179
+ def test_keys
180
+ assert_empty @form.keys
181
+
182
+ @form['name'] = 'Aaron'
183
+
184
+ assert_equal %w[name], @form.keys
185
+ end
186
+
54
187
  def test_parse_textarea
55
188
  form = Nokogiri::HTML <<-FORM
56
189
  <form>
@@ -58,7 +191,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
58
191
  </form>
59
192
  FORM
60
193
 
61
- form = Mechanize::Form.new form, @agent
194
+ form = Mechanize::Form.new form, @mech
62
195
  textarea = form.fields.first
63
196
 
64
197
  assert_kind_of Mechanize::Form::Textarea, textarea
@@ -66,27 +199,93 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
66
199
  end
67
200
 
68
201
  def test_post_with_rails_3_encoding_hack
69
- page = @agent.get("http://localhost/rails_3_encoding_hack_form_test.html")
202
+ page = @mech.get("http://localhost/rails_3_encoding_hack_form_test.html")
70
203
  form = page.forms.first
71
204
  form.submit
72
205
  end
73
206
 
74
207
  def test_post_with_blank_encoding
75
- page = @agent.get("http://localhost/form_test.html")
208
+ page = @mech.get("http://localhost/form_test.html")
76
209
  form = page.form('post_form1')
77
210
  form.page.encoding = nil
78
211
  form.submit
79
212
  end
80
213
 
214
+ def test_set_fields_duplicate
215
+ page = html_page '<form><input name="a" value="b"><input name="a"></form>'
216
+ form = page.forms.first
217
+
218
+ form.set_fields :a => 'c'
219
+
220
+ assert_equal 'c', form.fields.first.value
221
+ assert_equal '', form.fields.last.value
222
+ end
223
+
224
+ def test_set_fields_none
225
+ page = html_page '<form><input name="a" value="b"></form>'
226
+ form = page.forms.first
227
+
228
+ form.set_fields
229
+
230
+ assert_equal 'b', form.fields.first.value
231
+ end
232
+
233
+ def test_set_fields_many
234
+ page = html_page '<form><input name="a" value="b"><input name="b"></form>'
235
+ form = page.forms.first
236
+
237
+ form.set_fields :a => 'c', :b => 'd'
238
+
239
+ assert_equal 'c', form.fields.first.value
240
+ assert_equal 'd', form.fields.last.value
241
+ end
242
+
243
+ def test_set_fields_one
244
+ page = html_page '<form><input name="a" value="b"></form>'
245
+ form = page.forms.first
246
+
247
+ form.set_fields :a => 'c'
248
+
249
+ assert_equal 'c', form.fields.first.value
250
+ end
251
+
252
+ def test_set_fields_position
253
+ page = html_page '<form><input name="a" value="b"><input name="a"></form>'
254
+ form = page.forms.first
255
+
256
+ form.set_fields :a => { 0 => 'c', 1 => 'd' }
257
+
258
+ assert_equal 'c', form.fields.first.value
259
+ assert_equal 'd', form.fields.last.value
260
+ end
261
+
262
+ def test_set_fields_position_crappily
263
+ page = html_page '<form><input name="a" value="b"><input name="a"></form>'
264
+ form = page.forms.first
265
+
266
+ form.set_fields :a => ['c', 1]
267
+
268
+ assert_equal 'b', form.fields.first.value
269
+ assert_equal 'c', form.fields.last.value
270
+ end
271
+
272
+ def test_values
273
+ assert_empty @form.values
274
+
275
+ @form['name'] = 'Aaron'
276
+
277
+ assert_equal %w[Aaron], @form.values
278
+ end
279
+
81
280
  def test_no_form_action
82
- page = @agent.get('http://localhost:2000/form_no_action.html')
281
+ page = @mech.get('http://localhost:2000/form_no_action.html')
83
282
  page.forms.first.fields.first.value = 'Aaron'
84
- page = @agent.submit(page.forms.first)
283
+ page = @mech.submit(page.forms.first)
85
284
  assert_match('/form_no_action.html?first=Aaron', page.uri.to_s)
86
285
  end
87
286
 
88
287
  def test_submit_first_field_wins
89
- page = @agent.get('http://localhost/tc_field_precedence.html')
288
+ page = @mech.get('http://localhost/tc_field_precedence.html')
90
289
  form = page.forms.first
91
290
 
92
291
  assert !form.checkboxes.empty?
@@ -98,10 +297,10 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
98
297
  end
99
298
 
100
299
  def test_submit_takes_arbirary_headers
101
- page = @agent.get('http://localhost:2000/form_no_action.html')
300
+ page = @mech.get('http://localhost:2000/form_no_action.html')
102
301
  assert form = page.forms.first
103
302
  form.action = '/http_headers'
104
- page = @agent.submit(form, nil, { 'foo' => 'bar' })
303
+ page = @mech.submit(form, nil, { 'foo' => 'bar' })
105
304
 
106
305
  headers = page.body.split("\n").map { |x| x.split('|', 2) }.flatten
107
306
  headers = Hash[*headers]
@@ -109,9 +308,78 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
109
308
  assert_equal 'bar', headers['foo']
110
309
  end
111
310
 
311
+ def test_submit_select_default_all
312
+ page = html_page <<-BODY
313
+ <form name="form1" method="post" action="/form_post">
314
+ <select name="list">
315
+ <option value="1" selected>Option 1</option>
316
+ <option value="2" selected>Option 2</option>
317
+ <option value="3" selected>Option 3</option>
318
+ <option value="4" selected>Option 4</option>
319
+ <option value="5" selected>Option 5</option>
320
+ <option value="6" selected>Option 6</option>
321
+ </select>
322
+ <br />
323
+ <input type="submit" value="Submit" />
324
+ </form>
325
+ BODY
326
+
327
+ form = page.forms.first
328
+ assert_equal "6", form.list
329
+
330
+ page = @mech.submit form
331
+ assert_equal 1, page.links.length
332
+ assert_equal 1, page.links_with(:text => 'list:6').length
333
+ end
334
+
335
+ def test_submit_select_default_none
336
+ page = html_page <<-BODY
337
+ <form name="form1" method="post" action="/form_post">
338
+ <select name="list">
339
+ <option value="1">Option 1</option>
340
+ <option value="2">Option 2</option>
341
+ <option>Option No Value</option>
342
+ <option value="3">Option 3</option>
343
+ <option value="4">Option 4</option>
344
+ <option value="5">Option 5</option>
345
+ <option value="6">Option 6</option>
346
+ </select>
347
+ <br />
348
+ <input type="submit" value="Submit" />
349
+ </form>
350
+ BODY
351
+
352
+ form = page.forms.first
353
+
354
+ assert_equal "1", form.list
355
+ page = @mech.submit form
356
+
357
+ assert_equal 1, page.links.length
358
+ assert_equal 1, page.links_with(:text => 'list:1').length
359
+ end
360
+
361
+ def test_form_select_default_noopts
362
+ page = html_page <<-BODY
363
+ <form name="form1" method="post" action="/form_post">
364
+ <select name="list">
365
+ </select>
366
+ <br />
367
+ <input type="submit" value="Submit" />
368
+ </form>
369
+ BODY
370
+ form = page.forms.first
371
+
372
+ assert form.field 'list'
373
+ assert_nil form.list
374
+
375
+ page = @mech.submit form
376
+
377
+ assert_empty page.links
378
+ end
379
+
112
380
  # Test submitting form with two fields of the same name
113
381
  def test_post_multival
114
- page = @agent.get("http://localhost/form_multival.html")
382
+ page = @mech.get("http://localhost/form_multival.html")
115
383
  form = page.form_with(:name => 'post_form')
116
384
 
117
385
  assert_equal(2, form.fields_with(:name => 'first').length)
@@ -119,7 +387,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
119
387
  form.fields_with(:name => 'first')[0].value = 'Aaron'
120
388
  form.fields_with(:name => 'first')[1].value = 'Patterson'
121
389
 
122
- page = @agent.submit(form)
390
+ page = @mech.submit(form)
123
391
 
124
392
  assert_equal(2, page.links.length)
125
393
  assert(page.link_with(:text => 'first:Aaron'))
@@ -128,7 +396,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
128
396
 
129
397
  # Test calling submit on the form object
130
398
  def test_submit_on_form
131
- page = @agent.get("http://localhost/form_multival.html")
399
+ page = @mech.get("http://localhost/form_multival.html")
132
400
  form = page.form_with(:name => 'post_form')
133
401
 
134
402
  assert_equal(2, form.fields_with(:name => 'first').length)
@@ -145,7 +413,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
145
413
 
146
414
  # Test submitting form with two fields of the same name
147
415
  def test_get_multival
148
- page = @agent.get("http://localhost/form_multival.html")
416
+ page = @mech.get("http://localhost/form_multival.html")
149
417
  form = page.form_with(:name => 'get_form')
150
418
 
151
419
  assert_equal(2, form.fields_with(:name => 'first').length)
@@ -153,7 +421,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
153
421
  form.fields_with(:name => 'first')[0].value = 'Aaron'
154
422
  form.fields_with(:name => 'first')[1].value = 'Patterson'
155
423
 
156
- page = @agent.submit(form)
424
+ page = @mech.submit(form)
157
425
 
158
426
  assert_equal(2, page.links.length)
159
427
  assert(page.link_with(:text => 'first:Aaron'))
@@ -161,14 +429,14 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
161
429
  end
162
430
 
163
431
  def test_post_with_non_strings
164
- page = @agent.get("http://localhost/form_test.html")
432
+ page = @mech.get("http://localhost/form_test.html")
165
433
  page.form('post_form1') do |form|
166
434
  form.first_name = 10
167
435
  end.submit
168
436
  end
169
437
 
170
438
  def test_post
171
- page = @agent.get("http://localhost/form_test.html")
439
+ page = @mech.get("http://localhost/form_test.html")
172
440
  post_form = page.forms.find { |f| f.name == "post_form1" }
173
441
 
174
442
  assert_equal("post", post_form.method.downcase)
@@ -212,7 +480,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
212
480
  }.checked = true
213
481
  post_form.checkboxes.find { |f| f.name == "likes ham" }.checked = true
214
482
  post_form.checkboxes.find { |f| f.name == "green[eggs]" }.checked = true
215
- page = @agent.submit(post_form, post_form.buttons.first)
483
+ page = @mech.submit(post_form, post_form.buttons.first)
216
484
 
217
485
  # Check that the submitted fields exist
218
486
  assert_equal(5, page.links.size, "Not enough links")
@@ -229,7 +497,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
229
497
  end
230
498
 
231
499
  def test_post_multipart
232
- page = @agent.get("http://localhost/form_test.html")
500
+ page = @mech.get("http://localhost/form_test.html")
233
501
  post_form = page.forms.find { |f| f.name == "post_form4_multipart" }
234
502
  assert(post_form, "Post form is null")
235
503
  assert_equal("post", post_form.method.downcase)
@@ -238,13 +506,13 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
238
506
  assert_equal(1, post_form.fields.size)
239
507
  assert_equal(1, post_form.buttons.size)
240
508
 
241
- page = @agent.submit(post_form, post_form.buttons.first)
509
+ page = @mech.submit(post_form, post_form.buttons.first)
242
510
 
243
511
  assert page
244
512
  end
245
513
 
246
514
  def test_select_box
247
- page = @agent.get("http://localhost/form_test.html")
515
+ page = @mech.get("http://localhost/form_test.html")
248
516
  post_form = page.forms.find { |f| f.name == "post_form1" }
249
517
 
250
518
  assert(page.header)
@@ -266,7 +534,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
266
534
  # Now set all the fields
267
535
  post_form.field_with(:name => /country/).value = s.options[1]
268
536
  assert_equal('CANADA', post_form.country)
269
- page = @agent.submit(post_form, post_form.buttons.first)
537
+ page = @mech.submit(post_form, post_form.buttons.first)
270
538
 
271
539
  # Check that the submitted fields exist
272
540
  assert(page.links.find { |l| l.text == "country:CANADA" },
@@ -274,7 +542,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
274
542
  end
275
543
 
276
544
  def test_get
277
- page = @agent.get("http://localhost/form_test.html")
545
+ page = @mech.get("http://localhost/form_test.html")
278
546
  get_form = page.forms.find { |f| f.name == "get_form1" }
279
547
 
280
548
  assert_equal("get", get_form.method.downcase)
@@ -309,7 +577,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
309
577
  }.checked = true
310
578
  get_form.checkboxes.find { |f| f.name == "likes ham" }.checked = true
311
579
  get_form.checkboxes.find { |f| f.name == "green[eggs]" }.checked = true
312
- page = @agent.submit(get_form, get_form.buttons.first)
580
+ page = @mech.submit(get_form, get_form.buttons.first)
313
581
 
314
582
  # Check that the submitted fields exist
315
583
  assert_equal(6, page.links.size, "Not enough links")
@@ -328,7 +596,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
328
596
  end
329
597
 
330
598
  def test_post_with_space_in_action
331
- page = @agent.get("http://localhost/form_test.html")
599
+ page = @mech.get("http://localhost/form_test.html")
332
600
  post_form = page.forms.find { |f| f.name == "post_form2" }
333
601
 
334
602
  assert_equal("post", post_form.method.downcase)
@@ -356,7 +624,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
356
624
  f.name == "gender" && f.value == "male"
357
625
  }.checked = true
358
626
  post_form.checkboxes.find { |f| f.name == "likes ham" }.checked = true
359
- page = @agent.submit(post_form, post_form.buttons.first)
627
+ page = @mech.submit(post_form, post_form.buttons.first)
360
628
 
361
629
  # Check that the submitted fields exist
362
630
  assert_equal(3, page.links.size, "Not enough links")
@@ -369,7 +637,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
369
637
  end
370
638
 
371
639
  def test_get_with_space_in_action
372
- page = @agent.get("http://localhost/form_test.html")
640
+ page = @mech.get("http://localhost/form_test.html")
373
641
  get_form = page.forms.find { |f| f.name == "get_form2" }
374
642
 
375
643
  assert_equal("get", get_form.method.downcase)
@@ -397,7 +665,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
397
665
  f.name == "gender" && f.value == "male"
398
666
  }.checked = true
399
667
  get_form.checkboxes.find { |f| f.name == "likes ham" }.checked = true
400
- page = @agent.submit(get_form, get_form.buttons.first)
668
+ page = @mech.submit(get_form, get_form.buttons.first)
401
669
 
402
670
  # Check that the submitted fields exist
403
671
  assert_equal(3, page.links.size, "Not enough links")
@@ -410,7 +678,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
410
678
  end
411
679
 
412
680
  def test_post_with_param_in_action
413
- page = @agent.get("http://localhost/form_test.html")
681
+ page = @mech.get("http://localhost/form_test.html")
414
682
  post_form = page.forms.find { |f| f.name == "post_form3" }
415
683
 
416
684
  assert_equal("post", post_form.method.downcase)
@@ -447,7 +715,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
447
715
  }.checked = true
448
716
  post_form.checkboxes.find { |f| f.name == "likes ham" }.checked = true
449
717
 
450
- page = @agent.submit(post_form, post_form.buttons.first)
718
+ page = @mech.submit(post_form, post_form.buttons.first)
451
719
 
452
720
  # Check that the submitted fields exist
453
721
  assert_equal(3, page.links.size, "Not enough links")
@@ -461,7 +729,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
461
729
  end
462
730
 
463
731
  def test_get_with_param_in_action
464
- page = @agent.get("http://localhost/form_test.html")
732
+ page = @mech.get("http://localhost/form_test.html")
465
733
  get_form = page.forms.find { |f| f.name == "get_form3" }
466
734
 
467
735
  assert_equal("get", get_form.method.downcase)
@@ -489,7 +757,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
489
757
  f.name == "gender" && f.value == "male"
490
758
  }.checked = true
491
759
  get_form.checkboxes.find { |f| f.name == "likes ham" }.checked = true
492
- page = @agent.submit(get_form, get_form.buttons.first)
760
+ page = @mech.submit(get_form, get_form.buttons.first)
493
761
  # Check that the submitted fields exist
494
762
  assert_equal(3, page.links.size, "Not enough links")
495
763
  assert(page.links.find { |l| l.text == "likes ham:on" },
@@ -501,14 +769,14 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
501
769
  end
502
770
 
503
771
  def test_field_addition
504
- page = @agent.get("http://localhost/form_test.html")
772
+ page = @mech.get("http://localhost/form_test.html")
505
773
  get_form = page.forms.find { |f| f.name == "get_form1" }
506
774
  get_form.field("first_name").value = "Gregory"
507
775
  assert_equal( "Gregory", get_form.field("first_name").value )
508
776
  end
509
777
 
510
778
  def test_fields_as_accessors
511
- page = @agent.get("http://localhost/form_multival.html")
779
+ page = @mech.get("http://localhost/form_multival.html")
512
780
  form = page.form_with(:name => 'post_form')
513
781
 
514
782
  assert_equal(2, form.fields_with(:name => 'first').length)
@@ -519,7 +787,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
519
787
 
520
788
  def test_form_and_fields_dom_id
521
789
  # blatant copypasta of test above
522
- page = @agent.get("http://localhost/form_test.html")
790
+ page = @mech.get("http://localhost/form_test.html")
523
791
  form = page.form_with(:dom_id => 'generic_form')
524
792
  form_by_id = page.form_with(:id => 'generic_form')
525
793
 
@@ -531,8 +799,22 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
531
799
  assert_equal(form.fields_with(:dom_id => 'name_first'), form.fields_with(:id => 'name_first'))
532
800
  end
533
801
 
802
+ def test_form_and_fields_dom_class
803
+ # blatant copypasta of test above
804
+ page = @mech.get("http://localhost/form_test.html")
805
+ form = page.form_with(:dom_class => 'really_generic_form')
806
+ form_by_class = page.form_with(:class => 'really_generic_form')
807
+
808
+ assert_equal(1, form.fields_with(:dom_class => 'text_input').length)
809
+ assert_equal('first_name', form.field_with(:dom_class => 'text_input').name)
810
+
811
+ # *_with(:class => blah) should work exactly like (:dom_class => blah)
812
+ assert_equal(form, form_by_class)
813
+ assert_equal(form.fields_with(:dom_class => 'text_input'), form.fields_with(:class => 'text_input'))
814
+ end
815
+
534
816
  def test_add_field
535
- page = @agent.get("http://localhost/form_multival.html")
817
+ page = @mech.get("http://localhost/form_multival.html")
536
818
  form = page.form_with(:name => 'post_form')
537
819
 
538
820
  number_of_fields = form.fields.length
@@ -542,7 +824,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
542
824
  end
543
825
 
544
826
  def test_delete_field
545
- page = @agent.get("http://localhost/form_multival.html")
827
+ page = @mech.get("http://localhost/form_multival.html")
546
828
  form = page.form_with(:name => 'post_form')
547
829
 
548
830
  number_of_fields = form.fields.length
@@ -554,7 +836,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
554
836
  end
555
837
 
556
838
  def test_has_field
557
- page = @agent.get("http://localhost/form_multival.html")
839
+ page = @mech.get("http://localhost/form_multival.html")
558
840
  form = page.form_with(:name => 'post_form')
559
841
 
560
842
  assert(!form.has_field?('intarweb'))
@@ -563,7 +845,7 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
563
845
  end
564
846
 
565
847
  def test_field_error
566
- @page = @agent.get('http://localhost/empty_form.html')
848
+ @page = @mech.get('http://localhost/empty_form.html')
567
849
  form = @page.forms.first
568
850
  assert_raises(NoMethodError) {
569
851
  form.foo = 'asdfasdf'
@@ -573,4 +855,21 @@ class TestMechanizeForm < MiniTest::Unit::TestCase
573
855
  form.foo
574
856
  }
575
857
  end
858
+
859
+ def test_form_build_query
860
+ page = @mech.get("http://localhost/form_order_test.html")
861
+ get_form = page.forms.first
862
+
863
+ query = get_form.build_query
864
+
865
+ expected = [
866
+ %w[1 RADIO],
867
+ %w[3 nobody@example],
868
+ %w[2 TEXT],
869
+ %w[3 2011-10],
870
+ ]
871
+
872
+ assert_equal expected, query
873
+ end
874
+
576
875
  end