thoughtbot-webrat 0.7.2.pre

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 (215) hide show
  1. data/.document +4 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +13 -0
  4. data/History.txt +450 -0
  5. data/MIT-LICENSE.txt +19 -0
  6. data/README.rdoc +85 -0
  7. data/Rakefile +143 -0
  8. data/Thorfile +118 -0
  9. data/install.rb +1 -0
  10. data/lib/webrat.rb +18 -0
  11. data/lib/webrat/adapters/mechanize.rb +94 -0
  12. data/lib/webrat/adapters/merb.rb +11 -0
  13. data/lib/webrat/adapters/rack.rb +29 -0
  14. data/lib/webrat/adapters/rails.rb +77 -0
  15. data/lib/webrat/adapters/sinatra.rb +9 -0
  16. data/lib/webrat/core.rb +13 -0
  17. data/lib/webrat/core/configuration.rb +114 -0
  18. data/lib/webrat/core/elements/area.rb +31 -0
  19. data/lib/webrat/core/elements/element.rb +33 -0
  20. data/lib/webrat/core/elements/field.rb +438 -0
  21. data/lib/webrat/core/elements/form.rb +127 -0
  22. data/lib/webrat/core/elements/label.rb +31 -0
  23. data/lib/webrat/core/elements/link.rb +93 -0
  24. data/lib/webrat/core/elements/select_option.rb +48 -0
  25. data/lib/webrat/core/locators.rb +20 -0
  26. data/lib/webrat/core/locators/area_locator.rb +38 -0
  27. data/lib/webrat/core/locators/button_locator.rb +54 -0
  28. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  29. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  30. data/lib/webrat/core/locators/field_locator.rb +25 -0
  31. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  32. data/lib/webrat/core/locators/form_locator.rb +19 -0
  33. data/lib/webrat/core/locators/label_locator.rb +34 -0
  34. data/lib/webrat/core/locators/link_locator.rb +74 -0
  35. data/lib/webrat/core/locators/locator.rb +20 -0
  36. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  37. data/lib/webrat/core/logging.rb +23 -0
  38. data/lib/webrat/core/matchers.rb +4 -0
  39. data/lib/webrat/core/matchers/have_content.rb +68 -0
  40. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  41. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  42. data/lib/webrat/core/matchers/have_xpath.rb +125 -0
  43. data/lib/webrat/core/methods.rb +64 -0
  44. data/lib/webrat/core/mime.rb +18 -0
  45. data/lib/webrat/core/save_and_open_page.rb +28 -0
  46. data/lib/webrat/core/scope.rb +366 -0
  47. data/lib/webrat/core/session.rb +303 -0
  48. data/lib/webrat/core/xml.rb +72 -0
  49. data/lib/webrat/core_extensions/blank.rb +58 -0
  50. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  51. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  52. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  53. data/lib/webrat/core_extensions/nil_to_query_string.rb +5 -0
  54. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  55. data/lib/webrat/integrations/merb.rb +10 -0
  56. data/lib/webrat/integrations/rails.rb +25 -0
  57. data/lib/webrat/integrations/rspec-rails.rb +11 -0
  58. data/lib/webrat/integrations/selenium.rb +11 -0
  59. data/lib/webrat/merb.rb +9 -0
  60. data/lib/webrat/rspec-rails.rb +2 -0
  61. data/lib/webrat/selenium.rb +70 -0
  62. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  63. data/lib/webrat/selenium/application_servers.rb +5 -0
  64. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  65. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  66. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  67. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  68. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  69. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  70. data/lib/webrat/selenium/location_strategy_javascript/label.js +48 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  72. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  73. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  74. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  75. data/lib/webrat/selenium/matchers.rb +4 -0
  76. data/lib/webrat/selenium/matchers/have_content.rb +78 -0
  77. data/lib/webrat/selenium/matchers/have_selector.rb +57 -0
  78. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  79. data/lib/webrat/selenium/matchers/have_xpath.rb +53 -0
  80. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  81. data/lib/webrat/selenium/selenium_rc_server.rb +89 -0
  82. data/lib/webrat/selenium/selenium_session.rb +272 -0
  83. data/lib/webrat/selenium/silence_stream.rb +18 -0
  84. data/spec/fakes/test_adapter.rb +33 -0
  85. data/spec/integration/mechanize/Rakefile +7 -0
  86. data/spec/integration/mechanize/config.ru +2 -0
  87. data/spec/integration/mechanize/sample_app.rb +35 -0
  88. data/spec/integration/mechanize/spec/mechanize_spec.rb +30 -0
  89. data/spec/integration/mechanize/spec/spec_helper.rb +29 -0
  90. data/spec/integration/merb/.gitignore +21 -0
  91. data/spec/integration/merb/Rakefile +35 -0
  92. data/spec/integration/merb/app/controllers/application.rb +2 -0
  93. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  94. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  95. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  96. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  97. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  98. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  99. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  100. data/spec/integration/merb/config/environments/development.rb +15 -0
  101. data/spec/integration/merb/config/environments/rake.rb +11 -0
  102. data/spec/integration/merb/config/environments/test.rb +14 -0
  103. data/spec/integration/merb/config/init.rb +25 -0
  104. data/spec/integration/merb/config/rack.rb +11 -0
  105. data/spec/integration/merb/config/router.rb +34 -0
  106. data/spec/integration/merb/spec/spec.opts +1 -0
  107. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  108. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  109. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  110. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  111. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  112. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  113. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  114. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  115. data/spec/integration/rack/Rakefile +5 -0
  116. data/spec/integration/rack/app.rb +89 -0
  117. data/spec/integration/rack/test/helper.rb +20 -0
  118. data/spec/integration/rack/test/webrat_rack_test.rb +74 -0
  119. data/spec/integration/rails/.gitignore +3 -0
  120. data/spec/integration/rails/Rakefile +30 -0
  121. data/spec/integration/rails/app/controllers/application_controller.rb +15 -0
  122. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  123. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  124. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  125. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  126. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  127. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  128. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  129. data/spec/integration/rails/app/views/buttons/show.html.erb +9 -0
  130. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  131. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  132. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  133. data/spec/integration/rails/app/views/webrat/buttons.html.erb +9 -0
  134. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  135. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  136. data/spec/integration/rails/config/boot.rb +109 -0
  137. data/spec/integration/rails/config/environment.rb +12 -0
  138. data/spec/integration/rails/config/environments/development.rb +17 -0
  139. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  140. data/spec/integration/rails/config/environments/test.rb +22 -0
  141. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  142. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  143. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  144. data/spec/integration/rails/config/locales/en.yml +5 -0
  145. data/spec/integration/rails/config/routes.rb +19 -0
  146. data/spec/integration/rails/public/404.html +30 -0
  147. data/spec/integration/rails/public/422.html +30 -0
  148. data/spec/integration/rails/public/500.html +33 -0
  149. data/spec/integration/rails/script/about +4 -0
  150. data/spec/integration/rails/script/console +3 -0
  151. data/spec/integration/rails/script/dbconsole +3 -0
  152. data/spec/integration/rails/script/destroy +3 -0
  153. data/spec/integration/rails/script/generate +3 -0
  154. data/spec/integration/rails/script/performance/benchmarker +3 -0
  155. data/spec/integration/rails/script/performance/profiler +3 -0
  156. data/spec/integration/rails/script/performance/request +3 -0
  157. data/spec/integration/rails/script/plugin +3 -0
  158. data/spec/integration/rails/script/process/inspector +3 -0
  159. data/spec/integration/rails/script/process/reaper +3 -0
  160. data/spec/integration/rails/script/process/spawner +3 -0
  161. data/spec/integration/rails/script/runner +3 -0
  162. data/spec/integration/rails/script/server +3 -0
  163. data/spec/integration/rails/test/integration/button_click_test.rb +66 -0
  164. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  165. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  166. data/spec/integration/rails/test/integration/webrat_test.rb +123 -0
  167. data/spec/integration/rails/test/test_helper.rb +27 -0
  168. data/spec/integration/sinatra/Rakefile +5 -0
  169. data/spec/integration/sinatra/classic_app.rb +63 -0
  170. data/spec/integration/sinatra/modular_app.rb +15 -0
  171. data/spec/integration/sinatra/test/classic_app_test.rb +38 -0
  172. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  173. data/spec/integration/sinatra/test/test_helper.rb +16 -0
  174. data/spec/private/core/configuration_spec.rb +87 -0
  175. data/spec/private/core/field_spec.rb +83 -0
  176. data/spec/private/core/form_spec.rb +51 -0
  177. data/spec/private/core/link_spec.rb +24 -0
  178. data/spec/private/core/session_spec.rb +182 -0
  179. data/spec/private/mechanize/mechanize_adapter_spec.rb +96 -0
  180. data/spec/private/nokogiri_spec.rb +77 -0
  181. data/spec/private/rails/attaches_file_spec.rb +114 -0
  182. data/spec/private/rails/rails_adapter_spec.rb +79 -0
  183. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  184. data/spec/public/basic_auth_spec.rb +35 -0
  185. data/spec/public/check_spec.rb +191 -0
  186. data/spec/public/choose_spec.rb +118 -0
  187. data/spec/public/click_area_spec.rb +106 -0
  188. data/spec/public/click_button_spec.rb +494 -0
  189. data/spec/public/click_link_spec.rb +532 -0
  190. data/spec/public/fill_in_spec.rb +224 -0
  191. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  192. data/spec/public/locators/field_labeled_spec.rb +172 -0
  193. data/spec/public/locators/field_with_id_spec.rb +16 -0
  194. data/spec/public/matchers/contain_spec.rb +133 -0
  195. data/spec/public/matchers/have_selector_spec.rb +146 -0
  196. data/spec/public/matchers/have_tag_spec.rb +39 -0
  197. data/spec/public/matchers/have_xpath_spec.rb +154 -0
  198. data/spec/public/reload_spec.rb +10 -0
  199. data/spec/public/save_and_open_spec.rb +49 -0
  200. data/spec/public/select_date_spec.rb +112 -0
  201. data/spec/public/select_datetime_spec.rb +137 -0
  202. data/spec/public/select_spec.rb +474 -0
  203. data/spec/public/select_time_spec.rb +100 -0
  204. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  205. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  206. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  207. data/spec/public/set_hidden_field_spec.rb +5 -0
  208. data/spec/public/submit_form_spec.rb +56 -0
  209. data/spec/public/visit_spec.rb +58 -0
  210. data/spec/public/within_spec.rb +177 -0
  211. data/spec/rcov.opts +1 -0
  212. data/spec/spec.opts +2 -0
  213. data/spec/spec_helper.rb +53 -0
  214. data/vendor/selenium-server.jar +0 -0
  215. metadata +424 -0
