mkuklis-webrat 0.5.1

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 (213) hide show
  1. data/.document +4 -0
  2. data/.gitignore +15 -0
  3. data/History.txt +413 -0
  4. data/MIT-LICENSE.txt +19 -0
  5. data/README.rdoc +85 -0
  6. data/Rakefile +188 -0
  7. data/VERSION +1 -0
  8. data/install.rb +1 -0
  9. data/lib/webrat/adapters/mechanize.rb +78 -0
  10. data/lib/webrat/adapters/merb.rb +11 -0
  11. data/lib/webrat/adapters/rack.rb +25 -0
  12. data/lib/webrat/adapters/rails.rb +81 -0
  13. data/lib/webrat/adapters/sinatra.rb +9 -0
  14. data/lib/webrat/core/configuration.rb +92 -0
  15. data/lib/webrat/core/elements/area.rb +31 -0
  16. data/lib/webrat/core/elements/element.rb +33 -0
  17. data/lib/webrat/core/elements/field.rb +487 -0
  18. data/lib/webrat/core/elements/form.rb +103 -0
  19. data/lib/webrat/core/elements/label.rb +31 -0
  20. data/lib/webrat/core/elements/link.rb +93 -0
  21. data/lib/webrat/core/elements/select_option.rb +48 -0
  22. data/lib/webrat/core/locators/area_locator.rb +38 -0
  23. data/lib/webrat/core/locators/button_locator.rb +54 -0
  24. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  25. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  26. data/lib/webrat/core/locators/field_locator.rb +25 -0
  27. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  28. data/lib/webrat/core/locators/form_locator.rb +19 -0
  29. data/lib/webrat/core/locators/label_locator.rb +34 -0
  30. data/lib/webrat/core/locators/link_locator.rb +74 -0
  31. data/lib/webrat/core/locators/locator.rb +20 -0
  32. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  33. data/lib/webrat/core/locators.rb +20 -0
  34. data/lib/webrat/core/logging.rb +23 -0
  35. data/lib/webrat/core/matchers/have_content.rb +68 -0
  36. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  37. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  38. data/lib/webrat/core/matchers/have_xpath.rb +122 -0
  39. data/lib/webrat/core/matchers.rb +4 -0
  40. data/lib/webrat/core/methods.rb +64 -0
  41. data/lib/webrat/core/mime.rb +18 -0
  42. data/lib/webrat/core/save_and_open_page.rb +48 -0
  43. data/lib/webrat/core/scope.rb +365 -0
  44. data/lib/webrat/core/session.rb +306 -0
  45. data/lib/webrat/core/xml.rb +72 -0
  46. data/lib/webrat/core.rb +13 -0
  47. data/lib/webrat/core_extensions/blank.rb +58 -0
  48. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  49. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  50. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  51. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  52. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  53. data/lib/webrat/integrations/merb.rb +10 -0
  54. data/lib/webrat/integrations/rails.rb +25 -0
  55. data/lib/webrat/integrations/rspec-rails.rb +10 -0
  56. data/lib/webrat/integrations/selenium.rb +11 -0
  57. data/lib/webrat/merb.rb +9 -0
  58. data/lib/webrat/rspec-rails.rb +2 -0
  59. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  60. data/lib/webrat/selenium/application_servers/base.rb +54 -0
  61. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  62. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  63. data/lib/webrat/selenium/application_servers/rails.rb +67 -0
  64. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  65. data/lib/webrat/selenium/application_servers.rb +5 -0
  66. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  67. data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -0
  68. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  69. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  70. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  72. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  73. data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  74. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  75. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  76. data/lib/webrat/selenium/matchers.rb +4 -0
  77. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  78. data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
  79. data/lib/webrat/selenium/selenium_session.rb +272 -0
  80. data/lib/webrat/selenium/silence_stream.rb +18 -0
  81. data/lib/webrat/selenium.rb +70 -0
  82. data/lib/webrat.rb +18 -0
  83. data/spec/fakes/test_adapter.rb +37 -0
  84. data/spec/integration/mechanize/Rakefile +7 -0
  85. data/spec/integration/mechanize/config.ru +2 -0
  86. data/spec/integration/mechanize/sample_app.rb +20 -0
  87. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
  88. data/spec/integration/mechanize/spec/spec_helper.rb +27 -0
  89. data/spec/integration/merb/.gitignore +21 -0
  90. data/spec/integration/merb/Rakefile +35 -0
  91. data/spec/integration/merb/app/controllers/application.rb +2 -0
  92. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  93. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  94. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  95. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  96. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  97. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  98. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  99. data/spec/integration/merb/config/environments/development.rb +15 -0
  100. data/spec/integration/merb/config/environments/rake.rb +11 -0
  101. data/spec/integration/merb/config/environments/test.rb +14 -0
  102. data/spec/integration/merb/config/init.rb +25 -0
  103. data/spec/integration/merb/config/rack.rb +11 -0
  104. data/spec/integration/merb/config/router.rb +34 -0
  105. data/spec/integration/merb/spec/spec.opts +1 -0
  106. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  107. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  108. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  109. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  110. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  111. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  112. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  113. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  114. data/spec/integration/rack/Rakefile +5 -0
  115. data/spec/integration/rack/app.rb +89 -0
  116. data/spec/integration/rack/test/helper.rb +21 -0
  117. data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
  118. data/spec/integration/rails/.gitignore +3 -0
  119. data/spec/integration/rails/Rakefile +30 -0
  120. data/spec/integration/rails/app/controllers/application.rb +15 -0
  121. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  122. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  123. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  124. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  125. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  126. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  127. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  128. data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  129. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  130. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  131. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  132. data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  133. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  134. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  135. data/spec/integration/rails/config/boot.rb +109 -0
  136. data/spec/integration/rails/config/environment.rb +12 -0
  137. data/spec/integration/rails/config/environments/development.rb +17 -0
  138. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  139. data/spec/integration/rails/config/environments/test.rb +22 -0
  140. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  141. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  142. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  143. data/spec/integration/rails/config/locales/en.yml +5 -0
  144. data/spec/integration/rails/config/routes.rb +19 -0
  145. data/spec/integration/rails/public/404.html +30 -0
  146. data/spec/integration/rails/public/422.html +30 -0
  147. data/spec/integration/rails/public/500.html +33 -0
  148. data/spec/integration/rails/script/about +4 -0
  149. data/spec/integration/rails/script/console +3 -0
  150. data/spec/integration/rails/script/dbconsole +3 -0
  151. data/spec/integration/rails/script/destroy +3 -0
  152. data/spec/integration/rails/script/generate +3 -0
  153. data/spec/integration/rails/script/performance/benchmarker +3 -0
  154. data/spec/integration/rails/script/performance/profiler +3 -0
  155. data/spec/integration/rails/script/performance/request +3 -0
  156. data/spec/integration/rails/script/plugin +3 -0
  157. data/spec/integration/rails/script/process/inspector +3 -0
  158. data/spec/integration/rails/script/process/reaper +3 -0
  159. data/spec/integration/rails/script/process/spawner +3 -0
  160. data/spec/integration/rails/script/runner +3 -0
  161. data/spec/integration/rails/script/server +3 -0
  162. data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  163. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  164. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  165. data/spec/integration/rails/test/integration/webrat_test.rb +122 -0
  166. data/spec/integration/rails/test/test_helper.rb +26 -0
  167. data/spec/integration/sinatra/Rakefile +5 -0
  168. data/spec/integration/sinatra/classic_app.rb +64 -0
  169. data/spec/integration/sinatra/modular_app.rb +16 -0
  170. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  171. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  172. data/spec/integration/sinatra/test/test_helper.rb +17 -0
  173. data/spec/private/core/configuration_spec.rb +87 -0
  174. data/spec/private/core/field_spec.rb +85 -0
  175. data/spec/private/core/link_spec.rb +24 -0
  176. data/spec/private/core/session_spec.rb +200 -0
  177. data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -0
  178. data/spec/private/nokogiri_spec.rb +77 -0
  179. data/spec/private/rails/attaches_file_spec.rb +81 -0
  180. data/spec/private/rails/rails_adapter_spec.rb +86 -0
  181. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  182. data/spec/public/basic_auth_spec.rb +24 -0
  183. data/spec/public/check_spec.rb +191 -0
  184. data/spec/public/choose_spec.rb +118 -0
  185. data/spec/public/click_area_spec.rb +106 -0
  186. data/spec/public/click_button_spec.rb +494 -0
  187. data/spec/public/click_link_spec.rb +511 -0
  188. data/spec/public/fill_in_spec.rb +224 -0
  189. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  190. data/spec/public/locators/field_labeled_spec.rb +172 -0
  191. data/spec/public/locators/field_with_id_spec.rb +16 -0
  192. data/spec/public/matchers/contain_spec.rb +114 -0
  193. data/spec/public/matchers/have_selector_spec.rb +146 -0
  194. data/spec/public/matchers/have_tag_spec.rb +39 -0
  195. data/spec/public/matchers/have_xpath_spec.rb +136 -0
  196. data/spec/public/reload_spec.rb +10 -0
  197. data/spec/public/save_and_open_spec.rb +70 -0
  198. data/spec/public/select_date_spec.rb +112 -0
  199. data/spec/public/select_datetime_spec.rb +137 -0
  200. data/spec/public/select_spec.rb +455 -0
  201. data/spec/public/select_time_spec.rb +100 -0
  202. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  203. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  204. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  205. data/spec/public/set_hidden_field_spec.rb +5 -0
  206. data/spec/public/submit_form_spec.rb +5 -0
  207. data/spec/public/visit_spec.rb +58 -0
  208. data/spec/public/within_spec.rb +177 -0
  209. data/spec/rcov.opts +1 -0
  210. data/spec/spec.opts +2 -0
  211. data/spec/spec_helper.rb +54 -0
  212. data/vendor/selenium-server.jar +0 -0
  213. metadata +409 -0
