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,10 +1,11 @@
1
- require 'helper'
1
+ require 'mechanize/test_case'
2
2
 
3
- class TestMechanizeFormCheckBox < MiniTest::Unit::TestCase
3
+ class TestMechanizeFormCheckBox < Mechanize::TestCase
4
4
 
5
5
  def setup
6
- @agent = Mechanize.new
7
- @page = @agent.get('http://localhost/tc_checkboxes.html')
6
+ super
7
+
8
+ @page = @mech.get('http://localhost/tc_checkboxes.html')
8
9
  end
9
10
 
10
11
  def test_check
@@ -1,7 +1,7 @@
1
1
  # coding: utf-8
2
- require "helper"
2
+ require 'mechanize/test_case'
3
3
 
4
- class TestMechanizeFormEncoding < MiniTest::Unit::TestCase
4
+ class TestMechanizeFormEncoding < Mechanize::TestCase
5
5
 
6
6
  # See also: tests of Util.from_native_charset
7
7
  # Encoding test should do with non-utf-8 characters
@@ -21,21 +21,16 @@ class TestMechanizeFormEncoding < MiniTest::Unit::TestCase
21
21
  ENCODING_LOG_MESSAGE = /INFO -- : form encoding: Shift_JIS/
22
22
  INVALID_ENCODING = 'UTF-eight'
23
23
 
24
- def setup
25
- @agent = Mechanize.new
26
- end
27
-
28
24
  def set_form_with_encoding(enc)
29
- page = @agent.get("http://localhost/form_set_fields.html")
25
+ page = @mech.get("http://localhost/form_set_fields.html")
30
26
  form = page.forms.first
31
27
  form.encoding = enc
32
28
  form['first_name'] = INPUTTED_VALUE
33
29
  form
34
30
  end
35
31
 
36
-
37
32
  def test_form_encoding_returns_accept_charset
38
- page = @agent.get("http://localhost/rails_3_encoding_hack_form_test.html")
33
+ page = @mech.get("http://localhost/rails_3_encoding_hack_form_test.html")
39
34
  form = page.forms.first
40
35
  accept_charset = form.form_node['accept-charset']
41
36
 
@@ -45,7 +40,7 @@ class TestMechanizeFormEncoding < MiniTest::Unit::TestCase
45
40
  end
46
41
 
47
42
  def test_form_encoding_returns_page_encoding_when_no_accept_charset
48
- page = @agent.get("http://localhost/form_set_fields.html")
43
+ page = @mech.get("http://localhost/form_set_fields.html")
49
44
  form = page.forms.first
50
45
  accept_charset = form.form_node['accept-charset']
51
46
 
@@ -55,7 +50,7 @@ class TestMechanizeFormEncoding < MiniTest::Unit::TestCase
55
50
  end
56
51
 
57
52
  def test_form_encoding_equals_sets_new_encoding
58
- page = @agent.get("http://localhost/form_set_fields.html")
53
+ page = @mech.get("http://localhost/form_set_fields.html")
59
54
  form = page.forms.first
60
55
 
61
56
  refute_equal CONTENT_ENCODING, form.encoding
@@ -80,14 +75,13 @@ class TestMechanizeFormEncoding < MiniTest::Unit::TestCase
80
75
  assert_equal nil, form.encoding
81
76
  end
82
77
 
83
-
84
78
  def test_post_form_with_form_encoding
85
79
  form = set_form_with_encoding CONTENT_ENCODING
86
80
  form.submit
87
81
 
88
82
  # we can not use "links.find{|l| l.text == 'key:val'}" assertion here
89
83
  # because the link text encoding is always UTF-8 regaredless of html encoding
90
- assert EXPECTED_QUERY, @agent.page.at('div#query').inner_text
84
+ assert EXPECTED_QUERY, @mech.page.at('div#query').inner_text
91
85
  end
92
86
 
93
87
  def test_post_form_with_problematic_encoding
@@ -107,14 +101,14 @@ class TestMechanizeFormEncoding < MiniTest::Unit::TestCase
107
101
 
108
102
  def test_post_form_logs_form_encoding
109
103
  sio = StringIO.new
110
- @agent.log = Logger.new(sio)
111
- @agent.log.level = Logger::INFO
104
+ @mech.log = Logger.new(sio)
105
+ @mech.log.level = Logger::INFO
112
106
 
113
107
  form = set_form_with_encoding CONTENT_ENCODING
114
108
  form.submit
115
109
 
116
110
  assert_match ENCODING_LOG_MESSAGE, sio.string
117
111
 
118
- @agent.log = nil
112
+ @mech.log = nil
119
113
  end
120
114
  end
@@ -1,8 +1,29 @@
1
- require 'helper'
1
+ require 'mechanize/test_case'
2
2
 
3
- class TestMechanizeFormField < MiniTest::Unit::TestCase
3
+ class TestMechanizeFormField < Mechanize::TestCase
4
4
 
