neocoin-mechanize 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/.autotest +6 -0
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.rdoc +638 -0
  4. data/EXAMPLES.rdoc +187 -0
  5. data/FAQ.rdoc +11 -0
  6. data/GUIDE.rdoc +163 -0
  7. data/LICENSE.rdoc +20 -0
  8. data/Manifest.txt +172 -0
  9. data/README.rdoc +63 -0
  10. data/Rakefile +36 -0
  11. data/examples/flickr_upload.rb +22 -0
  12. data/examples/mech-dump.rb +5 -0
  13. data/examples/proxy_req.rb +7 -0
  14. data/examples/rubyforge.rb +20 -0
  15. data/examples/spider.rb +21 -0
  16. data/lib/mechanize.rb +662 -0
  17. data/lib/mechanize/content_type_error.rb +14 -0
  18. data/lib/mechanize/cookie.rb +85 -0
  19. data/lib/mechanize/cookie_jar.rb +241 -0
  20. data/lib/mechanize/element_matcher.rb +35 -0
  21. data/lib/mechanize/file.rb +80 -0
  22. data/lib/mechanize/file_connection.rb +17 -0
  23. data/lib/mechanize/file_request.rb +26 -0
  24. data/lib/mechanize/file_response.rb +74 -0
  25. data/lib/mechanize/file_saver.rb +37 -0
  26. data/lib/mechanize/form.rb +478 -0
  27. data/lib/mechanize/form/button.rb +9 -0
  28. data/lib/mechanize/form/check_box.rb +11 -0
  29. data/lib/mechanize/form/field.rb +44 -0
  30. data/lib/mechanize/form/file_upload.rb +23 -0
  31. data/lib/mechanize/form/image_button.rb +20 -0
  32. data/lib/mechanize/form/multi_select_list.rb +83 -0
  33. data/lib/mechanize/form/option.rb +49 -0
  34. data/lib/mechanize/form/radio_button.rb +48 -0
  35. data/lib/mechanize/form/select_list.rb +40 -0
  36. data/lib/mechanize/headers.rb +25 -0
  37. data/lib/mechanize/history.rb +83 -0
  38. data/lib/mechanize/http.rb +3 -0
  39. data/lib/mechanize/http/agent.rb +738 -0
  40. data/lib/mechanize/inspect.rb +88 -0
  41. data/lib/mechanize/monkey_patch.rb +37 -0
  42. data/lib/mechanize/page.rb +408 -0
  43. data/lib/mechanize/page/base.rb +8 -0
  44. data/lib/mechanize/page/frame.rb +27 -0
  45. data/lib/mechanize/page/image.rb +30 -0
  46. data/lib/mechanize/page/label.rb +20 -0
  47. data/lib/mechanize/page/link.rb +82 -0
  48. data/lib/mechanize/page/meta_refresh.rb +56 -0
  49. data/lib/mechanize/pluggable_parsers.rb +101 -0
  50. data/lib/mechanize/redirect_limit_reached_error.rb +16 -0
  51. data/lib/mechanize/redirect_not_get_or_head_error.rb +19 -0
  52. data/lib/mechanize/response_code_error.rb +22 -0
  53. data/lib/mechanize/response_read_error.rb +27 -0
  54. data/lib/mechanize/robots_disallowed_error.rb +29 -0
  55. data/lib/mechanize/unsupported_scheme_error.rb +8 -0
  56. data/lib/mechanize/util.rb +113 -0
  57. data/test/data/htpasswd +1 -0
  58. data/test/data/server.crt +16 -0
  59. data/test/data/server.csr +12 -0
  60. data/test/data/server.key +15 -0
  61. data/test/data/server.pem +15 -0
  62. data/test/helper.rb +175 -0
  63. data/test/htdocs/alt_text.html +10 -0
  64. data/test/htdocs/bad_form_test.html +9 -0
  65. data/test/htdocs/button.jpg +0 -0
  66. data/test/htdocs/canonical_uri.html +9 -0
  67. data/test/htdocs/dir with spaces/foo.html +1 -0
  68. data/test/htdocs/empty_form.html +6 -0
  69. data/test/htdocs/file_upload.html +26 -0
  70. data/test/htdocs/find_link.html +41 -0
  71. data/test/htdocs/form_multi_select.html +16 -0
  72. data/test/htdocs/form_multival.html +37 -0
  73. data/test/htdocs/form_no_action.html +18 -0
  74. data/test/htdocs/form_no_input_name.html +16 -0
  75. data/test/htdocs/form_select.html +16 -0
  76. data/test/htdocs/form_select_all.html +16 -0
  77. data/test/htdocs/form_select_none.html +17 -0
  78. data/test/htdocs/form_select_noopts.html +10 -0
  79. data/test/htdocs/form_set_fields.html +14 -0
  80. data/test/htdocs/form_test.html +188 -0
  81. data/test/htdocs/frame_referer_test.html +10 -0
  82. data/test/htdocs/frame_test.html +30 -0
  83. data/test/htdocs/google.html +13 -0
  84. data/test/htdocs/iframe_test.html +16 -0
  85. data/test/htdocs/index.html +6 -0
  86. data/test/htdocs/link with space.html +5 -0
  87. data/test/htdocs/meta_cookie.html +11 -0
  88. data/test/htdocs/no_title_test.html +6 -0
  89. data/test/htdocs/nofollow.html +9 -0
  90. data/test/htdocs/noindex.html +9 -0
  91. data/test/htdocs/norobots.html +8 -0
  92. data/test/htdocs/rails_3_encoding_hack_form_test.html +27 -0
  93. data/test/htdocs/rel_nofollow.html +8 -0
  94. data/test/htdocs/relative/tc_relative_links.html +21 -0
  95. data/test/htdocs/robots.html +8 -0
  96. data/test/htdocs/robots.txt +2 -0
  97. data/test/htdocs/tc_bad_charset.html +9 -0
  98. data/test/htdocs/tc_bad_links.html +5 -0
  99. data/test/htdocs/tc_base_images.html +10 -0
  100. data/test/htdocs/tc_base_link.html +8 -0
  101. data/test/htdocs/tc_blank_form.html +11 -0
  102. data/test/htdocs/tc_charset.html +6 -0
  103. data/test/htdocs/tc_checkboxes.html +19 -0
  104. data/test/htdocs/tc_encoded_links.html +5 -0
  105. data/test/htdocs/tc_field_precedence.html +11 -0
  106. data/test/htdocs/tc_follow_meta.html +8 -0
  107. data/test/htdocs/tc_form_action.html +48 -0
  108. data/test/htdocs/tc_images.html +8 -0
  109. data/test/htdocs/tc_links.html +18 -0
  110. data/test/htdocs/tc_meta_in_body.html +9 -0
  111. data/test/htdocs/tc_no_attributes.html +16 -0
  112. data/test/htdocs/tc_pretty_print.html +17 -0
  113. data/test/htdocs/tc_radiobuttons.html +17 -0
  114. data/test/htdocs/tc_referer.html +16 -0
  115. data/test/htdocs/tc_relative_links.html +19 -0
  116. data/test/htdocs/tc_textarea.html +23 -0
  117. data/test/htdocs/test_bad_encoding.html +52 -0
  118. data/test/htdocs/test_click.html +11 -0
  119. data/test/htdocs/unusual______.html +5 -0
  120. data/test/servlets.rb +402 -0
  121. data/test/ssl_server.rb +48 -0
  122. data/test/test_cookies.rb +129 -0
  123. data/test/test_form_action.rb +52 -0
  124. data/test/test_form_as_hash.rb +59 -0
  125. data/test/test_form_button.rb +46 -0
  126. data/test/test_frames.rb +34 -0
  127. data/test/test_headers.rb +33 -0
  128. data/test/test_history.rb +118 -0
  129. data/test/test_history_added.rb +16 -0
  130. data/test/test_html_unscape_forms.rb +46 -0
  131. data/test/test_if_modified_since.rb +20 -0
  132. data/test/test_images.rb +19 -0
  133. data/test/test_mechanize.rb +842 -0
  134. data/test/test_mechanize_cookie.rb +345 -0
  135. data/test/test_mechanize_cookie_jar.rb +401 -0
  136. data/test/test_mechanize_file.rb +53 -0
  137. data/test/test_mechanize_file_request.rb +19 -0
  138. data/test/test_mechanize_file_response.rb +21 -0
  139. data/test/test_mechanize_form.rb +576 -0
  140. data/test/test_mechanize_form_check_box.rb +37 -0
  141. data/test/test_mechanize_form_encoding.rb +120 -0
  142. data/test/test_mechanize_form_field.rb +21 -0
  143. data/test/test_mechanize_form_image_button.rb +12 -0
  144. data/test/test_mechanize_form_textarea.rb +51 -0
  145. data/test/test_mechanize_http_agent.rb +697 -0
  146. data/test/test_mechanize_link.rb +84 -0
  147. data/test/test_mechanize_page_encoding.rb +147 -0
  148. data/test/test_mechanize_page_link.rb +382 -0
  149. data/test/test_mechanize_page_meta_refresh.rb +115 -0
  150. data/test/test_mechanize_redirect_not_get_or_head_error.rb +18 -0
  151. data/test/test_mechanize_subclass.rb +22 -0
  152. data/test/test_mechanize_util.rb +92 -0
  153. data/test/test_multi_select.rb +118 -0
  154. data/test/test_no_attributes.rb +13 -0
  155. data/test/test_option.rb +18 -0
  156. data/test/test_pluggable_parser.rb +136 -0
  157. data/test/test_post_form.rb +37 -0
  158. data/test/test_pretty_print.rb +22 -0
  159. data/test/test_radiobutton.rb +75 -0
  160. data/test/test_redirect_limit_reached.rb +39 -0
  161. data/test/test_referer.rb +81 -0
  162. data/test/test_relative_links.rb +40 -0
  163. data/test/test_request.rb +13 -0
  164. data/test/test_response_code.rb +53 -0
  165. data/test/test_robots.rb +72 -0
  166. data/test/test_save_file.rb +48 -0
  167. data/test/test_scheme.rb +48 -0
  168. data/test/test_select.rb +119 -0
  169. data/test/test_select_all.rb +15 -0
  170. data/test/test_select_none.rb +15 -0
  171. data/test/test_select_noopts.rb +18 -0
  172. data/test/test_set_fields.rb +44 -0
  173. data/test/test_ssl_server.rb +20 -0
  174. metadata +354 -0
