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.
- data.tar.gz.sig +0 -0
- data/CHANGELOG.rdoc +82 -0
- data/EXAMPLES.rdoc +1 -1
- data/FAQ.rdoc +9 -9
- data/Manifest.txt +35 -48
- data/README.rdoc +2 -1
- data/Rakefile +16 -3
- data/lib/mechanize.rb +809 -392
- data/lib/mechanize/content_type_error.rb +10 -11
- data/lib/mechanize/cookie.rb +193 -60
- data/lib/mechanize/cookie_jar.rb +39 -86
- data/lib/mechanize/download.rb +59 -0
- data/lib/mechanize/element_matcher.rb +1 -0
- data/lib/mechanize/file.rb +61 -76
- data/lib/mechanize/file_saver.rb +37 -35
- data/lib/mechanize/form.rb +475 -410
- data/lib/mechanize/form/button.rb +4 -7
- data/lib/mechanize/form/check_box.rb +10 -9
- data/lib/mechanize/form/field.rb +52 -42
- data/lib/mechanize/form/file_upload.rb +17 -19
- data/lib/mechanize/form/hidden.rb +3 -0
- data/lib/mechanize/form/image_button.rb +15 -16
- data/lib/mechanize/form/keygen.rb +34 -0
- data/lib/mechanize/form/multi_select_list.rb +20 -9
- data/lib/mechanize/form/option.rb +48 -47
- data/lib/mechanize/form/radio_button.rb +52 -45
- data/lib/mechanize/form/reset.rb +3 -0
- data/lib/mechanize/form/select_list.rb +10 -6
- data/lib/mechanize/form/submit.rb +3 -0
- data/lib/mechanize/form/text.rb +3 -0
- data/lib/mechanize/form/textarea.rb +3 -0
- data/lib/mechanize/headers.rb +17 -19
- data/lib/mechanize/history.rb +60 -61
- data/lib/mechanize/http.rb +5 -0
- data/lib/mechanize/http/agent.rb +485 -218
- data/lib/mechanize/http/auth_challenge.rb +59 -0
- data/lib/mechanize/http/auth_realm.rb +31 -0
- data/lib/mechanize/http/content_disposition_parser.rb +188 -0
- data/lib/mechanize/http/www_authenticate_parser.rb +155 -0
- data/lib/mechanize/monkey_patch.rb +14 -35
- data/lib/mechanize/page.rb +34 -2
- data/lib/mechanize/page/base.rb +6 -7
- data/lib/mechanize/page/frame.rb +5 -5
- data/lib/mechanize/page/image.rb +23 -23
- data/lib/mechanize/page/label.rb +16 -16
- data/lib/mechanize/page/link.rb +16 -0
- data/lib/mechanize/page/meta_refresh.rb +19 -7
- data/lib/mechanize/parser.rb +173 -0
- data/lib/mechanize/pluggable_parsers.rb +126 -83
- data/lib/mechanize/redirect_limit_reached_error.rb +16 -13
- data/lib/mechanize/redirect_not_get_or_head_error.rb +18 -16
- data/lib/mechanize/response_code_error.rb +16 -17
- data/lib/mechanize/robots_disallowed_error.rb +22 -23
- data/lib/mechanize/test_case.rb +659 -0
- data/lib/mechanize/unauthorized_error.rb +3 -0
- data/lib/mechanize/unsupported_scheme_error.rb +4 -6
- data/lib/mechanize/util.rb +0 -12
- data/test/htdocs/form_order_test.html +11 -0
- data/test/htdocs/form_test.html +2 -2
- data/test/htdocs/tc_links.html +1 -0
- data/test/test_mechanize.rb +367 -59
- data/test/test_mechanize_cookie.rb +69 -4
- data/test/test_mechanize_cookie_jar.rb +200 -124
- data/test/test_mechanize_download.rb +43 -0
- data/test/test_mechanize_file.rb +53 -45
- data/test/{test_mechanize_file_response.rb → test_mechanize_file_connection.rb} +2 -2
- data/test/test_mechanize_file_request.rb +2 -2
- data/test/test_mechanize_file_saver.rb +21 -0
- data/test/test_mechanize_form.rb +345 -46
- data/test/test_mechanize_form_check_box.rb +5 -4
- data/test/test_mechanize_form_encoding.rb +10 -16
- data/test/test_mechanize_form_field.rb +45 -3
- data/test/test_mechanize_form_file_upload.rb +20 -0
- data/test/test_mechanize_form_image_button.rb +2 -2
- data/test/test_mechanize_form_keygen.rb +32 -0
- data/test/test_mechanize_form_multi_select_list.rb +84 -0
- data/test/test_mechanize_form_option.rb +55 -0
- data/test/test_mechanize_form_radio_button.rb +78 -0
- data/test/test_mechanize_form_select_list.rb +76 -0
- data/test/test_mechanize_form_textarea.rb +8 -7
- data/test/{test_headers.rb → test_mechanize_headers.rb} +4 -2
- data/test/test_mechanize_history.rb +103 -0
- data/test/test_mechanize_http_agent.rb +525 -17
- data/test/test_mechanize_http_auth_challenge.rb +39 -0
- data/test/test_mechanize_http_auth_realm.rb +49 -0
- data/test/test_mechanize_http_content_disposition_parser.rb +118 -0
- data/test/test_mechanize_http_www_authenticate_parser.rb +146 -0
- data/test/test_mechanize_link.rb +10 -14
- data/test/test_mechanize_page.rb +118 -0
- data/test/test_mechanize_page_encoding.rb +48 -13
- data/test/test_mechanize_page_frame.rb +16 -0
- data/test/test_mechanize_page_link.rb +27 -19
- data/test/test_mechanize_page_meta_refresh.rb +26 -14
- data/test/test_mechanize_parser.rb +289 -0
- data/test/test_mechanize_pluggable_parser.rb +52 -0
- data/test/test_mechanize_redirect_limit_reached_error.rb +24 -0
- data/test/test_mechanize_redirect_not_get_or_head_error.rb +3 -7
- data/test/test_mechanize_subclass.rb +2 -2
- data/test/test_mechanize_util.rb +24 -13
- data/test/test_multi_select.rb +23 -22
- metadata +145 -114
- metadata.gz.sig +0 -0
- data/lib/mechanize/inspect.rb +0 -88
- data/test/helper.rb +0 -175
- data/test/htdocs/form_select_all.html +0 -16
- data/test/htdocs/form_select_none.html +0 -17
- data/test/htdocs/form_select_noopts.html +0 -10
- data/test/htdocs/iframe_test.html +0 -16
- data/test/htdocs/nofollow.html +0 -9
- data/test/htdocs/norobots.html +0 -8
- data/test/htdocs/rel_nofollow.html +0 -8
- data/test/htdocs/tc_base_images.html +0 -10
- data/test/htdocs/tc_images.html +0 -8
- data/test/htdocs/tc_no_attributes.html +0 -16
- data/test/htdocs/tc_radiobuttons.html +0 -17
- data/test/htdocs/test_bad_encoding.html +0 -52
- data/test/servlets.rb +0 -402
- data/test/ssl_server.rb +0 -48
- data/test/test_cookies.rb +0 -129
- data/test/test_form_action.rb +0 -52
- data/test/test_form_as_hash.rb +0 -59
- data/test/test_form_button.rb +0 -46
- data/test/test_frames.rb +0 -34
- data/test/test_history.rb +0 -118
- data/test/test_history_added.rb +0 -16
- data/test/test_html_unscape_forms.rb +0 -46
- data/test/test_if_modified_since.rb +0 -20
- data/test/test_images.rb +0 -19
- data/test/test_no_attributes.rb +0 -13
- data/test/test_option.rb +0 -18
- data/test/test_pluggable_parser.rb +0 -136
- data/test/test_post_form.rb +0 -37
- data/test/test_pretty_print.rb +0 -22
- data/test/test_radiobutton.rb +0 -75
- data/test/test_redirect_limit_reached.rb +0 -39
- data/test/test_referer.rb +0 -81
- data/test/test_relative_links.rb +0 -40
- data/test/test_request.rb +0 -13
- data/test/test_response_code.rb +0 -53
- data/test/test_robots.rb +0 -72
- data/test/test_save_file.rb +0 -48
- data/test/test_scheme.rb +0 -48
- data/test/test_select.rb +0 -119
- data/test/test_select_all.rb +0 -15
- data/test/test_select_none.rb +0 -15
- data/test/test_select_noopts.rb +0 -18
- data/test/test_set_fields.rb +0 -44
- 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
|
+
|
data/test/test_mechanize_file.rb
CHANGED
@@ -1,53 +1,61 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
class TestMechanizeFile <
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
25
|
-
|
26
|
-
page =
|
27
|
-
|
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
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
50
|
-
|
51
|
-
|
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
|
+
|
@@ -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
|
+
|
data/test/test_mechanize_form.rb
CHANGED
@@ -1,28 +1,137 @@
|
|
1
|
-
require
|
1
|
+
require 'mechanize/test_case'
|
2
2
|
|
3
|
-
class TestMechanizeForm <
|
3
|
+
class TestMechanizeForm < Mechanize::TestCase
|
4
4
|
|
5
5
|
def setup
|
6
|
-
|
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&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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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, @
|
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 = @
|
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 = @
|
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 = @
|
281
|
+
page = @mech.get('http://localhost:2000/form_no_action.html')
|
83
282
|
page.forms.first.fields.first.value = 'Aaron'
|
84
|
-
page = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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 = @
|
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
|