5
- def test_field_spaceship
5
+ def test_name
6
+ field = node 'input', 'name' => 'a&b'
7
+ field = Mechanize::Form::Field.new field
8
+
9
+ assert_equal 'a&b', field.name
10
+ end
11
+
12
+ def test_name_entity
13
+ field = node 'input', 'name' => 'a&amp;b'
14
+ field = Mechanize::Form::Field.new field
15
+
16
+ assert_equal 'a&b', field.name
17
+ end
18
+
19
+ def test_name_entity_numeric
20
+ field = node 'input', 'name' => 'a&#38;b'
21
+ field = Mechanize::Form::Field.new field
22
+
23
+ assert_equal 'a&b', field.name
24
+ end
25
+
26
+ def test_spaceship
6
27
  doc = Nokogiri::HTML::Document.new
7
28
  node = doc.create_element('input')
8
29
  node['name'] = 'foo'
@@ -17,5 +38,26 @@ class TestMechanizeFormField < MiniTest::Unit::TestCase
17
38
  assert_equal [b, c].sort, [b, c].sort
18
39
  end
19
40
 
41
+ def test_value
42
+ field = node 'input'
43
+ field = Mechanize::Form::Field.new field, 'a&b'
44
+
45
+ assert_equal 'a&b', field.value
46
+ end
47
+
48
+ def test_value_entity
49
+ field = node 'input'
50
+ field = Mechanize::Form::Field.new field, 'a&amp;b'
51
+
52
+ assert_equal 'a&b', field.value
53
+ end
54
+
55
+ def test_value_entity_numeric
56
+ field = node 'input'
57
+ field = Mechanize::Form::Field.new field, 'a&#38;b'
58
+
59
+ assert_equal 'a&b', field.value
60
+ end
61
+
20
62
  end
21
63
 
@@ -0,0 +1,20 @@
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizeFormFileUpload < Mechanize::TestCase
4
+
5
+ def test_file_name
6
+ field = node 'input'
7
+ field = Mechanize::Form::FileUpload.new field, 'a&b'
8
+
9
+ assert_equal 'a&b', field.file_name
10
+ end
11
+
12
+ def test_file_name_entity
13
+ field = node 'input'
14
+ field = Mechanize::Form::FileUpload.new field, 'a&amp;b'
15
+
16
+ assert_equal 'a&b', field.file_name
17
+ end
18
+
19
+ end
20
+
@@ -1,6 +1,6 @@
1
- require 'helper'
1
+ require 'mechanize/test_case'
2
2
 
3
- class TestMechanizeFormImageButton < MiniTest::Unit::TestCase
3
+ class TestMechanizeFormImageButton < Mechanize::TestCase
4
4
 
5
5
  def test_query_value
6
6
  button = Mechanize::Form::ImageButton.new 'name' => 'image_button'