@@ -0,0 +1,37 @@
1
+ require 'helper'
2
+
3
+ class TestMechanizeFormCheckBox < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @agent = Mechanize.new
7
+ @page = @agent.get('http://localhost/tc_checkboxes.html')
8
+ end
9
+
10
+ def test_check
11
+ form = @page.forms.first
12
+
13
+ form.checkbox_with(:name => 'green').check
14
+
15
+ assert(form.checkbox_with(:name => 'green').checked)
16
+
17
+ %w{ red blue yellow brown }.each do |color|
18
+ assert_equal(false, form.checkbox_with(:name => color).checked)
19
+ end
20
+ end
21
+
22
+ def test_uncheck
23
+ form = @page.forms.first
24
+
25
+ checkbox = form.checkbox_with(:name => 'green')
26
+
27
+ checkbox.check
28
+
29
+ assert form.checkbox_with(:name => 'green').checked
30
+
31
+ checkbox.uncheck
32
+
33
+ assert !form.checkbox_with(:name => 'green').checked
34
+ end
35
+
36
+ end
37
+
@@ -0,0 +1,120 @@
1
+ # coding: utf-8
2
+ require "helper"
3
+
4
+ class TestMechanizeFormEncoding < MiniTest::Unit::TestCase
5
+
6
+ # See also: tests of Util.from_native_charset
7
+ # Encoding test should do with non-utf-8 characters
8
+
9
+ INPUTTED_VALUE = "テスト" # "test" in Japanese UTF-8 encoding
10
+ CONTENT_ENCODING = 'Shift_JIS' # one of Japanese encoding
11
+ encoded_value = "\x83\x65\x83\x58\x83\x67" # "test" in Japanese Shift_JIS encoding
12
+ encoded_value.force_encoding(::Encoding::SHIFT_JIS) if encoded_value.respond_to?(:force_encoding)
13
+ EXPECTED_QUERY = "first_name=#{CGI.escape(encoded_value)}&first_name=&gender=&green%5Beggs%5D="
14
+
15
+ if Mechanize::Util::NEW_RUBY_ENCODING
16
+ ENCODING_ERRORS = [EncodingError, Encoding::ConverterNotFoundError] # and so on
17
+ else
18
+ ENCODING_ERRORS = [Iconv::InvalidEncoding, Iconv::IllegalSequence]
19
+ end
20
+
21
+ ENCODING_LOG_MESSAGE = /INFO -- : form encoding: Shift_JIS/
22
+ INVALID_ENCODING = 'UTF-eight'
23
+
24
+ def setup
25
+ @agent = Mechanize.new
26
+ end
27
+
28
+ def set_form_with_encoding(enc)
29
+ page = @agent.get("http://localhost/form_set_fields.html")
30
+ form = page.forms.first
31
+ form.encoding = enc
32
+ form['first_name'] = INPUTTED_VALUE
33
+ form
34
+ end
35
+
36
+
37
+ def test_form_encoding_returns_accept_charset
38
+ page = @agent.get("http://localhost/rails_3_encoding_hack_form_test.html")
39
+ form = page.forms.first
40
+ accept_charset = form.form_node['accept-charset']
41
+
42
+ assert accept_charset
43
+ assert_equal accept_charset, form.encoding
44
+ refute_equal page.encoding, form.encoding
45
+ end
46
+
47
+ def test_form_encoding_returns_page_encoding_when_no_accept_charset
48
+ page = @agent.get("http://localhost/form_set_fields.html")
49
+ form = page.forms.first
50
+ accept_charset = form.form_node['accept-charset']
51
+
52
+ assert_nil accept_charset
53
+ refute_equal accept_charset, form.encoding
54
+ assert_equal page.encoding, form.encoding
55
+ end
56
+
57
+ def test_form_encoding_equals_sets_new_encoding
58
+ page = @agent.get("http://localhost/form_set_fields.html")
59
+ form = page.forms.first
60
+
61
+ refute_equal CONTENT_ENCODING, form.encoding
62
+
63
+ form.encoding = CONTENT_ENCODING
64
+
65
+ assert_equal CONTENT_ENCODING, form.encoding
66
+ end
67
+
68
+ def test_form_encoding_returns_nil_when_no_page_in_initialize
69
+ # this sequence is seen at Mechanize#post(url, query_hash)
70
+
71
+ node = {}
72
+ # Create a fake form
73
+ class << node
74
+ def search(*args); []; end
75
+ end
76
+ node['method'] = 'POST'
77
+ node['enctype'] = 'application/x-www-form-urlencoded'
78
+ form = Mechanize::Form.new(node)
79
+
80
+ assert_equal nil, form.encoding
81
+ end
82
+
83
+
84
+ def test_post_form_with_form_encoding
85
+ form = set_form_with_encoding CONTENT_ENCODING
86
+ form.submit
87
+
88
+ # we can not use "links.find{|l| l.text == 'key:val'}" assertion here
89
+ # because the link text encoding is always UTF-8 regaredless of html encoding
90
+ assert EXPECTED_QUERY, @agent.page.at('div#query').inner_text
91
+ end
92
+
93
+ def test_post_form_with_problematic_encoding
94
+ form = set_form_with_encoding INVALID_ENCODING
95
+
96
+ assert_raises(*ENCODING_ERRORS){ form.submit }
97
+ end
98
+
99
+ def test_form_ignore_encoding_error_is_true
100
+ form = set_form_with_encoding INVALID_ENCODING
101
+ form.ignore_encoding_error = true
102
+
103
+ form.submit
104
+
105
+ # HACK no assertions
106
+ end
107
+
108
+ def test_post_form_logs_form_encoding
109
+ sio = StringIO.new
110
+ @agent.log = Logger.new(sio)
111
+ @agent.log.level = Logger::INFO
112
+
113
+ form = set_form_with_encoding CONTENT_ENCODING
114
+ form.submit
115
+
116
+ assert_match ENCODING_LOG_MESSAGE, sio.string
117
+
118
+ @agent.log = nil
119
+ end
120
+ end
@@ -0,0 +1,21 @@
1
+ require 'helper'
2
+
3
+ class TestMechanizeFormField < MiniTest::Unit::TestCase
4
+
5
+ def test_field_spaceship
6
+ doc = Nokogiri::HTML::Document.new
7
+ node = doc.create_element('input')
8
+ node['name'] = 'foo'
9
+ node['value'] = 'bar'
10
+
11
+ a = Mechanize::Form::Field.new(node)
12
+ b = Mechanize::Form::Field.new({'name' => 'foo'}, 'bar')
13
+ c = Mechanize::Form::Field.new({'name' => 'foo'}, 'bar')
14
+
15
+ assert_equal [a, b], [a, b].sort
16
+ assert_equal [a, b], [b, a].sort
17
+ assert_equal [b, c].sort, [b, c].sort
18
+ end
19
+
20
+ end
21
+
@@ -0,0 +1,12 @@
1
+ require 'helper'
2
+
3
+ class TestMechanizeFormImageButton < MiniTest::Unit::TestCase
4
+
5
+ def test_query_value
6
+ button = Mechanize::Form::ImageButton.new 'name' => 'image_button'
7
+
8
+ assert_equal [%w[image_button.x 0], %w[image_button.y 0]],
9
+ button.query_value
10
+ end
11
+ end
12
+
@@ -0,0 +1,51 @@
1
+ require "helper"
2
+
3
+ class TestMechanizeFormTextarea < MiniTest::Unit::TestCase
4
+ def setup
5
+ @agent = Mechanize.new
6
+ @page = @agent.get("http://localhost/tc_textarea.html")
7
+ end
8
+
9
+ def test_empty_text_area
10
+ form = @page.forms_with(:name => 'form1').first
11
+ assert_equal('', form.field_with(:name => 'text1').value)
12
+ form.text1 = 'Hello World'
13
+ assert_equal('Hello World', form.field_with(:name => 'text1').value)
14
+ page = @agent.submit(form)
15
+ assert_equal(1, page.links.length)
16
+ assert_equal('text1:Hello World', page.links[0].text)
17
+ end
18
+
19
+ def test_non_empty_textfield
20
+ form = @page.forms_with(:name => 'form2').first
21
+ assert_equal('sample text', form.field_with(:name => 'text1').value)
22
+ page = @agent.submit(form)
23
+ assert_equal(1, page.links.length)
24
+ assert_equal('text1:sample text', page.links[0].text)
25
+ end
26
+
27
+ def test_multi_textfield
28
+ form = @page.form_with(:name => 'form3')
29
+
30
+ assert_equal(2, form.fields_with(:name => 'text1').length)
31
+ assert_equal('', form.fields_with(:name => 'text1')[0].value)
32
+ assert_equal('sample text', form.fields_with(:name => 'text1')[1].value)
33
+
34
+ form.text1 = 'Hello World'
35
+
36
+ assert_equal('Hello World', form.fields_with(:name => 'text1')[0].value)
37
+ assert_equal('sample text', form.fields_with(:name => 'text1')[1].value)
38
+
39
+ page = @agent.submit(form)
40
+
41
+ assert_equal(2, page.links.length)
42
+
43
+ link = page.links_with(:text => 'text1:sample text')
44
+
45
+ assert_equal(1, link.length)
46
+
47
+ link = page.links_with(:text => 'text1:Hello World')
48
+
49
+ assert_equal(1, link.length)
50
+ end
51
+ end
@@ -0,0 +1,697 @@
1
+ # coding: utf-8
2
+ require 'helper'
3
+
4
+ class TestMechanizeHttpAgent < MiniTest::Unit::TestCase
5
+
6
+ def setup
7
+ @mech = Mechanize.new
8
+ @agent = @mech.agent
9
+
10
+ @uri = URI.parse 'http://example/'
11
+
12
+ @req = Net::HTTP::Get.new '/'
13
+ @res = Net::HTTPOK.allocate
14
+ @res.instance_variable_set :@code, 200
15
+ @res.instance_variable_set :@header, {}
16
+
17
+ @headers = if RUBY_VERSION > '1.9' then
18
+ %w[accept user-agent]
19
+ else
20
+ %w[accept]
21
+ end
22
+ end
23
+
24
+ def test_connection_for_file
25
+ uri = URI.parse 'file:///nonexistent'
26
+ conn = @agent.connection_for uri
27
+
28
+ assert_equal Mechanize::FileConnection.new, conn
29
+ end
30
+
31
+ def test_connection_for_http
32
+ conn = @agent.connection_for @uri
33
+
34
+ assert_equal @agent.http, conn
35
+ end
36
+
37
+ def test_enable_gzip
38
+ @agent.enable_gzip @req
39
+
40
+ assert_equal 'gzip,deflate,identity', @req['accept-encoding']
41
+ end
42
+
43
+ def test_enable_gzip_no
44
+ @agent.gzip_enabled = false
45
+
46
+ @agent.enable_gzip @req
47
+
48
+ assert_equal 'identity', @req['accept-encoding']
49
+ end
50
+
51
+ def test_fetch_file_plus
52
+ Tempfile.open '++plus++' do |io|
53
+ content = 'plusses +++'
54
+ io.write content
55
+ io.rewind
56
+
57
+ uri = URI.parse "file://#{Mechanize::Util.uri_escape io.path}"
58
+
59
+ page = @agent.fetch uri
60
+
61
+ assert_equal content, page.body
62
+ assert_kind_of Mechanize::File, page
63
+ end
64
+ end
65
+
66
+ def test_fetch_file_space
67
+ foo = File.expand_path("../htdocs/dir with spaces/foo.html", __FILE__)
68
+
69
+ uri = URI.parse "file://#{Mechanize::Util.uri_escape foo}"
70
+
71
+ page = @agent.fetch uri
72
+
73
+ assert_equal File.read(foo), page.body
74
+ assert_kind_of Mechanize::Page, page
75
+ end
76
+
77
+ def test_fetch_file_nonexistent
78
+ uri = URI.parse 'file:///nonexistent'
79
+
80
+ e = assert_raises Mechanize::ResponseCodeError do
81
+ @agent.fetch uri
82
+ end
83
+
84
+ assert_equal '404 => Net::HTTPNotFound', e.message
85
+ end
86
+
87
+ def test_fetch_post_connect_hook
88
+ response = nil
89
+ @agent.post_connect_hooks << lambda { |_, _, res, _| response = res }
90
+
91
+ @agent.fetch 'http://localhost/'
92
+
93
+ assert response
94
+ end
95
+
96
+ def test_get_robots
97
+ robotstxt = @agent.get_robots 'http://localhost/robots.txt'
98
+ refute_equal '', robotstxt
99
+
100
+ robotstxt = @agent.get_robots 'http://localhost/response_code?code=404'
101
+ assert_equal '', robotstxt
102
+ end
103
+
104
+ def test_http_request_file
105
+ uri = URI.parse 'file:///nonexistent'
106
+ request = @agent.http_request uri, :get
107
+
108
+ assert_kind_of Mechanize::FileRequest, request
109
+ assert_equal '/nonexistent', request.path
110
+ end
111
+
112
+ def test_http_request_get
113
+ request = @agent.http_request @uri, :get
114
+
115
+ assert_kind_of Net::HTTP::Get, request
116
+ assert_equal '/', request.path
117
+ end
118
+
119
+ def test_http_request_post
120
+ request = @agent.http_request @uri, :post
121
+
122
+ assert_kind_of Net::HTTP::Post, request
123
+ assert_equal '/', request.path
124
+ end
125
+
126
+ def test_post_connect
127
+ @agent.post_connect_hooks << proc { |agent, uri, response, body|
128
+ assert_equal @agent, agent
129
+ assert_equal @res, response
130
+ assert_equal 'body', body
131
+ throw :called
132
+ }
133
+
134
+ assert_throws :called do
135
+ @agent.post_connect @uri, @res, 'body'
136
+ end
137
+ end
138
+
139
+ def test_pre_connect
140
+ @agent.pre_connect_hooks << proc { |agent, request|
141
+ assert_equal @agent, agent
142
+ assert_equal @req, request
143
+ throw :called
144
+ }
145
+
146
+ assert_throws :called do
147
+ @agent.pre_connect @req
148
+ end
149
+ end
150
+
151
+ def test_request_cookies
152
+ uri = URI.parse 'http://host.example.com'
153
+ Mechanize::Cookie.parse uri, 'hello=world domain=.example.com' do |cookie|
154
+ @agent.cookie_jar.add uri, cookie
155
+ end
156
+
157
+ @agent.request_cookies @req, uri
158
+
159
+ assert_equal 'hello=world domain=.example.com', @req['Cookie']
160
+ end
161
+
162
+ def test_request_cookies_none
163
+ @agent.request_cookies @req, @uri
164
+
165
+ assert_nil @req['Cookie']
166
+ end
167
+
168
+ def test_request_cookies_many
169
+ uri = URI.parse 'http://host.example.com'
170
+ cookie_str = 'a=b domain=.example.com, c=d domain=.example.com'
171
+ Mechanize::Cookie.parse uri, cookie_str do |cookie|
172
+ @agent.cookie_jar.add uri, cookie
173
+ end
174
+
175
+ @agent.request_cookies @req, uri
176
+
177
+ expected = cookie_str.sub ', ', '; '
178
+
179
+ assert_equal expected, @req['Cookie']
180
+ end
181
+
182
+ def test_request_cookies_wrong_domain
183
+ uri = URI.parse 'http://host.example.com'
184
+ Mechanize::Cookie.parse uri, 'hello=world domain=.example.com' do |cookie|
185
+ @agent.cookie_jar.add uri, cookie
186
+ end
187
+
188
+ @agent.request_cookies @req, @uri
189
+
190
+ assert_nil @req['Cookie']
191
+ end
192
+
193
+ def test_request_host
194
+ @agent.request_host @req, @uri
195
+
196
+ assert_equal 'example', @req['host']
197
+ end
198
+
199
+ def test_request_host_nonstandard
200
+ @uri.port = 81
201
+
202
+ @agent.request_host @req, @uri
203
+
204
+ assert_equal 'example:81', @req['host']
205
+ end
206
+
207
+ def test_request_language_charset
208
+ @agent.request_language_charset @req
209
+
210
+ assert_equal 'en-us,en;q=0.5', @req['accept-language']
211
+ assert_equal 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', @req['accept-charset']
212
+ end
213
+
214
+ def test_request_add_headers
215
+ @agent.request_add_headers @req, 'Content-Length' => 300
216
+
217
+ assert_equal '300', @req['content-length']
218
+ end
219
+
220
+ def test_request_add_headers_etag
221
+ @agent.request_add_headers @req, :etag => '300'
222
+
223
+ assert_equal '300', @req['etag']
224
+ end
225
+
226
+ def test_request_add_headers_if_modified_since
227
+ @agent.request_add_headers @req, :if_modified_since => 'some_date'
228
+
229
+ assert_equal 'some_date', @req['if-modified-since']
230
+ end
231
+
232
+ def test_request_add_headers_none
233
+ @agent.request_add_headers @req
234
+
235
+ assert_equal @headers, @req.to_hash.keys.sort
236
+ end
237
+
238
+ def test_request_add_headers_request_headers
239
+ @agent.request_headers['X-Foo'] = 'bar'
240
+
241
+ @agent.request_add_headers @req
242
+
243
+ assert_equal @headers + %w[x-foo], @req.to_hash.keys.sort
244
+ end
245
+
246
+ def test_request_add_headers_symbol
247
+ e = assert_raises ArgumentError do
248
+ @agent.request_add_headers @req, :content_length => 300
249
+ end
250
+
251
+ assert_equal 'unknown header symbol content_length', e.message
252
+ end
253
+
254
+ def test_request_referer
255
+ referer = URI.parse 'http://old.example'
256
+
257
+ @agent.request_referer @req, @uri, referer
258
+
259
+ assert_equal 'http://old.example', @req['referer']
260
+ end
261
+
262
+ def test_request_referer_https
263
+ uri = URI.parse 'https://example'
264
+ referer = URI.parse 'https://old.example'
265
+
266
+ @agent.request_referer @req, uri, referer
267
+
268
+ assert_equal 'https://old.example', @req['referer']
269
+ end
270
+
271
+ def test_request_referer_https_downgrade
272
+ referer = URI.parse 'https://old.example'
273
+
274
+ @agent.request_referer @req, @uri, referer
275
+
276
+ assert_nil @req['referer']
277
+ end
278
+
279
+ def test_request_referer_https_downgrade_case
280
+ uri = URI.parse 'http://example'
281
+ referer = URI.parse 'httpS://old.example'
282
+
283
+ @agent.request_referer @req, uri, referer
284
+
285
+ assert_nil @req['referer']
286
+ end
287
+
288
+ def test_request_referer_none
289
+ @agent.request_referer @req, @uri, nil
290
+
291
+ assert_nil @req['referer']
292
+ end
293
+
294
+ def test_request_user_agent
295
+ @agent.request_user_agent @req
296
+
297
+ assert_match %r%^Mechanize/#{Mechanize::VERSION}%, @req['user-agent']
298
+
299
+ ruby_version = if RUBY_PATCHLEVEL >= 0 then
300
+ "#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}"
301
+ else
302
+ "#{RUBY_VERSION}dev#{RUBY_REVISION}"
303
+ end
304
+
305
+ assert_match %r%Ruby/#{ruby_version}%, @req['user-agent']
306
+ end
307
+
308
+ def test_resolve_bad_uri
309
+ e = assert_raises ArgumentError do
310
+ @agent.resolve 'google'
311
+ end
312
+
313
+ assert_equal 'absolute URL needed (not google)', e.message
314
+ end
315
+
316
+ def test_resolve_utf8
317
+ uri = 'http://example?q=ü'
318
+
319
+ resolved = @agent.resolve uri
320
+
321
+ assert_equal '/?q=%C3%BC', resolved.request_uri
322
+ end
323
+
324
+ def test_resolve_parameters_body
325
+ input_params = { :q => 'hello' }
326
+
327
+ uri, params = @agent.resolve_parameters @uri, :post, input_params
328
+
329
+ assert_equal 'http://example/', uri.to_s
330
+ assert_equal input_params, params
331
+ end
332
+
333
+ def test_resolve_parameters_query
334
+ uri, params = @agent.resolve_parameters @uri, :get, :q => 'hello'
335
+
336
+ assert_equal 'http://example/?q=hello', uri.to_s
337
+ assert_nil params
338
+ end
339
+
340
+ def test_resolve_parameters_query_append
341
+ input_params = { :q => 'hello' }
342
+ @uri.query = 'a=b'
343
+
344
+ uri, params = @agent.resolve_parameters @uri, :get, input_params
345
+
346
+ assert_equal 'http://example/?a=b&q=hello', uri.to_s
347
+ assert_nil params
348
+ end
349
+
350
+ def test_response_content_encoding_7_bit
351
+ def @res.content_length() 4 end
352
+ @res.instance_variable_set :@header, 'content-encoding' => %w[7bit]
353
+
354
+ body = @agent.response_content_encoding @res, StringIO.new('part')
355
+
356
+ assert_equal 'part', body
357
+ end
358
+
359
+ def test_response_content_encoding_deflate
360
+ def @res.content_length() 12 end
361
+ @res.instance_variable_set :@header, 'content-encoding' => %w[deflate]
362
+ body_io = StringIO.new "x\x9C+H,*\x01\x00\x04?\x01\xB8"
363
+
364
+ body = @agent.response_content_encoding @res, body_io
365
+
366
+ assert_equal 'part', body
367
+ end
368
+
369
+ def test_response_content_encoding_deflate_chunked
370
+ def @res.content_length() nil end
371
+ @res.instance_variable_set :@header, 'content-encoding' => %w[deflate]
372
+ body_io = StringIO.new "x\x9C+H,*\x01\x00\x04?\x01\xB8"
373
+
374
+ body = @agent.response_content_encoding @res, body_io
375
+
376
+ assert_equal 'part', body
377
+ end
378
+
379
+ # IIS/6.0 ASP.NET/2.0.50727 does not wrap deflate with zlib, WTF?
380
+ def test_response_content_encoding_deflate_no_zlib
381
+ def @res.content_length() 6 end
382
+ @res.instance_variable_set :@header, 'content-encoding' => %w[deflate]
383
+
384
+ body = @agent.response_content_encoding @res, StringIO.new("+H,*\001\000")
385
+
386
+ assert_equal 'part', body
387
+ end
388
+
389
+ def test_response_content_encoding_gzip
390
+ def @res.content_length() 24 end
391
+ @res.instance_variable_set :@header, 'content-encoding' => %w[gzip]
392
+ body_io = StringIO.new \
393
+ "\037\213\b\0002\002\225M\000\003+H,*\001\000\306p\017I\004\000\000\000"
394
+
395
+ body = @agent.response_content_encoding @res, body_io
396
+
397
+ assert_equal 'part', body
398
+ end
399
+
400
+ def test_response_content_encoding_gzip_chunked
401
+ def @res.content_length() nil end
402
+ @res.instance_variable_set :@header, 'content-encoding' => %w[gzip]
403
+ body_io = StringIO.new \
404
+ "\037\213\b\0002\002\225M\000\003+H,*\001\000\306p\017I\004\000\000\000"
405
+
406
+ body = @agent.response_content_encoding @res, body_io
407
+
408
+ assert_equal 'part', body
409
+ end
410
+
411
+ def test_response_content_encoding_none
412
+ def @res.content_length() 4 end
413
+ @res.instance_variable_set :@header, 'content-encoding' => %w[none]
414
+
415
+ body = @agent.response_content_encoding @res, StringIO.new('part')
416
+
417
+ assert_equal 'part', body
418
+ end
419
+
420
+ def test_response_content_encoding_x_gzip
421
+ def @res.content_length() 24 end
422
+ @res.instance_variable_set :@header, 'content-encoding' => %w[x-gzip]
423
+ body_io = StringIO.new \
424
+ "\037\213\b\0002\002\225M\000\003+H,*\001\000\306p\017I\004\000\000\000"
425
+
426
+ body = @agent.response_content_encoding @res, body_io
427
+
428
+ assert_equal 'part', body
429
+ end
430
+
431
+ def test_response_content_encoding_unknown
432
+ def @res.content_length() 4 end
433
+ @res.instance_variable_set :@header, 'content-encoding' => %w[unknown]
434
+ body = StringIO.new 'part'
435
+
436
+ e = assert_raises Mechanize::Error do
437
+ @agent.response_content_encoding @res, body
438
+ end
439
+
440
+ assert_equal 'Unsupported Content-Encoding: unknown', e.message
441
+ end
442
+
443
+ def test_response_cookies
444
+ uri = URI.parse 'http://host.example.com'
445
+ cookie_str = 'a=b domain=.example.com'
446
+ @res.instance_variable_set(:@header,
447
+ 'set-cookie' => [cookie_str],
448
+ 'content-type' => %w[text/html])
449
+ page = Mechanize::Page.new uri, @res, '', 200, @mech
450
+
451
+ @agent.response_cookies @res, uri, page
452
+
453
+ assert_equal ['a=b domain=.example.com'],
454
+ @agent.cookie_jar.cookies(uri).map { |c| c.to_s }
455
+ end
456
+
457
+ def test_response_cookies_meta
458
+ uri = URI.parse 'http://host.example.com'
459
+ cookie_str = 'a=b domain=.example.com'
460
+
461
+ body = <<-BODY
462
+ <head>
463
+ <meta http-equiv="Set-Cookie" content="#{cookie_str}">
464
+ </head>"
465
+ BODY
466
+
467
+ @res.instance_variable_set(:@header,
468
+ 'content-type' => %w[text/html])
469
+ page = Mechanize::Page.new uri, @res, body, 200, @mech
470
+
471
+ @agent.response_cookies @res, uri, page
472
+
473
+ assert_equal ['a=b domain=.example.com'],
474
+ @agent.cookie_jar.cookies(uri).map { |c| c.to_s }
475
+ end
476
+
477
+ def test_response_follow_meta_refresh
478
+ uri = URI.parse 'http://example/#id+1'
479
+
480
+ body = <<-BODY
481
+ <title></title>
482
+ <meta http-equiv="refresh" content="0">
483
+ BODY
484
+
485
+ page = Mechanize::Page.new(uri, {'content-type' => 'text/html'}, body,
486
+ 200, @mech)
487
+
488
+ @agent.follow_meta_refresh = true
489
+
490
+ page = @agent.response_follow_meta_refresh @res, uri, page, 0
491
+
492
+ assert_equal uri, page.uri
493
+ end
494
+
495
+ def test_response_read
496
+ def @res.read_body() yield 'part' end
497
+ def @res.content_length() 4 end
498
+
499
+ io = @agent.response_read @res, @req
500
+
501
+ body = io.read
502
+
503
+ assert_equal 'part', body
504
+ assert_equal Encoding::BINARY, body.encoding if body.respond_to? :encoding
505
+ end
506
+
507
+ def test_response_read_content_length_head
508
+ req = Net::HTTP::Head.new '/'
509
+
510
+ def @res.content_length() end
511
+ def @res.read_body() end
512
+
513
+ io = @agent.response_read @res, req
514
+
515
+ assert_equal '', io.read
516
+ end
517
+
518
+ def test_response_read_content_length_mismatch
519
+ def @res.content_length() 5 end
520
+ def @res.read_body() yield 'part' end
521
+
522
+ e = assert_raises EOFError do
523
+ @agent.response_read @res, @req
524
+ end
525
+
526
+ assert_equal 'Content-Length (5) does not match response body length (4)',
527
+ e.message
528
+ end
529
+
530
+ def test_response_read_content_length_redirect
531
+ res = Net::HTTPFound.allocate
532
+ def res.content_length() 5 end
533
+ def res.code() 302 end
534
+ def res.read_body() yield 'part' end
535
+ res.instance_variable_set :@header, {}
536
+
537
+ io = @agent.response_read res, @req
538
+
539
+ assert_equal 'part', io.read
540
+ end
541
+
542
+ def test_response_read_error
543
+ def @res.read_body()
544
+ yield 'part'
545
+ raise Net::HTTP::Persistent::Error
546
+ end
547
+
548
+ e = assert_raises Mechanize::ResponseReadError do
549
+ @agent.response_read @res, @req
550
+ end
551
+
552
+ assert_equal @res, e.response
553
+ assert_equal 'part', e.body_io.read
554
+ assert_kind_of Net::HTTP::Persistent::Error, e.error
555
+ end
556
+
557
+ def test_response_read_file
558
+ Tempfile.open 'pi.txt' do |tempfile|
559
+ tempfile.write "π\n"
560
+ tempfile.flush
561
+ tempfile.rewind
562
+
563
+ uri = URI.parse "file://#{tempfile.path}"
564
+ req = Mechanize::FileRequest.new uri
565
+ res = Mechanize::FileResponse.new tempfile.path
566
+
567
+ io = @agent.response_read res, req
568
+
569
+ expected = "π\n"
570
+ expected.force_encoding Encoding::BINARY if expected.respond_to? :encoding
571
+
572
+ body = io.read
573
+ assert_equal expected, body
574
+ assert_equal Encoding::BINARY, body.encoding if body.respond_to? :encoding
575
+ end
576
+ end
577
+
578
+ def test_response_read_no_body
579
+ req = Net::HTTP::Options.new '/'
580
+
581
+ def @res.content_length() end
582
+ def @res.read_body() end
583
+
584
+ io = @agent.response_read @res, req
585
+
586
+ assert_equal '', io.read
587
+ end
588
+
589
+ def test_response_read_unknown_code
590
+ res = Net::HTTPUnknownResponse.allocate
591
+ res.instance_variable_set :@code, 9999
592
+ def res.read_body() yield 'part' end
593
+
594
+ e = assert_raises Mechanize::ResponseCodeError do
595
+ @agent.response_read res, @req
596
+ end
597
+
598
+ assert_equal res, e.page
599
+ end
600
+
601
+ def test_response_parse
602
+ body = '<title>hi</title>'
603
+ @res.instance_variable_set :@header, 'content-type' => %w[text/html]
604
+
605
+ page = @agent.response_parse @res, body, @uri
606
+
607
+ assert_instance_of Mechanize::Page, page
608
+ assert_equal @mech, page.mech
609
+ end
610
+
611
+ def test_response_parse_content_type_case
612
+ body = '<title>hi</title>'
613
+ @res.instance_variable_set(:@header, 'content-type' => %w[text/HTML])
614
+
615
+ page = @agent.response_parse @res, body, @uri
616
+
617
+ assert_instance_of Mechanize::Page, page
618
+
619
+ assert_equal 'text/HTML', page.content_type
620
+ end
621
+
622
+ def test_response_parse_content_type_encoding
623
+ body = '<title>hi</title>'
624
+ @res.instance_variable_set(:@header,
625
+ 'content-type' =>
626
+ %w[text/html;charset=ISO-8859-1])
627
+
628
+ page = @agent.response_parse @res, body, @uri
629
+
630
+ assert_instance_of Mechanize::Page, page
631
+ assert_equal @mech, page.mech
632
+
633
+ assert_equal 'ISO-8859-1', page.encoding
634
+ assert_equal 'ISO-8859-1', page.parser.encoding
635
+ end
636
+
637
+ def test_response_parse_content_type_encoding_garbage
638
+ body = '<title>hi</title>'
639
+ @res.instance_variable_set(:@header,
640
+ 'content-type' =>
641
+ %w[text/html; charset=garbage_charset])
642
+
643
+ page = @agent.response_parse @res, body, @uri
644
+
645
+ assert_instance_of Mechanize::Page, page
646
+ assert_equal @mech, page.mech
647
+ end
648
+
649
+ def test_response_parse_content_type_encoding_broken_iso_8859_1
650
+ body = '<title>hi</title>'
651
+ @res.instance_variable_set(:@header,
652
+ 'content-type' =>
653
+ %w[text/html; charset=ISO_8859-1])
654
+
655
+ page = @agent.response_parse @res, body, @uri
656
+
657
+ assert_instance_of Mechanize::Page, page
658
+ assert_equal 'ISO_8859-1', page.encoding
659
+ end
660
+
661
+ def test_response_parse_content_type_encoding_broken_utf_8
662
+ body = '<title>hi</title>'
663
+ @res.instance_variable_set(:@header,
664
+ 'content-type' =>
665
+ %w[text/html; charset=UTF8])
666
+
667
+ page = @agent.response_parse @res, body, @uri
668
+
669
+ assert_instance_of Mechanize::Page, page
670
+ assert_equal 'UTF8', page.encoding
671
+ assert_equal 'UTF8', page.parser.encoding
672
+ end
673
+
674
+ def test_response_parse_content_type_encoding_semicolon
675
+ body = '<title>hi</title>'
676
+ @res.instance_variable_set(:@header,
677
+ 'content-type' =>
678
+ %w[text/html;charset=UTF-8;])
679
+
680
+ page = @agent.response_parse @res, body, @uri
681
+
682
+ assert_instance_of Mechanize::Page, page
683
+
684
+ assert_equal 'UTF-8', page.encoding
685
+ end
686
+
687
+ def test_set_proxy
688
+ @agent.set_proxy('www.example.com', 9001, 'joe', 'lol')
689
+
690
+ assert_equal(@agent.proxy_uri.host, 'www.example.com')
691
+ assert_equal(@agent.proxy_uri.port, 9001)
692
+ assert_equal(@agent.proxy_uri.user, 'joe')
693
+ assert_equal(@agent.proxy_uri.password, 'lol')
694
+ end
695
+
696
+ end
697
+