@@ -0,0 +1,532 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe "click_link" do
4
+ it "should click links with ampertands" do
5
+ with_html <<-HTML
6
+ <html>
7
+ <a href="/page">Save &amp; go back</a>
8
+ </html>
9
+ HTML
10
+ webrat_session.should_receive(:get).with("/page", {})
11
+ click_link "Save & go back"
12
+ end
13
+
14
+ it "should use get by default" do
15
+ with_html <<-HTML
16
+ <html>
17
+ <a href="/page">Link text</a>
18
+ </html>
19
+ HTML
20
+ webrat_session.should_receive(:get).with("/page", {})
21
+ click_link "Link text"
22
+ end
23
+
24
+ it "should click get links" do
25
+ with_html <<-HTML
26
+ <html>
27
+ <a href="/page">Link text</a>
28
+ </html>
29
+ HTML
30
+ webrat_session.should_receive(:get).with("/page", {})
31
+ click_link "Link text", :method => :get
32
+ end
33
+
34
+ it "should click link on substring" do
35
+ with_html <<-HTML
36
+ <html>
37
+ <a href="/page">Link text</a>
38
+ </html>
39
+ HTML
40
+ webrat_session.should_receive(:get).with("/page", {})
41
+ click_link "ink tex", :method => :get
42
+ end
43
+
44
+ it "should click delete links" do
45
+ with_html <<-HTML
46
+ <html>
47
+ <a href="/page">Link text</a>
48
+ </html>
49
+ HTML
50
+ webrat_session.should_receive(:delete).with("/page", {})
51
+ click_link "Link text", :method => :delete
52
+ end
53
+
54
+
55
+ it "should click post links" do
56
+ with_html <<-HTML
57
+ <html>
58
+ <a href="/page">Link text</a>
59
+ </html>
60
+ HTML
61
+ webrat_session.should_receive(:post).with("/page", {})
62
+ click_link "Link text", :method => :post
63
+ end
64
+
65
+ it "should click put links" do
66
+ with_html <<-HTML
67
+ <html>
68
+ <a href="/page">Link text</a>
69
+ </html>
70
+ HTML
71
+ webrat_session.should_receive(:put).with("/page", {})
72
+ click_link "Link text", :method => :put
73
+ end
74
+
75
+ it "should click links by regexp" do
76
+ with_html <<-HTML
77
+ <html>
78
+ <a href="/page">Link text</a>
79
+ </html>
80
+ HTML
81
+ webrat_session.should_receive(:get).with("/page", {})
82
+ click_link /link [a-z]/i
83
+ end
84
+
85
+ it "should click links by id" do
86
+ with_html <<-HTML
87
+ <html>
88
+ <a id="link_text_link" href="/page">Link text</a>
89
+ </html>
90
+ HTML
91
+ webrat_session.should_receive(:get).with("/page", {})
92
+ click_link "link_text_link"
93
+ end
94
+
95
+ it "should click links by id regexp" do
96
+ with_html <<-HTML
97
+ <html>
98
+ <a id="link_text_link" href="/page">Link text</a>
99
+ </html>
100
+ HTML
101
+ webrat_session.should_receive(:get).with("/page", {})
102
+ click_link /_text_/
103
+ end
104
+
105
+ it "should click links by title" do
106
+ with_html <<-HTML
107
+ <html>
108
+ <a title="piddle" href="/page">Link text</a>
109
+ </html>
110
+ HTML
111
+ webrat_session.should_receive(:get).with("/page", {})
112
+ click_link 'piddle'
113
+ end
114
+
115
+ it "should click links by title regex" do
116
+ with_html <<-HTML
117
+ <html>
118
+ <a title="piddlediddle" href="/page">Link text</a>
119
+ </html>
120
+ HTML
121
+ webrat_session.should_receive(:get).with("/page", {})
122
+ click_link /iddle/
123
+ end
124
+
125
+
126
+ it "should click rails javascript links with authenticity tokens" do
127
+ with_html <<-HTML
128
+ <html>
129
+ <a href="/posts" onclick="var f = document.createElement('form');
130
+ f.style.display = 'none';
131
+ this.parentNode.appendChild(f);
132
+ f.method = 'POST';
133
+ f.action = this.href;
134
+ var s = document.createElement('input');
135
+ s.setAttribute('type', 'hidden');
136
+ s.setAttribute('name', 'authenticity_token');
137
+ s.setAttribute('value', 'aa79cb354597a60a3786e7e291ed4f74d77d3a62');
138
+ f.appendChild(s);
139
+ f.submit();
140
+ return false;">Posts</a>
141
+ </html>
142
+ HTML
143
+ webrat_session.should_receive(:post).with("/posts", "authenticity_token" => "aa79cb354597a60a3786e7e291ed4f74d77d3a62")
144
+ click_link "Posts"
145
+ end
146
+
147
+ it "should click rails 2.3.4 javascript links with authenticity tokens" do
148
+ with_html <<-HTML
149
+ <html>
150
+ <a href="/posts" onclick="var f = document.createElement('form');
151
+ f.style.display = 'none';
152
+ this.parentNode.appendChild(f);
153
+ f.method = 'POST';
154
+ f.action = this.href;
155
+ var s = document.createElement('input');
156
+ s.setAttribute('type', 'hidden');
157
+ s.setAttribute('name', 'authenticity_token');
158
+ s.setAttribute('value', 'aa79cb354597a60a3786e7e291ed4f74d77d3a62=/$a');
159
+ f.appendChild(s);
160
+ f.submit();
161
+ return false;">Posts</a>
162
+ </html>
163
+ HTML
164
+ webrat_session.should_receive(:post).with("/posts", "authenticity_token" => "aa79cb354597a60a3786e7e291ed4f74d77d3a62=/$a")
165
+ click_link "Posts"
166
+ end
167
+
168
+ it "should click rails javascript delete links" do
169
+ with_html <<-HTML
170
+ <html>
171
+ <a href="/posts/1" onclick="var f = document.createElement('form');
172
+ f.style.display = 'none';
173
+ this.parentNode.appendChild(f);
174
+ f.method = 'POST';
175
+ f.action = this.href;
176
+ var m = document.createElement('input');
177
+ m.setAttribute('type', 'hidden');
178
+ m.setAttribute('name', '_method');
179
+ m.setAttribute('value', 'delete');
180
+ f.appendChild(m);
181
+ f.submit();
182
+ return false;">Delete</a>
183
+ </html>
184
+ HTML
185
+ webrat_session.should_receive(:delete).with("/posts/1", {})
186
+ click_link "Delete"
187
+ end
188
+
189
+ it "should click rails javascript post links" do
190
+ with_html <<-HTML
191
+ <html>
192
+ <a href="/posts" onclick="var f = document.createElement('form');
193
+ f.style.display = 'none';
194
+ this.parentNode.appendChild(f);
195
+ f.method = 'POST';
196
+ f.action = this.href;
197
+ f.submit();
198
+ return false;">Posts</a>
199
+ </html>
200
+ HTML
201
+ webrat_session.should_receive(:post).with("/posts", {})
202
+ click_link "Posts"
203
+ end
204
+
205
+ it "should click rails javascript post links without javascript" do
206
+ with_html <<-HTML
207
+ <html>
208
+ <a href="/posts" onclick="var f = document.createElement('form');
209
+ f.style.display = 'none';
210
+ this.parentNode.appendChild(f);
211
+ f.method = 'POST';
212
+ f.action = this.href;
213
+ f.submit();
214
+ return false;">Posts</a>
215
+ </html>
216
+ HTML
217
+ webrat_session.should_receive(:get).with("/posts", {})
218
+ click_link "Posts", :javascript => false
219
+ end
220
+
221
+ it "should click rails javascript post links" do
222
+ with_html <<-HTML
223
+ <html>
224
+ <a href="/posts" onclick="var f = document.createElement('form');
225
+ f.style.display = 'none';
226
+ this.parentNode.appendChild(f);
227
+ f.method = 'POST';
228
+ f.action = this.href;
229
+ var m = document.createElement('input');
230
+ m.setAttribute('type', 'hidden');
231
+ m.setAttribute('name', '_method');
232
+ m.setAttribute('value', 'post');
233
+ f.appendChild(m);
234
+ f.submit();
235
+ return false;">Post</a></h2>
236
+ </html>
237
+ HTML
238
+ webrat_session.should_receive(:post).with("/posts", {})
239
+ click_link "Post"
240
+ end
241
+
242
+ it "should click rails javascript put links" do
243
+ with_html <<-HTML
244
+ <html>
245
+ <a href="/posts" onclick="var f = document.createElement('form');
246
+ f.style.display = 'none';
247
+ this.parentNode.appendChild(f);
248
+ f.method = 'POST';
249
+ f.action = this.href;
250
+ var m = document.createElement('input');
251
+ m.setAttribute('type', 'hidden');
252
+ m.setAttribute('name', '_method');
253
+ m.setAttribute('value', 'put');
254
+ f.appendChild(m);
255
+ f.submit();
256
+ return false;">Put</a></h2>
257
+ </html>
258
+ HTML
259
+ webrat_session.should_receive(:put).with("/posts", {})
260
+ click_link "Put"
261
+ end
262
+
263
+ it "should fail if the javascript link doesn't have a value for the _method input" do
264
+ with_html <<-HTML
265
+ <html>
266
+ <a href="/posts/1" onclick="var f = document.createElement('form');
267
+ f.style.display = 'none';
268
+ this.parentNode.appendChild(f);
269
+ f.method = 'POST';
270
+ f.action = this.href;
271
+ var m = document.createElement('input');
272
+ m.setAttribute('type', 'hidden');
273
+ m.setAttribute('name', '_method');
274
+ f.appendChild(m);
275
+ f.submit();
276
+ return false;">Link</a>
277
+ </html>
278
+ HTML
279
+
280
+ lambda {
281
+ click_link "Link"
282
+ }.should raise_error(Webrat::WebratError)
283
+ end
284
+
285
+ it "should assert valid response" do
286
+ with_html <<-HTML
287
+ <html>
288
+ <a href="/page">Link text</a>
289
+ </html>
290
+ HTML
291
+ webrat_session.response_code = 501
292
+ lambda { click_link "Link text" }.should raise_error(Webrat::PageLoadError)
293
+ end
294
+
295
+ [200, 300, 400, 499].each do |status|
296
+ it "should consider the #{status} status code as success" do
297
+ with_html <<-HTML
298
+ <html>
299
+ <a href="/page">Link text</a>
300
+ </html>
301
+ HTML
302
+ webrat_session.stub!(:redirect? => false)
303
+ webrat_session.response_code = status
304
+ lambda { click_link "Link text" }.should_not raise_error
305
+ end
306
+ end
307
+
308
+ it "should fail is the link doesn't exist" do
309
+ with_html <<-HTML
310
+ <html>
311
+ <a href="/page">Link text</a>
312
+ </html>
313
+ HTML
314
+
315
+ lambda {
316
+ click_link "Missing link"
317
+ }.should raise_error(Webrat::NotFoundError)
318
+ end
319
+
320
+ it "should not be case sensitive" do
321
+ with_html <<-HTML
322
+ <html>
323
+ <a href="/page">Link text</a>
324
+ </html>
325
+ HTML
326
+ webrat_session.should_receive(:get).with("/page", {})
327
+ click_link "LINK TEXT"
328
+ end
329
+
330
+ it "should match link substrings" do
331
+ with_html <<-HTML
332
+ <html>
333
+ <a href="/page">This is some cool link text, isn't it?</a>
334
+ </html>
335
+ HTML
336
+ webrat_session.should_receive(:get).with("/page", {})
337
+ click_link "Link text"
338
+ end
339
+
340
+ it "should work with elements in the link" do
341
+ with_html <<-HTML
342
+ <html>
343
+ <a href="/page"><span>Link text</span></a>
344
+ </html>
345
+ HTML
346
+ webrat_session.should_receive(:get).with("/page", {})
347
+ click_link "Link text"
348
+ end
349
+
350
+ it "should match the first matching link" do
351
+ with_html <<-HTML
352
+ <html>
353
+ <a href="/page1">Link text</a>
354
+ <a href="/page2">Link text</a>
355
+ </html>
356
+ HTML
357
+ webrat_session.should_receive(:get).with("/page1", {})
358
+ click_link "Link text"
359
+ end
360
+
361
+ it "should choose the shortest link text match" do
362
+ with_html <<-HTML
363
+ <html>
364
+ <a href="/page1">Linkerama</a>
365
+ <a href="/page2">Link</a>
366
+ </html>
367
+ HTML
368
+
369
+ webrat_session.should_receive(:get).with("/page2", {})
370
+ click_link "Link"
371
+ end
372
+
373
+ it "should treat non-breaking spaces as spaces" do
374
+ with_html <<-HTML
375
+ <html>
376
+ <a href="/page1">This&nbsp;is&nbsp;a&nbsp;link</a>
377
+ </html>
378
+ HTML
379
+
380
+ webrat_session.should_receive(:get).with("/page1", {})
381
+ click_link "This is a link"
382
+ end
383
+
384
+ it "should not match on non-text contents" do
385
+ pending "needs fix" do
386
+ with_html <<-HTML
387
+ <html>
388
+ <a href="/page1"><span class="location">My house</span></a>
389
+ <a href="/page2">Location</a>
390
+ </html>
391
+ HTML
392
+
393
+ webrat_session.should_receive(:get).with("/page2", {})
394
+ click_link "Location"
395
+ end
396
+ end
397
+
398
+ it "should click link within a selector" do
399
+ with_html <<-HTML
400
+ <html>
401
+ <a href="/page1">Link</a>
402
+ <div id="container">
403
+ <a href="/page2">Link</a>
404
+ </div>
405
+ </html>
406
+ HTML
407
+
408
+ webrat_session.should_receive(:get).with("/page2", {})
409
+ click_link_within "#container", "Link"
410
+ end
411
+
412
+ it "should not make request when link is local anchor" do
413
+ with_html <<-HTML
414
+ <html>
415
+ <a href="#section-1">Jump to Section 1</a>
416
+ </html>
417
+ HTML
418
+ # Don't know why webrat_session.should_receive(:get).never doesn't work here
419
+ webrat_session.should_receive(:send).with('get_via_redirect', '#section-1', {}).never
420
+ click_link "Jump to Section 1"
421
+ end
422
+
423
+ it "should follow relative links" do
424
+ webrat_session.stub!(:current_url => "/page")
425
+ with_html <<-HTML
426
+ <html>
427
+ <a href="sub">Jump to sub page</a>
428
+ </html>
429
+ HTML
430
+ webrat_session.should_receive(:get).with("/page/sub", {})
431
+ click_link "Jump to sub page"
432
+ end
433
+
434
+ it "should follow fully qualified local links" do
435
+ webrat_session.stub!(:current_url => "/page")
436
+ with_html <<-HTML
437
+ <html>
438
+ <a href="http://subdomain.example.com/page/sub">Jump to sub page</a>
439
+ </html>
440
+ HTML
441
+ webrat_session.should_receive(:get).with("http://subdomain.example.com/page/sub", {})
442
+ click_link "Jump to sub page"
443
+ end
444
+
445
+ it "should follow fully qualified local links to example.com" do
446
+ with_html <<-HTML
447
+ <html>
448
+ <a href="http://www.example.com/page/sub">Jump to sub page</a>
449
+ </html>
450
+ HTML
451
+ webrat_session.should_receive(:get).with("http://www.example.com/page/sub", {})
452
+ click_link "Jump to sub page"
453
+ end
454
+
455
+ it "should follow query parameters" do
456
+ webrat_session.stub!(:current_url => "/page")
457
+ with_html <<-HTML
458
+ <html>
459
+ <a href="?foo=bar">Jump to foo bar</a>
460
+ </html>
461
+ HTML
462
+ webrat_session.should_receive(:get).with("/page?foo=bar", {})
463
+ click_link "Jump to foo bar"
464
+ end
465
+
466
+ it "should matches_text? on regexp" do
467
+ pending "need to update these"
468
+ link = Webrat::Link.new(webrat_session, nil)
469
+ link.should_receive(:text).and_return(@link_text_with_nbsp)
470
+ link.matches_text?(/link/i).should == 0
471
+ end
472
+
473
+ it "should matches_text? on link_text" do
474
+ pending "need to update these"
475
+ link = Webrat::Link.new(webrat_session, nil)
476
+ link.should_receive(:text).and_return(@link_text_with_nbsp)
477
+ link.matches_text?("Link Text").should == 0
478
+ end
479
+
480
+ it "should matches_text? on substring" do
481
+ pending "need to update these"
482
+ link = Webrat::Link.new(webrat_session, nil)
483
+ link.should_receive(:text).and_return(@link_text_with_nbsp)
484
+ link.matches_text?("nk Te").should_not be_nil
485
+ end
486
+
487
+ it "should not matches_text? on link_text case insensitive" do
488
+ pending "need to update these"
489
+ link = Webrat::Link.new(webrat_session, nil)
490
+ link.should_receive(:text).and_return(@link_text_with_nbsp)
491
+ link.should_receive(:inner_html).and_return('Link&nbsp;Text')
492
+ link.should_receive(:title).and_return(nil)
493
+ link.matches_text?("link_text").should == false
494
+ end
495
+
496
+ it "should match text not include &nbsp;" do
497
+ pending "need to update these"
498
+ link = Webrat::Link.new(webrat_session, nil)
499
+ link.should_receive(:text).and_return('LinkText')
500
+ link.matches_text?("LinkText").should == 0
501
+ end
502
+
503
+ it "should not matches_text? on wrong text" do
504
+ pending "need to update these"
505
+ link = Webrat::Link.new(webrat_session, nil)
506
+ nbsp = [0xA0].pack("U")
507
+ link.should_receive(:text).and_return("Some"+nbsp+"Other"+nbsp+"Link")
508
+ link.should_receive(:inner_html).and_return("Some&nbsp;Other&nbsp;Link")
509
+ link.should_receive(:title).and_return(nil)
510
+ link.matches_text?("Link Text").should == false
511
+ end
512
+
513
+ it "should match text including character reference" do
514
+ pending "need to update these"
515
+ no_ko_gi_ri = [0x30CE,0x30B3,0x30AE,0x30EA]
516
+ nokogiri_ja_kana = no_ko_gi_ri.pack("U*")
517
+ nokogiri_char_ref = no_ko_gi_ri.map{|c| "&#x%X;" % c }.join("")
518
+
519
+ link = Webrat::Link.new(webrat_session, nil)
520
+ link.should_receive(:text).and_return(nokogiri_ja_kana)
521
+ link.matches_text?(nokogiri_ja_kana).should == 0
522
+ end
523
+
524
+ it "should match img link" do
525
+ pending "need to update these"
526
+ link = Webrat::Link.new(webrat_session, nil)
527
+ link.should_receive(:text).and_return('')
528
+ link.should_receive(:inner_html).and_return('<img src="logo.png" />')
529
+ link.matches_text?('logo.png').should == 10
530
+ end
531
+
532
+ end