tenderlove-mechanize 0.9.3.20090617085936

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 (173) hide show
  1. data/CHANGELOG.rdoc +496 -0
  2. data/EXAMPLES.rdoc +171 -0
  3. data/FAQ.rdoc +11 -0
  4. data/GUIDE.rdoc +122 -0
  5. data/LICENSE.rdoc +340 -0
  6. data/Manifest.txt +169 -0
  7. data/README.rdoc +60 -0
  8. data/Rakefile +43 -0
  9. data/examples/flickr_upload.rb +23 -0
  10. data/examples/mech-dump.rb +7 -0
  11. data/examples/proxy_req.rb +9 -0
  12. data/examples/rubyforge.rb +21 -0
  13. data/examples/spider.rb +11 -0
  14. data/lib/mechanize.rb +7 -0
  15. data/lib/www/mechanize/chain/auth_headers.rb +80 -0
  16. data/lib/www/mechanize/chain/body_decoding_handler.rb +48 -0
  17. data/lib/www/mechanize/chain/connection_resolver.rb +78 -0
  18. data/lib/www/mechanize/chain/custom_headers.rb +23 -0
  19. data/lib/www/mechanize/chain/handler.rb +9 -0
  20. data/lib/www/mechanize/chain/header_resolver.rb +53 -0
  21. data/lib/www/mechanize/chain/parameter_resolver.rb +24 -0
  22. data/lib/www/mechanize/chain/post_connect_hook.rb +0 -0
  23. data/lib/www/mechanize/chain/pre_connect_hook.rb +22 -0
  24. data/lib/www/mechanize/chain/request_resolver.rb +32 -0
  25. data/lib/www/mechanize/chain/response_body_parser.rb +40 -0
  26. data/lib/www/mechanize/chain/response_header_handler.rb +50 -0
  27. data/lib/www/mechanize/chain/response_reader.rb +41 -0
  28. data/lib/www/mechanize/chain/ssl_resolver.rb +42 -0
  29. data/lib/www/mechanize/chain/uri_resolver.rb +77 -0
  30. data/lib/www/mechanize/chain.rb +34 -0
  31. data/lib/www/mechanize/content_type_error.rb +16 -0
  32. data/lib/www/mechanize/cookie.rb +72 -0
  33. data/lib/www/mechanize/cookie_jar.rb +191 -0
  34. data/lib/www/mechanize/file.rb +73 -0
  35. data/lib/www/mechanize/file_response.rb +62 -0
  36. data/lib/www/mechanize/file_saver.rb +39 -0
  37. data/lib/www/mechanize/form/button.rb +8 -0
  38. data/lib/www/mechanize/form/check_box.rb +13 -0
  39. data/lib/www/mechanize/form/field.rb +28 -0
  40. data/lib/www/mechanize/form/file_upload.rb +24 -0
  41. data/lib/www/mechanize/form/image_button.rb +23 -0
  42. data/lib/www/mechanize/form/multi_select_list.rb +69 -0
  43. data/lib/www/mechanize/form/option.rb +51 -0
  44. data/lib/www/mechanize/form/radio_button.rb +38 -0
  45. data/lib/www/mechanize/form/select_list.rb +45 -0
  46. data/lib/www/mechanize/form.rb +360 -0
  47. data/lib/www/mechanize/headers.rb +12 -0
  48. data/lib/www/mechanize/history.rb +67 -0
  49. data/lib/www/mechanize/inspect.rb +90 -0
  50. data/lib/www/mechanize/monkey_patch.rb +37 -0
  51. data/lib/www/mechanize/page/base.rb +10 -0
  52. data/lib/www/mechanize/page/frame.rb +22 -0
  53. data/lib/www/mechanize/page/link.rb +50 -0
  54. data/lib/www/mechanize/page/meta.rb +51 -0
  55. data/lib/www/mechanize/page.rb +176 -0
  56. data/lib/www/mechanize/pluggable_parsers.rb +103 -0
  57. data/lib/www/mechanize/redirect_limit_reached_error.rb +18 -0
  58. data/lib/www/mechanize/redirect_not_get_or_head_error.rb +20 -0
  59. data/lib/www/mechanize/response_code_error.rb +25 -0
  60. data/lib/www/mechanize/unsupported_scheme_error.rb +10 -0
  61. data/lib/www/mechanize/util.rb +76 -0
  62. data/lib/www/mechanize.rb +619 -0
  63. data/mechanize.gemspec +41 -0
  64. data/test/chain/test_argument_validator.rb +14 -0
  65. data/test/chain/test_auth_headers.rb +25 -0
  66. data/test/chain/test_custom_headers.rb +18 -0
  67. data/test/chain/test_header_resolver.rb +28 -0
  68. data/test/chain/test_parameter_resolver.rb +35 -0
  69. data/test/chain/test_request_resolver.rb +29 -0
  70. data/test/chain/test_response_reader.rb +24 -0
  71. data/test/data/htpasswd +1 -0
  72. data/test/data/server.crt +16 -0
  73. data/test/data/server.csr +12 -0
  74. data/test/data/server.key +15 -0
  75. data/test/data/server.pem +15 -0
  76. data/test/helper.rb +129 -0
  77. data/test/htdocs/alt_text.html +10 -0
  78. data/test/htdocs/bad_form_test.html +9 -0
  79. data/test/htdocs/button.jpg +0 -0
  80. data/test/htdocs/empty_form.html +6 -0
  81. data/test/htdocs/file_upload.html +26 -0
  82. data/test/htdocs/find_link.html +41 -0
  83. data/test/htdocs/form_multi_select.html +16 -0
  84. data/test/htdocs/form_multival.html +37 -0
  85. data/test/htdocs/form_no_action.html +18 -0
  86. data/test/htdocs/form_no_input_name.html +16 -0
  87. data/test/htdocs/form_select.html +16 -0
  88. data/test/htdocs/form_select_all.html +16 -0
  89. data/test/htdocs/form_select_none.html +17 -0
  90. data/test/htdocs/form_select_noopts.html +10 -0
  91. data/test/htdocs/form_set_fields.html +14 -0
  92. data/test/htdocs/form_test.html +188 -0
  93. data/test/htdocs/frame_test.html +30 -0
  94. data/test/htdocs/google.html +13 -0
  95. data/test/htdocs/iframe_test.html +16 -0
  96. data/test/htdocs/index.html +6 -0
  97. data/test/htdocs/link with space.html +5 -0
  98. data/test/htdocs/meta_cookie.html +11 -0
  99. data/test/htdocs/no_title_test.html +6 -0
  100. data/test/htdocs/relative/tc_relative_links.html +21 -0
  101. data/test/htdocs/tc_bad_links.html +5 -0
  102. data/test/htdocs/tc_base_link.html +8 -0
  103. data/test/htdocs/tc_blank_form.html +11 -0
  104. data/test/htdocs/tc_checkboxes.html +19 -0
  105. data/test/htdocs/tc_encoded_links.html +5 -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_links.html +18 -0
  109. data/test/htdocs/tc_no_attributes.html +16 -0
  110. data/test/htdocs/tc_pretty_print.html +17 -0
  111. data/test/htdocs/tc_radiobuttons.html +17 -0
  112. data/test/htdocs/tc_referer.html +10 -0
  113. data/test/htdocs/tc_relative_links.html +19 -0
  114. data/test/htdocs/tc_textarea.html +23 -0
  115. data/test/htdocs/unusual______.html +5 -0
  116. data/test/servlets.rb +365 -0
  117. data/test/ssl_server.rb +48 -0
  118. data/test/test_authenticate.rb +71 -0
  119. data/test/test_bad_links.rb +25 -0
  120. data/test/test_blank_form.rb +16 -0
  121. data/test/test_checkboxes.rb +61 -0
  122. data/test/test_content_type.rb +13 -0
  123. data/test/test_cookie_class.rb +338 -0
  124. data/test/test_cookie_jar.rb +362 -0
  125. data/test/test_cookies.rb +123 -0
  126. data/test/test_encoded_links.rb +20 -0
  127. data/test/test_errors.rb +49 -0
  128. data/test/test_follow_meta.rb +108 -0
  129. data/test/test_form_action.rb +44 -0
  130. data/test/test_form_as_hash.rb +61 -0
  131. data/test/test_form_button.rb +38 -0
  132. data/test/test_form_no_inputname.rb +15 -0
  133. data/test/test_forms.rb +564 -0
  134. data/test/test_frames.rb +25 -0
  135. data/test/test_get_headers.rb +52 -0
  136. data/test/test_gzipping.rb +22 -0
  137. data/test/test_hash_api.rb +45 -0
  138. data/test/test_history.rb +142 -0
  139. data/test/test_history_added.rb +16 -0
  140. data/test/test_html_unscape_forms.rb +39 -0
  141. data/test/test_if_modified_since.rb +20 -0
  142. data/test/test_keep_alive.rb +31 -0
  143. data/test/test_links.rb +120 -0
  144. data/test/test_mech.rb +268 -0
  145. data/test/test_mechanize_file.rb +47 -0
  146. data/test/test_meta.rb +65 -0
  147. data/test/test_multi_select.rb +106 -0
  148. data/test/test_no_attributes.rb +13 -0
  149. data/test/test_option.rb +18 -0
  150. data/test/test_page.rb +119 -0
  151. data/test/test_pluggable_parser.rb +145 -0
  152. data/test/test_post_form.rb +34 -0
  153. data/test/test_pretty_print.rb +22 -0
  154. data/test/test_radiobutton.rb +75 -0
  155. data/test/test_redirect_limit_reached.rb +41 -0
  156. data/test/test_redirect_verb_handling.rb +45 -0
  157. data/test/test_referer.rb +39 -0
  158. data/test/test_relative_links.rb +40 -0
  159. data/test/test_request.rb +13 -0
  160. data/test/test_response_code.rb +52 -0
  161. data/test/test_save_file.rb +48 -0
  162. data/test/test_scheme.rb +48 -0
  163. data/test/test_select.rb +106 -0
  164. data/test/test_select_all.rb +15 -0
  165. data/test/test_select_none.rb +15 -0
  166. data/test/test_select_noopts.rb +16 -0
  167. data/test/test_set_fields.rb +44 -0
  168. data/test/test_ssl_server.rb +20 -0
  169. data/test/test_subclass.rb +14 -0
  170. data/test/test_textarea.rb +45 -0
  171. data/test/test_upload.rb +109 -0
  172. data/test/test_verbs.rb +25 -0
  173. metadata +314 -0
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class TestHashApi < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ end
7
+
8
+ def test_title
9
+ page = @agent.get(:url => "http://localhost/file_upload.html")
10
+ assert_equal('File Upload Form', page.title)
11
+ end
12
+
13
+ def test_page_gets_yielded
14
+ pages = nil
15
+ @agent.get(:url => "http://localhost/file_upload.html") { |page|
16
+ pages = page
17
+ }
18
+ assert pages
19
+ assert_equal('File Upload Form', pages.title)
20
+ end
21
+
22
+ def test_get_with_params
23
+ page = @agent.get(:url => 'http://localhost/', :params => { :q => 'hello' })
24
+ assert_equal('http://localhost/?q=hello', page.uri.to_s)
25
+ end
26
+
27
+ def test_get_with_referer
28
+ request = nil
29
+ @agent.pre_connect_hooks << lambda { |params|
30
+ request = params[:request]
31
+ }
32
+
33
+ @agent.get( :url => 'http://localhost/',
34
+ :referer => URI.parse('http://google.com/')
35
+ )
36
+
37
+ assert request
38
+ assert_equal 'http://google.com/', request['Referer']
39
+
40
+ @agent.get( :url => 'http://localhost/',
41
+ :params => [],
42
+ :referer => 'http://tenderlovemaking.com/')
43
+ assert_equal 'http://tenderlovemaking.com/', request['Referer']
44
+ end
45
+ end
@@ -0,0 +1,142 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class TestHistory < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ @history = WWW::Mechanize::History.new
7
+ end
8
+
9
+ def test_push
10
+ assert_equal(0, @history.length)
11
+
12
+ page = @agent.get("http://localhost/tc_bad_links.html")
13
+ x = @history.push(page)
14
+ assert_equal(x, @history)
15
+ assert_equal(1, @history.length)
16
+ assert(@history.visited?(page))
17
+ assert(@history.visited?(page.uri))
18
+ assert(@history.visited?(page.uri.to_s))
19
+ assert_equal(page, @history.visited_page(page))
20
+ assert_equal(page, @history.visited_page(page.uri))
21
+ assert_equal(page, @history.visited_page(page.uri.to_s))
22
+
23
+ @history.push(@agent.get("/tc_bad_links.html"))
24
+ assert_equal(2, @history.length)
25
+ end
26
+
27
+ def test_shift
28
+ assert_equal(0, @history.length)
29
+ page = @agent.get("http://localhost/tc_bad_links.html")
30
+ @history.push(page)
31
+ assert_equal(1, @history.length)
32
+
33
+ @history.push(@agent.get("/tc_bad_links.html"))
34
+ assert_equal(2, @history.length)
35
+
36
+ @history.push(@agent.get("/index.html"))
37
+ assert_equal(3, @history.length)
38
+
39
+ page2 = @history.shift
40
+ assert_equal(page, page2)
41
+ assert_equal(2, @history.length)
42
+
43
+ @history.shift
44
+ assert_equal(1, @history.length)
45
+ assert_equal(false, @history.visited?(page))
46
+
47
+ @history.shift
48
+ assert_equal(0, @history.length)
49
+
50
+ assert_nil(@history.shift)
51
+ assert_equal(0, @history.length)
52
+ end
53
+
54
+ def test_pop
55
+ assert_equal(0, @history.length)
56
+ page = @agent.get("http://localhost/tc_bad_links.html")
57
+ @history.push(page)
58
+ assert_equal(1, @history.length)
59
+
60
+ page2 = @agent.get("/index.html")
61
+ @history.push(page2)
62
+ assert_equal(2, @history.length)
63
+ assert_equal(page2, @history.pop)
64
+ assert_equal(1, @history.length)
65
+ assert_equal(true, @history.visited?(page))
66
+ assert_equal(false, @history.visited?(page2))
67
+ assert_equal(page, @history.pop)
68
+ assert_equal(0, @history.length)
69
+ assert_equal(false, @history.visited?(page))
70
+ assert_equal(false, @history.visited?(page2))
71
+ assert_nil(@history.pop)
72
+ end
73
+
74
+ def test_max_size
75
+ @history = WWW::Mechanize::History.new(10)
76
+ 1.upto(20) do |i|
77
+ page = @agent.get('http://localhost/index.html')
78
+ @history.push page
79
+ assert_equal(true, @history.visited?(page))
80
+ if i < 10
81
+ assert_equal(i, @history.length)
82
+ else
83
+ assert_equal(10, @history.length)
84
+ end
85
+ end
86
+
87
+ @history.clear
88
+ @history.max_size = 5
89
+ 1.upto(20) do |i|
90
+ page = @agent.get('http://localhost/index.html')
91
+ @history.push page
92
+ assert_equal(true, @history.visited?(page))
93
+ if i < 5
94
+ assert_equal(i, @history.length)
95
+ else
96
+ assert_equal(5, @history.length)
97
+ end
98
+ end
99
+
100
+ @history.max_size = 0
101
+ 1.upto(20) do |i|
102
+ page = @agent.get('http://localhost/index.html')
103
+ @history.push page
104
+ assert_equal(false, @history.visited?(page))
105
+ assert_equal(0, @history.length)
106
+ end
107
+ end
108
+
109
+ def test_no_slash
110
+ page = @agent.get('http://localhost')
111
+
112
+ node = Struct.new(:href, :inner_text).new('http://localhost/', 'blah')
113
+ link = WWW::Mechanize::Page::Link.new(node, nil, nil)
114
+ assert(@agent.visited?(link))
115
+
116
+ node = Struct.new(:href, :inner_text).new('http://localhost', 'blah')
117
+ link = WWW::Mechanize::Page::Link.new(node, nil, nil)
118
+ assert(@agent.visited?(link))
119
+ end
120
+
121
+ def test_with_slash
122
+ page = @agent.get('http://localhost/')
123
+
124
+ node = Struct.new(:href, :inner_text).new('http://localhost/', 'blah')
125
+ link = WWW::Mechanize::Page::Link.new(node, nil, nil)
126
+ assert(@agent.visited?(link))
127
+
128
+ node = Struct.new(:href, :inner_text).new('http://localhost', 'blah')
129
+ link = WWW::Mechanize::Page::Link.new(node, nil, nil)
130
+ assert(@agent.visited?(link))
131
+ end
132
+
133
+ def test_clear
134
+ page = nil
135
+ 20.times { @history.push(page = @agent.get('http://localhost/index.html')) }
136
+ assert_equal(20, @history.length)
137
+ assert_equal(true, @history.visited?(page))
138
+ @history.clear
139
+ assert_equal(0, @history.length)
140
+ assert_equal(false, @history.visited?(page))
141
+ end
142
+ end
@@ -0,0 +1,16 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class HistoryAddedTest < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ end
7
+
8
+ def test_history_added_gets_called
9
+ onload = 0
10
+ @agent.history_added = lambda { |page|
11
+ onload += 1
12
+ }
13
+ page = @agent.get('http://localhost/tc_blank_form.html')
14
+ assert_equal(1, onload)
15
+ end
16
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class TestCheckBoxes < Test::Unit::TestCase
4
+ def test_field
5
+ f = WWW::Mechanize::Form::Field.new('a&amp;b', 'a&amp;b')
6
+ assert_equal('a&b', f.name)
7
+ assert_equal('a&b', f.value)
8
+
9
+ f = WWW::Mechanize::Form::Field.new('a&b', 'a&b')
10
+ assert_equal('a&b', f.name)
11
+ assert_equal('a&b', f.value)
12
+
13
+ f = WWW::Mechanize::Form::Field.new('a&#38;b', 'a&#38;b')
14
+ assert_equal('a&b', f.name)
15
+ assert_equal('a&b', f.value)
16
+ end
17
+
18
+ def test_file_upload
19
+ f = WWW::Mechanize::Form::FileUpload.new('a&amp;b', 'a&amp;b')
20
+ assert_equal('a&b', f.name)
21
+ assert_equal('a&b', f.file_name)
22
+
23
+ f = WWW::Mechanize::Form::FileUpload.new('a&b', 'a&b')
24
+ assert_equal('a&b', f.name)
25
+ assert_equal('a&b', f.file_name)
26
+ end
27
+
28
+ def test_image_button
29
+ f = WWW::Mechanize::Form::ImageButton.new('a&amp;b', 'a&amp;b')
30
+ assert_equal('a&b', f.name)
31
+ assert_equal('a&b', f.value)
32
+ end
33
+
34
+ def test_radio_button
35
+ f = WWW::Mechanize::Form::RadioButton.new('a&amp;b', 'a&amp;b', nil, nil)
36
+ assert_equal('a&b', f.name)
37
+ assert_equal('a&b', f.value)
38
+ end
39
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class TestIfModifiedSince < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ end
7
+
8
+ def test_get_twice
9
+ assert_equal(0, @agent.history.length)
10
+ page = @agent.get('http://localhost/if_modified_since')
11
+ assert_match(/You did not send/, page.body)
12
+
13
+ assert_equal(1, @agent.history.length)
14
+ page2 = @agent.get('http://localhost/if_modified_since')
15
+
16
+ assert_equal(2, @agent.history.length)
17
+ assert_equal(page.object_id, page2.object_id)
18
+ assert_match(/You did not send/, page.body)
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class TestKeepAlive < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ end
7
+
8
+ def test_keep_alive
9
+ page = @agent.get('http://localhost/http_headers')
10
+ headers = {}
11
+ page.body.split(/[\r\n]+/).each do |header|
12
+ headers.[]=(*header.chomp.split(/\|/))
13
+ end
14
+ assert(headers.has_key?('connection'))
15
+ assert_equal('keep-alive', headers['connection'])
16
+ assert(headers.has_key?('keep-alive'))
17
+ assert_equal('300', headers['keep-alive'])
18
+ end
19
+
20
+ def test_close_connection
21
+ @agent.keep_alive = false
22
+ page = @agent.get('http://localhost/http_headers')
23
+ headers = {}
24
+ page.body.split(/[\r\n]+/).each do |header|
25
+ headers.[]=(*header.chomp.split(/\|/))
26
+ end
27
+ assert(headers.has_key?('connection'))
28
+ assert_equal('close', headers['connection'])
29
+ assert(!headers.has_key?('keep-alive'))
30
+ end
31
+ end
@@ -0,0 +1,120 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class LinksMechTest < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ end
7
+
8
+ def test_unsupported_link_types
9
+ page = @agent.get("http://google.com/tc_links.html")
10
+ link = page.link_with(:text => 'javascript link')
11
+ assert_raise(WWW::Mechanize::UnsupportedSchemeError) {
12
+ link.click
13
+ }
14
+
15
+ @agent.scheme_handlers['javascript'] = lambda { |my_link, my_page|
16
+ URI.parse('http://localhost/tc_links.html')
17
+ }
18
+ assert_nothing_raised {
19
+ link.click
20
+ }
21
+ end
22
+
23
+ def test_link_with_no_path
24
+ page = @agent.get("http://localhost/relative/tc_relative_links.html")
25
+ page = page.link_with(:text => 'just the query string').click
26
+ assert_equal('http://localhost/relative/tc_relative_links.html?a=b', page.uri.to_s)
27
+ end
28
+
29
+ def test_base
30
+ page = @agent.get("http://google.com/tc_base_link.html")
31
+ page = page.links.first.click
32
+ assert @agent.visited?("http://localhost/index.html")
33
+ end
34
+
35
+ def test_find_meta
36
+ page = @agent.get("http://localhost/find_link.html")
37
+ assert_equal(3, page.meta.length)
38
+ assert_equal(%w{
39
+ http://www.drphil.com/
40
+ http://www.upcase.com/
41
+ http://tenderlovemaking.com/ }.sort,
42
+ page.meta.map { |x| x.href.downcase }.sort)
43
+ end
44
+
45
+ def test_find_link
46
+ page = @agent.get("http://localhost/find_link.html")
47
+ assert_equal(18, page.links.length)
48
+ end
49
+
50
+ def test_alt_text
51
+ page = @agent.get("http://localhost/alt_text.html")
52
+ assert_equal(5, page.links.length)
53
+ assert_equal(1, page.meta.length)
54
+
55
+ assert_equal('', page.meta.first.text)
56
+ assert_equal('alt text', page.link_with(:href => 'alt_text.html').text)
57
+ assert_equal('', page.link_with(:href => 'no_alt_text.html').text)
58
+ assert_equal('no image', page.link_with(:href => 'no_image.html').text)
59
+ assert_equal('', page.link_with(:href => 'no_text.html').text)
60
+ assert_equal('', page.link_with(:href => 'nil_alt_text.html').text)
61
+ end
62
+
63
+ def test_click_link
64
+ @agent.user_agent_alias = 'Mac Safari'
65
+ page = @agent.get("http://localhost/frame_test.html")
66
+ link = page.link_with(:text => "Form Test")
67
+ assert_not_nil(link)
68
+ assert_equal('Form Test', link.text)
69
+ page = @agent.click(link)
70
+ assert_equal("http://localhost/form_test.html",
71
+ @agent.history.last.uri.to_s)
72
+ end
73
+
74
+ def test_click_method
75
+ page = @agent.get("http://localhost/frame_test.html")
76
+ link = page.link_with(:text => "Form Test")
77
+ assert_not_nil(link)
78
+ assert_equal('Form Test', link.text)
79
+ page = link.click
80
+ assert_equal("http://localhost/form_test.html",
81
+ @agent.history.last.uri.to_s)
82
+ end
83
+
84
+ def test_find_bold_link
85
+ page = @agent.get("http://localhost/tc_links.html")
86
+ link = page.links_with(:text => /Bold Dude/)
87
+ assert_equal(1, link.length)
88
+ assert_equal('Bold Dude', link.first.text)
89
+
90
+ link = page.links_with(:text => 'Aaron James Patterson')
91
+ assert_equal(1, link.length)
92
+ assert_equal('Aaron James Patterson', link.first.text)
93
+
94
+ link = page.links_with(:text => 'Aaron Patterson')
95
+ assert_equal(1, link.length)
96
+ assert_equal('Aaron Patterson', link.first.text)
97
+
98
+ link = page.links_with(:text => 'Ruby Rocks!')
99
+ assert_equal(1, link.length)
100
+ assert_equal('Ruby Rocks!', link.first.text)
101
+ end
102
+
103
+ def test_link_with_encoded_space
104
+ page = @agent.get("http://localhost/tc_links.html")
105
+ link = page.link_with(:text => 'encoded space')
106
+ page = @agent.click link
107
+ end
108
+
109
+ def test_link_with_space
110
+ page = @agent.get("http://localhost/tc_links.html")
111
+ link = page.link_with(:text => 'not encoded space')
112
+ page = @agent.click link
113
+ end
114
+
115
+ def test_link_with_unusual_characters
116
+ page = @agent.get("http://localhost/tc_links.html")
117
+ link = page.link_with(:text => 'unusual characters')
118
+ assert_nothing_raised { @agent.click link }
119
+ end
120
+ end
data/test/test_mech.rb ADDED
@@ -0,0 +1,268 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "helper"))
2
+
3
+ class TestMechMethods < Test::Unit::TestCase
4
+ def setup
5
+ @agent = WWW::Mechanize.new
6
+ end
7
+
8
+ def test_get_with_tilde
9
+ page = @agent.get('http://localhost/?foo=~2')
10
+ assert_equal('http://localhost/?foo=~2', page.uri.to_s)
11
+ end
12
+
13
+ def test_parser_can_be_set
14
+ @agent.html_parser = {}
15
+ assert_raises(NoMethodError) {
16
+ @agent.get('http://localhost/?foo=~2').links
17
+ }
18
+ end
19
+
20
+ def test_submit_takes_arbirary_headers
21
+ page = @agent.get('http://localhost:2000/form_no_action.html')
22
+ assert form = page.forms.first
23
+ form.action = '/http_headers'
24
+ page = @agent.submit(form, nil, { 'foo' => 'bar' })
25
+ headers = Hash[*(
26
+ page.body.split("\n").map { |x| x.split('|') }.flatten
27
+ )]
28
+ assert_equal 'bar', headers['foo']
29
+ end
30
+
31
+ def test_get_with_params
32
+ page = @agent.get('http://localhost/', { :q => 'hello' })
33
+ assert_equal('http://localhost/?q=hello', page.uri.to_s)
34
+ end
35
+
36
+ def test_get_with_upper_http
37
+ page = @agent.get('HTTP://localhost/', { :q => 'hello' })
38
+ assert_equal('HTTP://localhost/?q=hello', page.uri.to_s)
39
+ end
40
+
41
+ def test_get_no_referer
42
+ requests = []
43
+ @agent.pre_connect_hooks << lambda { |params|
44
+ requests << params[:request]
45
+ }
46
+
47
+ @agent.get('http://localhost/')
48
+ @agent.get('http://localhost/')
49
+ assert_equal(2, requests.length)
50
+ requests.each do |request|
51
+ assert_nil request['referer']
52
+ end
53
+ end
54
+
55
+ def test_with_anchor
56
+ page = @agent.get('http://localhost/?foo=bar&#34;')
57
+ assert_equal('http://localhost/?foo=bar%22', page.uri.to_s)
58
+ end
59
+
60
+ def test_post_connect_hook_gets_called
61
+ response = nil
62
+ @agent.post_connect_hooks << lambda { |params|
63
+ response = params[:response]
64
+ }
65
+
66
+ @agent.get('http://localhost/')
67
+ assert(response)
68
+ end
69
+
70
+ def test_get_with_referer
71
+ request = nil
72
+ @agent.pre_connect_hooks << lambda { |params|
73
+ request = params[:request]
74
+ }
75
+
76
+ @agent.get('http://localhost/', URI.parse('http://google.com/'))
77
+ assert_equal 'http://google.com/', request['Referer']
78
+
79
+ @agent.get('http://localhost/', [], 'http://tenderlovemaking.com/')
80
+ assert_equal 'http://tenderlovemaking.com/', request['Referer']
81
+ end
82
+
83
+ def test_get_with_file_referer
84
+ assert_nothing_raised do
85
+ @agent.get('http://localhost', [], WWW::Mechanize::File.new(URI.parse('http://tenderlovemaking.com/crossdomain.xml')))
86
+ end
87
+ end
88
+
89
+ def test_weird_url
90
+ assert_nothing_raised {
91
+ @agent.get('http://localhost/?action=bing&bang=boom=1|a=|b=|c=')
92
+ }
93
+ assert_nothing_raised {
94
+ @agent.get('http://localhost/?a=b&#038;b=c&#038;c=d')
95
+ }
96
+ assert_nothing_raised {
97
+ @agent.get("http://localhost/?a=#{[0xd6].pack('U')}")
98
+ }
99
+ end
100
+
101
+ unless RUBY_VERSION >= '1.9.0'
102
+ def test_kcode_url
103
+ $KCODE = 'u'
104
+ page = @agent.get("http://localhost/?a=#{[0xd6].pack('U')}")
105
+ assert_not_nil(page)
106
+ assert_equal('http://localhost/?a=%D6', page.uri.to_s)
107
+ $KCODE = 'NONE'
108
+ end
109
+ end
110
+
111
+ def test_history
112
+ 0.upto(25) do |i|
113
+ assert_equal(i, @agent.history.size)
114
+ page = @agent.get("http://localhost/")
115
+ end
116
+ page = @agent.get("http://localhost/form_test.html")
117
+
118
+ assert_equal("http://localhost/form_test.html",
119
+ @agent.history.last.uri.to_s)
120
+ assert_equal("http://localhost/",
121
+ @agent.history[-2].uri.to_s)
122
+ assert_equal("http://localhost/",
123
+ @agent.history[-2].uri.to_s)
124
+
125
+ assert_equal(true, @agent.visited?("http://localhost/"))
126
+ assert_equal(true, @agent.visited?("/form_test.html"))
127
+ assert_equal(false, @agent.visited?("http://google.com/"))
128
+ assert_equal(true, @agent.visited?(page.links.first))
129
+
130
+ end
131
+
132
+ def test_visited
133
+ @agent.get("http://localhost/content_type_test?ct=application/pdf")
134
+ assert_equal(true,
135
+ @agent.visited?("http://localhost/content_type_test?ct=application/pdf"))
136
+ assert_equal(false,
137
+ @agent.visited?("http://localhost/content_type_test"))
138
+ assert_equal(false,
139
+ @agent.visited?("http://localhost/content_type_test?ct=text/html"))
140
+ end
141
+
142
+ def test_visited_after_redirect
143
+ @agent.get("http://localhost/response_code?code=302")
144
+ assert_equal("http://localhost/index.html",
145
+ @agent.current_page.uri.to_s)
146
+ assert_equal(true,
147
+ @agent.visited?('http://localhost/response_code?code=302'))
148
+ end
149
+
150
+ def test_max_history
151
+ @agent.max_history = 10
152
+ 0.upto(10) do |i|
153
+ assert_equal(i, @agent.history.size)
154
+ page = @agent.get("http://localhost/")
155
+ end
156
+
157
+ 0.upto(10) do |i|
158
+ assert_equal(10, @agent.history.size)
159
+ page = @agent.get("http://localhost/")
160
+ end
161
+ end
162
+
163
+ def test_max_history_order
164
+ @agent.max_history = 2
165
+ assert_equal(0, @agent.history.length)
166
+
167
+ @agent.get('http://localhost/form_test.html')
168
+ assert_equal(1, @agent.history.length)
169
+
170
+ @agent.get('http://localhost/empty_form.html')
171
+ assert_equal(2, @agent.history.length)
172
+
173
+ @agent.get('http://localhost/tc_checkboxes.html')
174
+ assert_equal(2, @agent.history.length)
175
+ assert_equal('http://localhost/empty_form.html', @agent.history[0].uri.to_s)
176
+ assert_equal('http://localhost/tc_checkboxes.html',
177
+ @agent.history[1].uri.to_s)
178
+ end
179
+
180
+ def test_back_button
181
+ 0.upto(5) do |i|
182
+ assert_equal(i, @agent.history.size)
183
+ page = @agent.get("http://localhost/")
184
+ end
185
+ page = @agent.get("http://localhost/form_test.html")
186
+
187
+ assert_equal("http://localhost/form_test.html",
188
+ @agent.history.last.uri.to_s)
189
+ assert_equal("http://localhost/",
190
+ @agent.history[-2].uri.to_s)
191
+
192
+ assert_equal(7, @agent.history.size)
193
+ @agent.back
194
+ assert_equal(6, @agent.history.size)
195
+ assert_equal("http://localhost/",
196
+ @agent.history.last.uri.to_s)
197
+ end
198
+
199
+ def test_google
200
+ page = @agent.get("http://localhost/google.html")
201
+ search = page.forms.find { |f| f.name == "f" }
202
+ assert_not_nil(search)
203
+ assert_not_nil(search.field_with(:name => 'q'))
204
+ assert_not_nil(search.field_with(:name => 'hl'))
205
+ assert_not_nil(search.fields.find { |f| f.name == 'ie' })
206
+ end
207
+
208
+ def test_click
209
+ @agent.user_agent_alias = 'Mac Safari'
210
+ page = @agent.get("http://localhost/frame_test.html")
211
+ link = page.link_with(:text => "Form Test")
212
+ assert_not_nil(link)
213
+ page = @agent.click(link)
214
+ assert_equal("http://localhost/form_test.html",
215
+ @agent.history.last.uri.to_s)
216
+ end
217
+
218
+ def test_click_hpricot
219
+ page = @agent.get("http://localhost/frame_test.html")
220
+
221
+ link = (page/"//a[@class='bar']").first
222
+ assert_not_nil(link)
223
+ page = @agent.click(link)
224
+ assert_equal("http://localhost/form_test.html",
225
+ @agent.history.last.uri.to_s)
226
+ end
227
+
228
+ def test_click_hpricot_frame
229
+ page = @agent.get("http://localhost/frame_test.html")
230
+
231
+ link = (page/"//frame[@name='frame2']").first
232
+ assert_not_nil(link)
233
+ page = @agent.click(link)
234
+ assert_equal("http://localhost/form_test.html",
235
+ @agent.history.last.uri.to_s)
236
+ end
237
+
238
+ def test_new_find
239
+ page = @agent.get("http://localhost/frame_test.html")
240
+ assert_equal(3, page.frames.size)
241
+
242
+ find_orig = page.frames.find_all { |f| f.name == 'frame1' }
243
+ find1 = page.frames_with(:name => 'frame1')
244
+
245
+ find_orig.zip(find1).each { |a,b|
246
+ assert_equal(a, b)
247
+ }
248
+ end
249
+
250
+ def test_get_file
251
+ page = @agent.get("http://localhost/frame_test.html")
252
+ content_length = page.header['Content-Length']
253
+ page_as_string = @agent.get_file("http://localhost/frame_test.html")
254
+ assert_equal(content_length.to_i, page_as_string.length.to_i)
255
+ end
256
+
257
+ def test_transact
258
+ page = @agent.get("http://localhost/frame_test.html")
259
+ assert_equal(1, @agent.history.length)
260
+ @agent.transact { |a|
261
+ 5.times {
262
+ @agent.get("http://localhost/frame_test.html")
263
+ }
264
+ assert_equal(6, @agent.history.length)
265
+ }
266
+ assert_equal(1, @agent.history.length)
267
+ end
268
+ end