@@ -0,0 +1,224 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe "fill_in" do
4
+ it "should work with textareas" do
5
+ with_html <<-HTML
6
+ <html>
7
+ <form method="post" action="/login">
8
+ <label for="user_text">User Text</label>
9
+ <textarea id="user_text" name="user[text]"></textarea>
10
+ <input type="submit" />
11
+ </form>
12
+ </html>
13
+ HTML
14
+ webrat_session.should_receive(:post).with("/login", "user" => {"text" => "filling text area"})
15
+ fill_in "User Text", :with => "filling text area"
16
+ click_button
17
+ end
18
+
19
+ it "should support multiline values" do
20
+ with_html <<-HTML
21
+ <html>
22
+ <form method="post" action="/login">
23
+ <label for="user_text">User Text</label>
24
+ <textarea id="user_text" name="user[text]"></textarea>
25
+ <input type="submit" />
26
+ </form>
27
+ </html>
28
+ HTML
29
+ webrat_session.should_receive(:post).with("/login", "user" => {"text" => "One\nTwo"})
30
+ fill_in "User Text", :with => "One\nTwo"
31
+ click_button
32
+ end
33
+
34
+ it "should work with password fields" do
35
+ with_html <<-HTML
36
+ <html>
37
+ <form method="post" action="/login">
38
+ <input id="user_text" name="user[text]" type="password" />
39
+ <input type="submit" />
40
+ </form>
41
+ </html>
42
+ HTML
43
+ webrat_session.should_receive(:post).with("/login", "user" => {"text" => "pass"})
44
+ fill_in "user_text", :with => "pass"
45
+ click_button
46
+ end
47
+
48
+ it "should fail if input not found" do
49
+ with_html <<-HTML
50
+ <html>
51
+ <form method="get" action="/login">
52
+ </form>
53
+ </html>
54
+ HTML
55
+
56
+ lambda { fill_in "Email", :with => "foo@example.com" }.should raise_error(Webrat::NotFoundError)
57
+ end
58
+
59
+ it "should fail if input is disabled" do
60
+ with_html <<-HTML
61
+ <html>
62
+ <form method="get" action="/login">
63
+ <label for="user_email">Email</label>
64
+ <input id="user_email" name="user[email]" type="text" disabled="disabled" />
65
+ <input type="submit" />
66
+ </form>
67
+ </html>
68
+ HTML
69
+
70
+ lambda { fill_in "Email", :with => "foo@example.com" }.should raise_error(Webrat::DisabledFieldError)
71
+ end
72
+
73
+ it "should allow overriding default form values" do
74
+ with_html <<-HTML
75
+ <html>
76
+ <form method="post" action="/login">
77
+ <label for="user_email">Email</label>
78
+ <input id="user_email" name="user[email]" value="test@example.com" type="text" />
79
+ <input type="submit" />
80
+ </form>
81
+ </html>
82
+ HTML
83
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
84
+ fill_in "user[email]", :with => "foo@example.com"
85
+ click_button
86
+ end
87
+
88
+ it "should choose the shortest label match" do
89
+ with_html <<-HTML
90
+ <html>
91
+ <form method="post" action="/login">
92
+ <label for="user_mail1">Some other mail</label>
93
+ <input id="user_mail1" name="user[mail1]" type="text" />
94
+ <label for="user_mail2">Some mail</label>
95
+ <input id="user_mail2" name="user[mail2]" type="text" />
96
+ <input type="submit" />
97
+ </form>
98
+ </html>
99
+ HTML
100
+
101
+ webrat_session.should_receive(:post).with("/login", "user" => {"mail1" => "", "mail2" => "value"})
102
+ fill_in "Some", :with => "value"
103
+ click_button
104
+ end
105
+
106
+ it "should choose the first label match if closest is a tie" do
107
+ with_html <<-HTML
108
+ <html>
109
+ <form method="post" action="/login">
110
+ <label for="user_mail1">Some mail one</label>
111
+ <input id="user_mail1" name="user[mail1]" type="text" />
112
+ <label for="user_mail2">Some mail two</label>
113
+ <input id="user_mail2" name="user[mail2]" type="text" />
114
+ <input type="submit" />
115
+ </form>
116
+ </html>
117
+ HTML
118
+
119
+ webrat_session.should_receive(:post).with("/login", "user" => {"mail1" => "value", "mail2" => ""})
120
+ fill_in "Some mail", :with => "value"
121
+ click_button
122
+ end
123
+
124
+ it "should anchor label matches to start of label" do
125
+ with_html <<-HTML
126
+ <html>
127
+ <form method="post" action="/login">
128
+ <label for="user_email">Some mail</label>
129
+ <input id="user_email" name="user[email]" value="test@example.com" type="text" />
130
+ </form>
131
+ </html>
132
+ HTML
133
+
134
+ lambda { fill_in "mail", :with => "value" }.should raise_error(Webrat::NotFoundError)
135
+ end
136
+
137
+ it "should anchor label matches to word boundaries" do
138
+ with_html <<-HTML
139
+ <html>
140
+ <form method="post" action="/login">
141
+ <label for="user_email">Emailtastic</label>
142
+ <input id="user_email" name="user[email]" value="test@example.com" type="text" />
143
+ </form>
144
+ </html>
145
+ HTML
146
+
147
+ lambda { fill_in "Email", :with => "value" }.should raise_error(Webrat::NotFoundError)
148
+ end
149
+
150
+ it "should work with inputs nested in labels" do
151
+ with_html <<-HTML
152
+ <html>
153
+ <form method="post" action="/login">
154
+ <label>
155
+ Email
156
+ <input id="user_email" name="user[email]" value="test@example.com" type="text" />
157
+ </label>
158
+ <input type="submit" />
159
+ </form>
160
+ </html>
161
+ HTML
162
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
163
+ fill_in "Email", :with => "foo@example.com"
164
+ click_button
165
+ end
166
+
167
+ it "should work with full input names" do
168
+ with_html <<-HTML
169
+ <html>
170
+ <form method="post" action="/login">
171
+ <input id="user_email" name="user[email]" type="text" />
172
+ <input type="submit" />
173
+ </form>
174
+ </html>
175
+ HTML
176
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
177
+ fill_in "user[email]", :with => "foo@example.com"
178
+ click_button
179
+ end
180
+
181
+ it "should work if the input type is not set" do
182
+ with_html <<-HTML
183
+ <html>
184
+ <form method="post" action="/login">
185
+ <input id="user_email" name="user[email]" />
186
+ <input type="submit" />
187
+ </form>
188
+ </html>
189
+ HTML
190
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
191
+ fill_in "user[email]", :with => "foo@example.com"
192
+ click_button
193
+ end
194
+
195
+ it "should work with symbols" do
196
+ with_html <<-HTML
197
+ <html>
198
+ <form method="post" action="/login">
199
+ <label for="user_email">Email</label>
200
+ <input id="user_email" name="user[email]" type="text" />
201
+ <input type="submit" />
202
+ </form>
203
+ </html>
204
+ HTML
205
+ webrat_session.should_receive(:post).with("/login", "user" => {"email" => "foo@example.com"})
206
+ fill_in :email, :with => "foo@example.com"
207
+ click_button
208
+ end
209
+
210
+ it "should escape field values" do
211
+ with_html <<-HTML
212
+ <html>
213
+ <form method="post" action="/users">
214
+ <label for="user_phone">Phone</label>
215
+ <input id="user_phone" name="user[phone]" type="text" />
216
+ <input type="submit" />
217
+ </form>
218
+ </html>
219
+ HTML
220
+ webrat_session.should_receive(:post).with("/users", "user" => {"phone" => "+1 22 33"})
221
+ fill_in 'Phone', :with => "+1 22 33"
222
+ click_button
223
+ end
224
+ end
@@ -0,0 +1,19 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+
4
+ describe "field_by_xpath" do
5
+ it "should work" do
6
+ with_html <<-HTML
7
+ <html>
8
+ <form>
9
+ <label for="element_42">The Label</label>
10
+ <input type="text" id="element_42">
11
+ </form>
12
+ </html>
13
+ HTML
14
+
15
+ field = field_by_xpath(".//input")
16
+ field.should_not be_nil
17
+ field.id.should == "element_42"
18
+ end
19
+ end
@@ -0,0 +1,172 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+
4
+ describe "field_labeled" do
5
+ class << self
6
+ def using_this_html html
7
+ before(:each) do
8
+ with_html(html)
9
+ end
10
+ end
11
+
12
+ def field_labeled(label)
13
+ @label = label
14
+ yield
15
+ end
16
+
17
+ def should_return_a type, opts
18
+ it "should return a textfield" do
19
+ field_labeled(opts[:for]).should be_an_instance_of(type)
20
+ end
21
+ end
22
+
23
+ def with_an_id_of id, opts
24
+ it "should return an element with the correct id" do
25
+ field_labeled(opts[:for]).should match_id(id)
26
+ end
27
+ end
28
+
29
+ def should_raise_error_matching regexp, opts
30
+ it "should raise with wrong label" do
31
+ lambda {
32
+ field_labeled(opts[:for])
33
+ }.should raise_error(regexp)
34
+ end
35
+ end
36
+ end
37
+
38
+ def match_id(id)
39
+ simple_matcher "element with id #{id.inspect}" do |element, matcher|
40
+ if id.is_a?(Regexp)
41
+ element.id =~ id
42
+ else
43
+ element.id == id.to_s
44
+ end
45
+ end
46
+ end
47
+
48
+ describe "finding a text field" do
49
+ using_this_html <<-HTML
50
+ <html>
51
+ <form>
52
+ <label for="element_42">The Label</label>
53
+ <input type="text" id="element_42">
54
+ </form>
55
+ </html>
56
+ HTML
57
+
58
+ should_return_a Webrat::TextField, :for => "The Label"
59
+ with_an_id_of "element_42", :for => "The Label"
60
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
61
+ end
62
+
63
+ describe "finding a hidden field" do
64
+ using_this_html <<-HTML
65
+ <html>
66
+ <form>
67
+ <label for="element_42">The Label</label>
68
+ <input type="hidden" id="element_42">
69
+ </form>
70
+ </html>
71
+ HTML
72
+
73
+ should_return_a Webrat::HiddenField, :for => "The Label"
74
+ with_an_id_of "element_42", :for => "The Label"
75
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
76
+ end
77
+
78
+ describe "finding a checkbox" do
79
+ using_this_html <<-HTML
80
+ <html>
81
+ <form>
82
+ <label for="element_42">The Label</label>
83
+ <input type="checkbox" id="element_42">
84
+ </form>
85
+ </html>
86
+ HTML
87
+
88
+ should_return_a Webrat::CheckboxField, :for => "The Label"
89
+ with_an_id_of "element_42", :for => "The Label"
90
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
91
+ end
92
+
93
+ describe "finding a radio button" do
94
+ using_this_html <<-HTML
95
+ <html>
96
+ <form>
97
+ <label for="element_42">The Label</label>
98
+ <input type="radio" id="element_42">
99
+ </form>
100
+ </html>
101
+ HTML
102
+
103
+ should_return_a Webrat::RadioField, :for => "The Label"
104
+ with_an_id_of "element_42", :for => "The Label"
105
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
106
+ end
107
+
108
+
109
+ describe "finding a text area" do
110
+ using_this_html <<-HTML
111
+ <html>
112
+ <form>
113
+ <label for="element_42">The Label</label>
114
+ <textarea id="element_42"></textarea>
115
+ </form>
116
+ </html>
117
+ HTML
118
+
119
+ should_return_a Webrat::TextareaField, :for => "The Label"
120
+ with_an_id_of "element_42", :for => "The Label"
121
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
122
+ end
123
+
124
+ describe "finding a field with it's label containing newlines" do
125
+ using_this_html <<-HTML
126
+ <html>
127
+ <form>
128
+ <label for="element_42">
129
+ A label with
130
+ <a>a link on it's own line</a>
131
+ </label>
132
+ <input type="text" id="element_42">
133
+ </form>
134
+ </html>
135
+ HTML
136
+
137
+ should_return_a Webrat::TextField, :for => "A label with a link on it's own line"
138
+ with_an_id_of "element_42", :for => "A label with a link on it's own line"
139
+ should_raise_error_matching /Could not find .* "Other Label"/, :for => "Other Label"
140
+ end
141
+
142
+ describe "finding a field when labels without fields also match" do
143
+ using_this_html <<-HTML
144
+ <html>
145
+ <label>The Label</label>
146
+ <form>
147
+ <label for="element_42">The Label</label>
148
+ <input type="text" id="element_42">
149
+ </form>
150
+ </html>
151
+ HTML
152
+
153
+ should_return_a Webrat::TextField, :for => "The Label"
154
+ with_an_id_of "element_42", :for => "The Label"
155
+ end
156
+
157
+ describe "finding a field whose label ends with an non word character" do
158
+ using_this_html <<-HTML
159
+ <html>
160
+ <form>
161
+ <label for="element_42">License #</label>
162
+ <input type="text" id="element_42">
163
+ </form>
164
+ </html>
165
+ HTML
166
+
167
+ should_return_a Webrat::TextField, :for => "License #"
168
+ with_an_id_of "element_42", :for => "License #"
169
+ should_raise_error_matching /Could not find .* "Other License #"/, :for => "Other License #"
170
+ end
171
+
172
+ end
@@ -0,0 +1,16 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+
4
+ describe "field_with_id" do
5
+ it "should work when there is a single quote in the ID" do
6
+ with_html <<-HTML
7
+ <html>
8
+ <form>
9
+ <input type="text" id="user's name">
10
+ </form>
11
+ </html>
12
+ HTML
13
+
14
+ field_with_id("user's name").id.should == "user's name"
15
+ end
16
+ end
@@ -0,0 +1,114 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "contain" do
4
+ include Webrat::Matchers
5
+
6
+ before(:each) do
7
+ @body = <<-HTML
8
+ <div id='main'>
9
+ <div class='inner'>hello, world!</div>
10
+ <h2>Welcome "Bryan"</h2>
11
+ <h3>Welcome 'Bryan'</h3>
12
+ <h4>Welcome 'Bryan"</h4>
13
+ <ul>
14
+ <li>First</li>
15
+ <li>Second</li>
16
+ </ul>
17
+ </div>
18
+ HTML
19
+ end
20
+
21
+ before(:each) do
22
+ @body = <<-EOF
23
+ <div id='main'>
24
+ <div class='inner'>hello, world!</div>
25
+ </div>
26
+ EOF
27
+ end
28
+
29
+ describe "#matches?" do
30
+ it "should call element#contains? when the argument is a string" do
31
+ @body.should contain("hello, world!")
32
+ end
33
+
34
+ it "should call element#matches? when the argument is a regular expression" do
35
+ @body.should contain(/hello, world/)
36
+ end
37
+ end
38
+
39
+ describe "asserts for contains," do
40
+ include Test::Unit::Assertions
41
+
42
+ before(:each) do
43
+ should_receive(:response_body).and_return @body
44
+ require 'test/unit'
45
+ end
46
+
47
+ describe "assert_contain" do
48
+ it "should pass when containing the text" do
49
+ assert_contain("hello, world")
50
+ end
51
+
52
+ it "should pass when containing the regexp" do
53
+ assert_contain(/hello, world/)
54
+ end
55
+
56
+ it "should throw an exception when the body doesnt contain the text" do
57
+ lambda {
58
+ assert_contain("monkeys")
59
+ }.should raise_error(AssertionFailedError)
60
+ end
61
+
62
+ it "should throw an exception when the body doesnt contain the regexp" do
63
+ lambda {
64
+ assert_contain(/monkeys/)
65
+ }.should raise_error(AssertionFailedError)
66
+ end
67
+ end
68
+
69
+ describe "assert_not_contain" do
70
+ it "should pass when not containing the text" do
71
+ assert_not_contain("monkeys")
72
+ end
73
+
74
+ it "should pass when not containing the regexp" do
75
+ assert_not_contain(/monkeys/)
76
+ end
77
+
78
+ it "should throw an exception when the body does contain the text" do
79
+ lambda {
80
+ assert_not_contain("hello, world")
81
+ }.should raise_error(AssertionFailedError)
82
+ end
83
+
84
+ it "should throw an exception when the body does contain the regexp" do
85
+ lambda {
86
+ assert_not_contain(/hello, world/)
87
+ }.should raise_error(AssertionFailedError)
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "#failure_message" do
93
+ it "should include the content string" do
94
+ hc = Webrat::Matchers::HasContent.new("hello, world!")
95
+ hc.matches?(@body)
96
+
97
+ hc.failure_message.should include("\"hello, world!\"")
98
+ end
99
+
100
+ it "should include the content regular expresson" do
101
+ hc = Webrat::Matchers::HasContent.new(/hello,\sworld!/)
102
+ hc.matches?(@body)
103
+
104
+ hc.failure_message.should include("/hello,\\sworld!/")
105
+ end
106
+
107
+ it "should include the element's inner content" do
108
+ hc = Webrat::Matchers::HasContent.new(/hello,\sworld!/)
109
+ hc.matches?(@body)
110
+
111
+ hc.failure_message.should include("hello, world!")
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,146 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "have_selector" do
4
+ include Webrat::Matchers
5
+
6
+ before(:each) do
7
+ @body = <<-HTML
8
+ <div id='main'>
9
+ <div class='inner'>hello, world!</div>
10
+ <h2>Welcome "Bryan"</h2>
11
+ <h3>Welcome 'Bryan'</h3>
12
+ <h4>Welcome 'Bryan"</h4>
13
+ <ul>
14
+ <li>First</li>
15
+ <li>Second</li>
16
+ <li><a href="http://example.org/">Third</a></li>
17
+ </ul>
18
+ </div>
19
+ HTML
20
+ end
21
+
22
+ it "should be able to match a CSS selector" do
23
+ @body.should have_selector("div")
24
+ end
25
+
26
+ it "should not match a CSS selector that does not exist" do
27
+ @body.should_not have_selector("p")
28
+ end
29
+
30
+ describe "specifying attributes" do
31
+ it "should be able to specify the attributes of the tag" do
32
+ @body.should have_selector("div", :class => "inner")
33
+ end
34
+ end
35
+
36
+ describe "specifying content" do
37
+ it "should be able to specify the content of the tag" do
38
+ @body.should have_selector("div", :content => "hello, world!")
39
+ end
40
+
41
+ it "should be able to specify the content of the tag with double quotes in it" do
42
+ @body.should have_selector("h2", :content => 'Welcome "Bryan"')
43
+ end
44
+
45
+ it "should be able to specify the content of the tag with single quotes in it" do
46
+ @body.should have_selector("h3", :content => "Welcome 'Bryan'")
47
+ end
48
+
49
+ it "should be able to specify the content of the tag with both kinds of quotes" do
50
+ @body.should have_selector("h4", :content => "Welcome 'Bryan\"")
51
+ end
52
+ end
53
+
54
+ describe "specifying counts" do
55
+ it "should be able to specify the number of occurences of the tag" do
56
+ @body.should have_selector("li", :count => 3)
57
+ end
58
+
59
+ it "should not match if the count is wrong" do
60
+ lambda {
61
+ @body.should have_selector("li", :count => 4)
62
+ }.should raise_error(Spec::Expectations::ExpectationNotMetError)
63
+ end
64
+
65
+ it "should convert a string to an integer for count" do
66
+ @body.should have_selector("li", :count => "3")
67
+ end
68
+ end
69
+
70
+ describe "specifying nested elements" do
71
+ it "should be able to loop over all the matched elements" do
72
+ @body.should have_selector("div") do |node|
73
+ node.first.name.should == "div"
74
+ end
75
+ end
76
+
77
+ it "should not match of any of the matchers in the block fail" do
78
+ lambda {
79
+ @body.should have_selector("div") do |node|
80
+ node.first.name.should == "p"
81
+ end
82
+ }.should raise_error(Spec::Expectations::ExpectationNotMetError)
83
+ end
84
+
85
+ it "should be able to use #have_selector in the block" do
86
+ @body.should have_selector("#main") do |node|
87
+ node.should have_selector(".inner")
88
+ end
89
+ end
90
+
91
+ it "should not match any parent tags in the block" do
92
+ lambda {
93
+ @body.should have_selector(".inner") do |node|
94
+ node.should have_selector("#main")
95
+ end
96
+ }.should raise_error(Spec::Expectations::ExpectationNotMetError)
97
+ end
98
+
99
+ it "should work with items that have multiple child nodes" do
100
+ @body.should have_selector("ul") do |n|
101
+ n.should have_selector("li", :content => "First")
102
+ n.should have_selector("li", :content => "Second")
103
+ end
104
+ end
105
+
106
+ it "should work with descendants of the matched elements" do
107
+ @body.should have_selector("ul") do |n|
108
+ n.should have_selector("a", :content => "Third")
109
+ end
110
+ end
111
+ end
112
+
113
+ describe "Test::Unit assertions" do
114
+ include Test::Unit::Assertions
115
+
116
+ before(:each) do
117
+ require 'test/unit'
118
+ should_receive(:response_body).and_return @body
119
+ end
120
+
121
+ describe "assert_have_selector" do
122
+ it "should pass when body contains the selection" do
123
+ assert_have_selector("div")
124
+ end
125
+
126
+ it "should throw an exception when the body doesnt have matching selection" do
127
+ lambda {
128
+ assert_have_selector("p")
129
+ }.should raise_error(AssertionFailedError)
130
+ end
131
+ end
132
+
133
+ describe "assert_have_not_selector" do
134
+ it "should pass when the body doesn't contan the selection" do
135
+ assert_have_no_selector("p")
136
+ end
137
+
138
+ it "should throw an exception when the body does contain the selection" do
139
+ lambda {
140
+ assert_have_no_selector("div")
141
+ }.should raise_error(AssertionFailedError)
142
+ end
143
+ end
144
+ end
145
+
146
+ end