@@ -0,0 +1,32 @@
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizeFormKeygen < Mechanize::TestCase
4
+
5
+ def setup
6
+ super
7
+
8
+ keygen = node('keygen',
9
+ 'name' => 'userkey',
10
+ 'challenge' => 'f4832e1d200df3df8c5c859edcabe52f')
11
+
12
+ @keygen = Mechanize::Form::Keygen.new keygen
13
+ end
14
+
15
+ def test_challenge
16
+ assert_equal "f4832e1d200df3df8c5c859edcabe52f", @keygen.challenge
17
+ end
18
+
19
+ def test_key
20
+ assert @keygen.key.kind_of?(OpenSSL::PKey::PKey), "Not an OpenSSL key"
21
+ assert @keygen.key.private?, "Not a private key"
22
+ end
23
+
24
+ def test_spki_signature
25
+ spki = OpenSSL::Netscape::SPKI.new @keygen.value
26
+ assert_equal @keygen.challenge, spki.challenge
27
+ assert_equal @keygen.key.public_key.to_pem, spki.public_key.to_pem
28
+ assert spki.verify(@keygen.key.public_key)
29
+ end
30
+
31
+ end
32
+
@@ -0,0 +1,84 @@
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizeFormMultiSelectList < Mechanize::TestCase
4
+
5
+ def setup
6
+ super
7
+
8
+ page = html_page <<-BODY
9
+ <form name="form1" method="post" action="/form_post">
10
+ <select name="select" multiple>
11
+ <option value="1">Option 1</option>
12
+ <option value="2" selected>Option 2</option>
13
+ <option value="3">Option 3</option>
14
+ <option value="4">Option 4</option>
15
+ <option value="5">Option 5</option>
16
+ <option value="6">Option 6</option>
17
+ </select>
18
+ </form>
19
+ BODY
20
+
21
+ form = page.forms.first
22
+ @select = form.fields.first
23
+ end
24
+
25
+ def test_option_with
26
+ option = @select.option_with :value => '1'
27
+
28
+ assert_equal '1', option.value
29
+ end
30
+
31
+ def test_options_with
32
+ options = @select.options_with :value => /[12]/
33
+
34
+ assert_equal 2, options.length
35
+ end
36
+
37
+ def test_query_value
38
+ assert_equal [%w[select 2]], @select.query_value
39
+
40
+ @select.options.last.click
41
+
42
+ assert_equal [%w[select 2], %w[select 6]], @select.query_value
43
+ end
44
+
45
+ def test_query_value_empty
46
+ @select.options.last.click
47
+ @select.options.last.instance_variable_set :@value, ''
48
+
49
+ assert_equal [%w[select 2], ['select', '']], @select.query_value
50
+ end
51
+
52
+ def test_select_all
53
+ @select.select_all
54
+
55
+ assert_equal %w[1 2 3 4 5 6], @select.value
56
+ end
57
+
58
+ def test_select_none
59
+ @select.select_none
60
+
61
+ assert_empty @select.value
62
+ end
63
+
64
+ def test_selected_options
65
+ assert_equal [@select.options[1]], @select.selected_options
66
+
67
+ @select.options.last.click
68
+
69
+ assert_equal [@select.options[1], @select.options.last],
70
+ @select.selected_options
71
+ end
72
+
73
+ def test_value
74
+ assert_equal %w[2], @select.value
75
+ end
76
+
77
+ def test_value_equals
78
+ @select.value = %w[a 1 2]
79
+
80
+ assert_equal %w[a 1 2], @select.value
81
+ end
82
+
83
+ end
84
+
@@ -0,0 +1,55 @@
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizeFormOption < Mechanize::TestCase
4
+
5
+ def setup
6
+ super
7
+
8
+ page = html_page <<-BODY
9
+ <form name="form1" method="post" action="/form_post">
10
+ <select name="select">
11
+ <option value="1">Option 1</option>
12
+ <option value="2" selected>Option 2</option>
13
+ </select>
14
+ </form>
15
+ BODY
16
+
17
+ form = page.forms.first
18
+ @select = form.fields.first
19
+ @option1 = @select.options.first
20
+ @option2 = @select.options.last
21
+ end
22
+
23
+ def test_value_missing_value
24
+ option = node 'option'
25
+ option.inner_html = 'blah'
26
+ option = Mechanize::Form::Option.new option, nil
27
+
28
+ assert_equal 'blah', option.value
29
+ end
30
+
31
+ def test_click
32
+ @option1.click
33
+
34
+ assert @option1.selected?
35
+ end
36
+
37
+ def test_select
38
+ @option1.select
39
+
40
+ assert @option1.selected?
41
+ end
42
+
43
+ def test_unselect
44
+ @option2.unselect
45
+
46
+ refute @option2.selected?
47
+ end
48
+
49
+ def test_selected_eh
50
+ refute @option1.selected?
51
+ assert @option2.selected?
52
+ end
53
+
54
+ end
55
+
@@ -0,0 +1,78 @@
1
+ require 'mechanize/test_case'
2
+
3
+ class TestMechanizeFormRadioButton < Mechanize::TestCase
4
+
5
+ def setup
6
+ super
7
+
8
+ @page = html_page <<-BODY
9
+ <form name="form1" method="post" action="/form_post">
10
+ <label for="blue">Blue</label>
11
+ <input type="radio" name="color" value="blue" id="blue">
12
+ <input type="radio" name="color" value="brown">
13
+ <input type="radio" name="color" value="green">
14
+ <input type="radio" name="color" value="red">
15
+ <input type="radio" name="color" value="yellow">
16
+
17
+ <input type="submit" value="Submit">
18
+ </form>
19
+ BODY
20
+
21
+ @form = @page.forms.first
22
+
23
+ @blue = @form.radiobutton_with :value => 'blue'
24
+ @brown = @form.radiobutton_with :value => 'brown'
25
+ @green = @form.radiobutton_with :value => 'green'
26
+ @red = @form.radiobutton_with :value => 'red'
27
+ @yellow = @form.radiobutton_with :value => 'yellow'
28
+ end
29
+
30
+ def test_check
31
+ @blue.check
32
+
33
+ assert @blue.checked?
34
+ refute @brown.checked?
35
+ refute @green.checked?
36
+ refute @red.checked?
37
+ refute @yellow.checked?
38
+ end
39
+
40
+ def test_check_multiple
41
+ @blue.check
42
+ @brown.check
43
+
44
+ refute @blue.checked?
45
+ assert @brown.checked?
46
+ refute @green.checked?
47
+ refute @red.checked?
48
+ refute @yellow.checked?
49
+ end
50
+
51
+ def test_click
52
+ @blue.click
53
+
54
+ assert @blue.checked?
55
+
56
+ @blue.click
57
+
58
+ refute @blue.checked?
59
+ end
60
+
61
+ def test_label
62
+ assert_equal 'Blue', @blue.label.text
63
+ end
64
+
65
+ def test_uncheck
66
+ @blue.check
67
+
68
+ @blue.uncheck
69
+
70
+ refute @blue.checked?
71
+ refute @brown.checked?
72
+ refute @green.checked?
73
+ refute @red.checked?
74
+ refute @yellow.checked?
75
+ end
76
+
77
+ end
78
+