neocoin-mechanize 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,115 @@
1
+ require 'helper'
2
+
3
+ class TestMechanizePageMetaRefresh < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @MR = Mechanize::Page::MetaRefresh
7
+
8
+ @agent = Mechanize.new
9
+ @uri = URI 'http://example/here/'
10
+ end
11
+
12
+ def util_page delay, uri
13
+ body = <<-BODY
14
+ <head><meta http-equiv="refresh" content="#{delay};url=#{uri}"></head>
15
+ BODY
16
+
17
+ Mechanize::Page.new(@uri, { 'content-type' => 'text/html' }, body, 200,
18
+ @agent)
19
+ end
20
+
21
+ def util_meta_refresh page
22
+ node = page.search('meta').first
23
+ @MR.from_node node, page, @uri
24
+ end
25
+
26
+ def test_class_parse
27
+ delay, uri = @MR.parse "0; url=http://localhost:8080/path", @uri
28
+ assert_equal "0", delay
29
+ assert_equal "http://localhost:8080/path", uri.to_s
30
+
31
+ delay, uri = @MR.parse "100.001; url=http://localhost:8080/path", @uri
32
+ assert_equal "100.001", delay
33
+ assert_equal "http://localhost:8080/path", uri.to_s
34
+
35
+ delay, uri = @MR.parse "0; url='http://localhost:8080/path'", @uri
36
+ assert_equal "0", delay
37
+ assert_equal "http://localhost:8080/path", uri.to_s
38
+
39
+ delay, uri = @MR.parse "0; url=\"http://localhost:8080/path\"", @uri
40
+ assert_equal "0", delay
41
+ assert_equal "http://localhost:8080/path", uri.to_s
42
+
43
+ delay, uri = @MR.parse "0; url=", @uri
44
+ assert_equal "0", delay
45
+ assert_equal "http://example/here/", uri.to_s
46
+
47
+ delay, uri = @MR.parse "0", @uri
48
+ assert_equal "0", delay
49
+ assert_equal "http://example/here/", uri.to_s
50
+
51
+ delay, uri = @MR.parse " 0; ", @uri
52
+ assert_equal "0", delay
53
+ assert_equal "http://example/here/", uri.to_s
54
+
55
+ delay, uri = @MR.parse "0; UrL=http://localhost:8080/path", @uri
56
+ assert_equal "0", delay
57
+ assert_equal "http://localhost:8080/path", uri.to_s
58
+ end
59
+
60
+ def test_class_from_node
61
+ page = util_page 5, 'http://b.example'
62
+ link = util_meta_refresh page
63
+ assert_equal 5, link.delay
64
+ assert_equal 'http://b.example', link.href
65
+
66
+ page = util_page 5, 'http://example/a'
67
+ link = util_meta_refresh page
68
+ assert_equal 5, link.delay
69
+ assert_equal 'http://example/a', link.href
70
+
71
+ page = util_page 5, 'test'
72
+ link = util_meta_refresh page
73
+ assert_equal 5, link.delay
74
+ assert_equal 'http://example/here/test', link.href
75
+
76
+ page = util_page 5, '/test'
77
+ link = util_meta_refresh page
78
+ assert_equal 5, link.delay
79
+ assert_equal 'http://example/test', link.href
80
+
81
+ page = util_page 5, nil
82
+ link = util_meta_refresh page
83
+ assert_equal 5, link.delay
84
+ assert_equal 'http://example/here/', link.href
85
+
86
+ page = util_page 5, @uri
87
+ link = util_meta_refresh page
88
+ assert_equal 5, link.delay
89
+ assert_equal 'http://example/here/', link.href
90
+ end
91
+
92
+ def test_class_from_node_no_content
93
+ body = <<-BODY
94
+ <head><meta http-equiv="refresh"></head>
95
+ BODY
96
+
97
+ page = Mechanize::Page.new(@uri, { 'content-type' => 'text/html' }, body,
98
+ 200, @agent)
99
+
100
+ assert_nil util_meta_refresh page
101
+ end
102
+
103
+ def test_class_from_node_not_refresh
104
+ body = <<-BODY
105
+ <head><meta http-equiv="other-thing" content="0;"></head>
106
+ BODY
107
+
108
+ page = Mechanize::Page.new(@uri, { 'content-type' => 'text/html' }, body,
109
+ 200, @agent)
110
+
111
+ assert_nil util_meta_refresh page
112
+ end
113
+
114
+ end
115
+
@@ -0,0 +1,18 @@
1
+ require 'helper'
2
+
3
+ class TestMechanizeRedirectNotGetOrHead < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ @agent = Mechanize.new
7
+ end
8
+
9
+ def test_to_s
10
+ page = MechTestHelper.fake_page(@agent)
11
+
12
+ error = Mechanize::RedirectNotGetOrHeadError.new(page, :put)
13
+
14
+ assert_match(/ PUT /, error.to_s)
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,22 @@
1
+ require "helper"
2
+
3
+ class TestMechanizeSubclass < MiniTest::Unit::TestCase
4
+
5
+ class Parent < Mechanize
6
+ @html_parser = :parser
7
+ @log = :log
8
+ end
9
+
10
+ class Child < Parent
11
+ end
12
+
13
+ def test_subclass_inherits_html_parser
14
+ assert_equal :parser, Child.html_parser
15
+ end
16
+
17
+ def test_subclass_inherits_log
18
+ assert_equal :log, Child.log
19
+ end
20
+
21
+ end
22
+
@@ -0,0 +1,92 @@
1
+ # coding: utf-8
2
+ require 'helper'
3
+
4
+ class TestMechanizeUtil < MiniTest::Unit::TestCase
5
+
6
+ INPUTTED_VALUE = "テスト" # "test" in Japanese UTF-8 encoding
7
+ CONTENT_ENCODING = 'Shift_JIS' # one of Japanese encoding
8
+ ENCODED_VALUE = "\x83\x65\x83\x58\x83\x67" # "test" in Japanese Shift_JIS encoding
9
+
10
+ if Mechanize::Util::NEW_RUBY_ENCODING
11
+ ENCODING_ERRORS = [EncodingError, Encoding::ConverterNotFoundError] # and so on
12
+ ERROR_LOG_MESSAGE = /from_native_charset: Encoding::ConverterNotFoundError: form encoding: "UTF-eight"/
13
+ ENCODED_VALUE.force_encoding(::Encoding::SHIFT_JIS)
14
+ else
15
+ ENCODING_ERRORS = [Iconv::InvalidEncoding, Iconv::IllegalSequence]
16
+ ERROR_LOG_MESSAGE = /from_native_charset: Iconv::InvalidEncoding: form encoding: "UTF-eight"/
17
+ end
18
+
19
+ INVALID_ENCODING = 'UTF-eight'
20
+
21
+ def setup
22
+ @result = "not set"
23
+ end
24
+
25
+ def test_from_native_charset
26
+ @result = Mechanize::Util.from_native_charset(INPUTTED_VALUE, CONTENT_ENCODING)
27
+ assert_equal ENCODED_VALUE, @result
28
+ end
29
+
30
+ def test_from_native_charset_returns_nil_when_no_string
31
+ @result = Mechanize::Util.from_native_charset(nil, CONTENT_ENCODING)
32
+ assert_equal nil, @result
33
+ end
34
+
35
+ def test_from_native_charset_doesnot_convert_when_no_encoding
36
+ @result = Mechanize::Util.from_native_charset(INPUTTED_VALUE, nil)
37
+ refute_equal ENCODED_VALUE, @result
38
+ assert_equal INPUTTED_VALUE, @result
39
+ end
40
+
41
+ def test_from_native_charset_doesnot_convert_when_not_nokogiri
42
+ parser = Mechanize.html_parser
43
+ Mechanize.html_parser = 'Another HTML Parser'
44
+
45
+ @result = Mechanize::Util.from_native_charset(INPUTTED_VALUE, CONTENT_ENCODING)
46
+ refute_equal ENCODED_VALUE, @result
47
+ assert_equal INPUTTED_VALUE, @result
48
+ ensure
49
+ Mechanize.html_parser = parser
50
+ end
51
+
52
+ def test_from_native_charset_raises_error_with_bad_encoding
53
+ assert_raises(*ENCODING_ERRORS) do
54
+ Mechanize::Util.from_native_charset(INPUTTED_VALUE, INVALID_ENCODING)
55
+ end
56
+ end
57
+
58
+ def test_from_native_charset_suppress_encoding_error_when_3rd_arg_is_true
59
+ Mechanize::Util.from_native_charset(INPUTTED_VALUE, INVALID_ENCODING, true)
60
+
61
+ # HACK no assertion
62
+ end
63
+
64
+ def test_from_native_charset_doesnot_convert_when_encoding_error_raised_and_ignored
65
+ @result = Mechanize::Util.from_native_charset(INPUTTED_VALUE, INVALID_ENCODING, true)
66
+
67
+ refute_equal ENCODED_VALUE, @result
68
+ assert_equal INPUTTED_VALUE, @result
69
+ end
70
+
71
+ def test_from_native_charset_logs_form_when_encoding_error_raised
72
+ sio = StringIO.new
73
+ log = Logger.new(sio)
74
+ log.level = Logger::DEBUG
75
+
76
+ assert_raises(*ENCODING_ERRORS) do
77
+ Mechanize::Util.from_native_charset(INPUTTED_VALUE, INVALID_ENCODING, nil, log)
78
+ end
79
+
80
+ assert_match ERROR_LOG_MESSAGE, sio.string
81
+ end
82
+
83
+ def test_from_native_charset_logs_form_when_encoding_error_is_ignored
84
+ sio = StringIO.new
85
+ log = Logger.new(sio)
86
+ log.level = Logger::DEBUG
87
+
88
+ Mechanize::Util.from_native_charset(INPUTTED_VALUE, INVALID_ENCODING, true, log)
89
+
90
+ assert_match ERROR_LOG_MESSAGE, sio.string
91
+ end
92
+ end
@@ -0,0 +1,118 @@
1
+ require "helper"
2
+
3
+ class MultiSelectTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @agent = Mechanize.new
6
+ @page = @agent.get("http://localhost/form_multi_select.html")
7
+ @form = @page.forms.first
8
+ end
9
+
10
+ def test_option_with
11
+ o = @form.field_with(:name => 'list').option_with(:value => '1')
12
+ assert_equal '1', o.value
13
+ end
14
+
15
+ def test_options_with
16
+ os = @form.field_with(:name => 'list').options_with(:value => /1|2/)
17
+ assert_equal ['1', '2'].sort, os.map { |x| x.value }.sort
18
+ end
19
+
20
+ def test_select_none
21
+ page = @agent.get("http://localhost/form_multi_select.html")
22
+ form = page.forms.first
23
+ form.field_with(:name => 'list').select_none
24
+ page = @agent.submit(form)
25
+ assert_equal(0, page.links.length)
26
+ end
27
+
28
+ def test_select_all
29
+ page = @agent.get("http://localhost/form_multi_select.html")
30
+ form = page.forms.first
31
+ form.field_with(:name => 'list').select_all
32
+ page = @agent.submit(form)
33
+ assert_equal(6, page.links.length)
34
+ assert_equal(1, page.links_with(:text => 'list:1').length)
35
+ assert_equal(1, page.links_with(:text => 'list:2').length)
36
+ assert_equal(1, page.links_with(:text => 'list:3').length)
37
+ assert_equal(1, page.links_with(:text => 'list:4').length)
38
+ assert_equal(1, page.links_with(:text => 'list:5').length)
39
+ assert_equal(1, page.links_with(:text => 'list:6').length)
40
+ end
41
+
42
+ def test_click_all
43
+ page = @agent.get("http://localhost/form_multi_select.html")
44
+ form = page.forms.first
45
+ form.field_with(:name => 'list').options.each { |o| o.click }
46
+ page = @agent.submit(form)
47
+ assert_equal(5, page.links.length)
48
+ assert_equal(1, page.links_with(:text => 'list:1').length)
49
+ assert_equal(1, page.links_with(:text => 'list:3').length)
50
+ assert_equal(1, page.links_with(:text => 'list:4').length)
51
+ assert_equal(1, page.links_with(:text => 'list:5').length)
52
+ assert_equal(1, page.links_with(:text => 'list:6').length)
53
+ end
54
+
55
+ def test_select_default
56
+ page = @agent.get("http://localhost/form_multi_select.html")
57
+ form = page.forms.first
58
+ page = @agent.submit(form)
59
+ assert_equal(1, page.links.length)
60
+ assert_equal(1, page.links_with(:text => 'list:2').length)
61
+ end
62
+
63
+ def test_select_one
64
+ page = @agent.get("http://localhost/form_multi_select.html")
65
+ form = page.forms.first
66
+ form.list = 'Aaron'
67
+ assert_equal(['Aaron'], form.list)
68
+ page = @agent.submit(form)
69
+ assert_equal(1, page.links.length)
70
+ assert_equal('list:Aaron', page.links.first.text)
71
+ end
72
+
73
+ def test_select_two
74
+ page = @agent.get("http://localhost/form_multi_select.html")
75
+ form = page.forms.first
76
+ form.list = ['1', 'Aaron']
77
+ page = @agent.submit(form)
78
+ assert_equal(2, page.links.length)
79
+ assert_equal(1, page.links_with(:text => 'list:1').length)
80
+ assert_equal(1, page.links_with(:text => 'list:Aaron').length)
81
+ end
82
+
83
+ def test_select_three
84
+ page = @agent.get("http://localhost/form_multi_select.html")
85
+ form = page.forms.first
86
+ form.list = ['1', '2', '3']
87
+ page = @agent.submit(form)
88
+ assert_equal(3, page.links.length)
89
+ assert_equal(1, page.links_with(:text => 'list:1').length)
90
+ assert_equal(1, page.links_with(:text => 'list:2').length)
91
+ assert_equal(1, page.links_with(:text => 'list:3').length)
92
+ end
93
+
94
+ def test_select_three_twice
95
+ page = @agent.get("http://localhost/form_multi_select.html")
96
+ form = page.forms.first
97
+ form.list = ['1', '2', '3']
98
+ form.list = ['1', '2', '3']
99
+ page = @agent.submit(form)
100
+ assert_equal(3, page.links.length)
101
+ assert_equal(1, page.links_with(:text => 'list:1').length)
102
+ assert_equal(1, page.links_with(:text => 'list:2').length)
103
+ assert_equal(1, page.links_with(:text => 'list:3').length)
104
+ end
105
+
106
+ def test_select_with_click
107
+ page = @agent.get("http://localhost/form_multi_select.html")
108
+ form = page.forms.first
109
+ form.list = ['1', 'Aaron']
110
+ form.field_with(:name => 'list').options[3].tick
111
+ assert_equal(['1', 'Aaron', '4'].sort, form.list.sort)
112
+ page = @agent.submit(form)
113
+ assert_equal(3, page.links.length)
114
+ assert_equal(1, page.links_with(:text => 'list:1').length)
115
+ assert_equal(1, page.links_with(:text => 'list:Aaron').length)
116
+ assert_equal(1, page.links_with(:text => 'list:4').length)
117
+ end
118
+ end
@@ -0,0 +1,13 @@
1
+ require "helper"
2
+
3
+ class TestNoAttributes < MiniTest::Unit::TestCase
4
+ def setup
5
+ @agent = Mechanize.new
6
+ end
7
+
8
+ def test_parse_no_attributes
9
+ @agent.get('http://localhost/tc_no_attributes.html')
10
+
11
+ # HACK no assertions
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ require "helper"
2
+
3
+ class OptionTest < MiniTest::Unit::TestCase
4
+ class FakeAttribute < Hash
5
+ attr_reader :inner_text
6
+ def initialize(inner_text)
7
+ @inner_text = inner_text
8
+ end
9
+ alias :has_attribute? :has_key?
10
+ alias :attributes :keys
11
+ end
12
+
13
+ def test_option_missing_value
14
+ attribute = FakeAttribute.new('blah')
15
+ option = Mechanize::Form::Option.new(attribute, nil)
16
+ assert_equal('blah', option.value)
17
+ end
18
+ end
@@ -0,0 +1,136 @@
1
+ require "helper"
2
+
3
+ class PluggableParserTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @agent = Mechanize.new
6
+ end
7
+
8
+ def test_content_type_error
9
+ page = @agent.get("http://localhost/bad_content_type")
10
+
11
+ e = assert_raises Mechanize::ContentTypeError do
12
+ page = Mechanize::Page.new(page.uri,
13
+ page.response,
14
+ page.body,
15
+ page.code)
16
+ end
17
+
18
+ assert_equal('text/xml', e.content_type)
19
+ end
20
+
21
+ def test_content_type
22
+ page = @agent.get("http://localhost/content_type_test")
23
+ assert_kind_of(Mechanize::Page, page)
24
+ end
25
+
26
+ class Filter < Mechanize::Page
27
+ def initialize(uri=nil, response=nil, body=nil, code=nil)
28
+ super( uri,
29
+ response,
30
+ body.gsub(/<body>/, '<body><a href="http://daapclient.rubyforge.org">Net::DAAP::Client</a>'),
31
+ code
32
+ )
33
+ end
34
+ end
35
+
36
+ class FileFilter < Mechanize::File
37
+ def initialize(uri=nil, response=nil, body=nil, code=nil)
38
+ super( uri,
39
+ response,
40
+ body.gsub(/<body>/, '<body><a href="http://daapclient.rubyforge.org">Net::DAAP::Client</a>'),
41
+ code
42
+ )
43
+ end
44
+ end
45
+
46
+ def test_filter
47
+ @agent.pluggable_parser.html = Filter
48
+ page = @agent.get("http://localhost/find_link.html")
49
+
50
+ assert_kind_of(Filter, page)
51
+
52
+ assert_equal(19, page.links.length)
53
+ assert_equal(1, page.links_with(:text => 'Net::DAAP::Client').length)
54
+ end
55
+
56
+ def test_filter_hash
57
+ @agent.pluggable_parser['text/html'] = Filter
58
+ page = @agent.get("http://localhost/find_link.html")
59
+ assert_kind_of(Class, @agent.pluggable_parser['text/html'])
60
+ assert_equal(Filter, @agent.pluggable_parser['text/html'])
61
+ assert_kind_of(Filter, page)
62
+ assert_equal(19, page.links.length)
63
+ assert_equal(1, page.links_with(:text => 'Net::DAAP::Client').length)
64
+ end
65
+
66
+ def test_file_saver
67
+ @agent.pluggable_parser.html = Mechanize::FileSaver
68
+ page = @agent.get('http://localhost:2000/form_no_action.html')
69
+ length = page.response['Content-Length']
70
+ file_length = nil
71
+ File.open("localhost/form_no_action.html", "r") { |f|
72
+ file_length = f.read.length
73
+ }
74
+ FileUtils.rm_rf("localhost")
75
+ assert_equal(length.to_i, file_length)
76
+ end
77
+
78
+ def test_content_type_pdf
79
+ @agent.pluggable_parser.pdf = FileFilter
80
+ page = @agent.get("http://localhost/content_type_test?ct=application/pdf")
81
+ assert_kind_of(Class, @agent.pluggable_parser['application/pdf'])
82
+ assert_equal(FileFilter, @agent.pluggable_parser['application/pdf'])
83
+ assert_kind_of(FileFilter, page)
84
+ end
85
+
86
+ def test_content_type_csv
87
+ @agent.pluggable_parser.csv = FileFilter
88
+ page = @agent.get("http://localhost/content_type_test?ct=text/csv")
89
+ assert_kind_of(Class, @agent.pluggable_parser['text/csv'])
90
+ assert_equal(FileFilter, @agent.pluggable_parser['text/csv'])
91
+ assert_kind_of(FileFilter, page)
92
+ end
93
+
94
+ def test_content_type_xml
95
+ @agent.pluggable_parser.xml = FileFilter
96
+ page = @agent.get("http://localhost/content_type_test?ct=text/xml")
97
+ assert_kind_of(Class, @agent.pluggable_parser['text/xml'])
98
+ assert_equal(FileFilter, @agent.pluggable_parser['text/xml'])
99
+ assert_kind_of(FileFilter, page)
100
+ end
101
+
102
+ def test_file_saver_no_path
103
+ url = URI::HTTP.new('http', nil, 'example.com', nil, nil, '', nil, nil, nil)
104
+ fs = Mechanize::FileSaver.new(url, nil, 'hello world', 200)
105
+ assert_equal('example.com/index.html', fs.filename)
106
+ FileUtils.rm_rf('example.com')
107
+ end
108
+
109
+ def test_file_saver_slash
110
+ url = URI::HTTP.new('http', nil, 'example.com', nil, nil, '/', nil, nil, nil)
111
+ fs = Mechanize::FileSaver.new(url, nil, 'hello world', 200)
112
+ assert_equal('example.com/index.html', fs.filename)
113
+ FileUtils.rm_rf('example.com')
114
+ end
115
+
116
+ def test_file_saver_slash_file
117
+ url = URI::HTTP.new('http', nil, 'example.com', nil, nil, '/foo.html', nil, nil, nil)
118
+ fs = Mechanize::FileSaver.new(url, nil, 'hello world', 200)
119
+ assert_equal('example.com/foo.html', fs.filename)
120
+ FileUtils.rm_rf('example.com')
121
+ end
122
+
123
+ def test_file_saver_long_path_no_file
124
+ url = URI::HTTP.new('http', nil, 'example.com', nil, nil, '/one/two/', nil, nil, nil)
125
+ fs = Mechanize::FileSaver.new(url, nil, 'hello world', 200)
126
+ assert_equal('example.com/one/two/index.html', fs.filename)
127
+ FileUtils.rm_rf('example.com')
128
+ end
129
+
130
+ def test_file_saver_long_path
131
+ url = URI::HTTP.new('http', nil, 'example.com', nil, nil, '/one/two/foo.html', nil, nil, nil)
132
+ fs = Mechanize::FileSaver.new(url, nil, 'hello world', 200)
133
+ assert_equal('example.com/one/two/foo.html', fs.filename)
134
+ FileUtils.rm_rf('example.com')
135
+ end
136
+ end