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.
- data/.document +4 -0
- data/.gitignore +15 -0
- data/History.txt +413 -0
- data/MIT-LICENSE.txt +19 -0
- data/README.rdoc +85 -0
- data/Rakefile +188 -0
- data/VERSION +1 -0
- data/install.rb +1 -0
- data/lib/webrat/adapters/mechanize.rb +78 -0
- data/lib/webrat/adapters/merb.rb +11 -0
- data/lib/webrat/adapters/rack.rb +25 -0
- data/lib/webrat/adapters/rails.rb +81 -0
- data/lib/webrat/adapters/sinatra.rb +9 -0
- data/lib/webrat/core/configuration.rb +92 -0
- data/lib/webrat/core/elements/area.rb +31 -0
- data/lib/webrat/core/elements/element.rb +33 -0
- data/lib/webrat/core/elements/field.rb +487 -0
- data/lib/webrat/core/elements/form.rb +103 -0
- data/lib/webrat/core/elements/label.rb +31 -0
- data/lib/webrat/core/elements/link.rb +93 -0
- data/lib/webrat/core/elements/select_option.rb +48 -0
- data/lib/webrat/core/locators/area_locator.rb +38 -0
- data/lib/webrat/core/locators/button_locator.rb +54 -0
- data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
- data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
- data/lib/webrat/core/locators/field_locator.rb +25 -0
- data/lib/webrat/core/locators/field_named_locator.rb +41 -0
- data/lib/webrat/core/locators/form_locator.rb +19 -0
- data/lib/webrat/core/locators/label_locator.rb +34 -0
- data/lib/webrat/core/locators/link_locator.rb +74 -0
- data/lib/webrat/core/locators/locator.rb +20 -0
- data/lib/webrat/core/locators/select_option_locator.rb +59 -0
- data/lib/webrat/core/locators.rb +20 -0
- data/lib/webrat/core/logging.rb +23 -0
- data/lib/webrat/core/matchers/have_content.rb +68 -0
- data/lib/webrat/core/matchers/have_selector.rb +74 -0
- data/lib/webrat/core/matchers/have_tag.rb +21 -0
- data/lib/webrat/core/matchers/have_xpath.rb +122 -0
- data/lib/webrat/core/matchers.rb +4 -0
- data/lib/webrat/core/methods.rb +64 -0
- data/lib/webrat/core/mime.rb +18 -0
- data/lib/webrat/core/save_and_open_page.rb +48 -0
- data/lib/webrat/core/scope.rb +365 -0
- data/lib/webrat/core/session.rb +306 -0
- data/lib/webrat/core/xml.rb +72 -0
- data/lib/webrat/core.rb +13 -0
- data/lib/webrat/core_extensions/blank.rb +58 -0
- data/lib/webrat/core_extensions/deprecate.rb +8 -0
- data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
- data/lib/webrat/core_extensions/meta_class.rb +6 -0
- data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
- data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
- data/lib/webrat/integrations/merb.rb +10 -0
- data/lib/webrat/integrations/rails.rb +25 -0
- data/lib/webrat/integrations/rspec-rails.rb +10 -0
- data/lib/webrat/integrations/selenium.rb +11 -0
- data/lib/webrat/merb.rb +9 -0
- data/lib/webrat/rspec-rails.rb +2 -0
- data/lib/webrat/selenium/application_server_factory.rb +40 -0
- data/lib/webrat/selenium/application_servers/base.rb +54 -0
- data/lib/webrat/selenium/application_servers/external.rb +26 -0
- data/lib/webrat/selenium/application_servers/merb.rb +50 -0
- data/lib/webrat/selenium/application_servers/rails.rb +67 -0
- data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
- data/lib/webrat/selenium/application_servers.rb +5 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
- data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -0
- data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
- data/lib/webrat/selenium/matchers/have_content.rb +66 -0
- data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
- data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
- data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
- data/lib/webrat/selenium/matchers.rb +4 -0
- data/lib/webrat/selenium/selenium_extensions.js +6 -0
- data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
- data/lib/webrat/selenium/selenium_session.rb +272 -0
- data/lib/webrat/selenium/silence_stream.rb +18 -0
- data/lib/webrat/selenium.rb +70 -0
- data/lib/webrat.rb +18 -0
- data/spec/fakes/test_adapter.rb +37 -0
- data/spec/integration/mechanize/Rakefile +7 -0
- data/spec/integration/mechanize/config.ru +2 -0
- data/spec/integration/mechanize/sample_app.rb +20 -0
- data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
- data/spec/integration/mechanize/spec/spec_helper.rb +27 -0
- data/spec/integration/merb/.gitignore +21 -0
- data/spec/integration/merb/Rakefile +35 -0
- data/spec/integration/merb/app/controllers/application.rb +2 -0
- data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
- data/spec/integration/merb/app/controllers/testing.rb +27 -0
- data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
- data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
- data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
- data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
- data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
- data/spec/integration/merb/config/environments/development.rb +15 -0
- data/spec/integration/merb/config/environments/rake.rb +11 -0
- data/spec/integration/merb/config/environments/test.rb +14 -0
- data/spec/integration/merb/config/init.rb +25 -0
- data/spec/integration/merb/config/rack.rb +11 -0
- data/spec/integration/merb/config/router.rb +34 -0
- data/spec/integration/merb/spec/spec.opts +1 -0
- data/spec/integration/merb/spec/spec_helper.rb +26 -0
- data/spec/integration/merb/spec/webrat_spec.rb +39 -0
- data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
- data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
- data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
- data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
- data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
- data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
- data/spec/integration/rack/Rakefile +5 -0
- data/spec/integration/rack/app.rb +89 -0
- data/spec/integration/rack/test/helper.rb +21 -0
- data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
- data/spec/integration/rails/.gitignore +3 -0
- data/spec/integration/rails/Rakefile +30 -0
- data/spec/integration/rails/app/controllers/application.rb +15 -0
- data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
- data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
- data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
- data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
- data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
- data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
- data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
- data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
- data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
- data/spec/integration/rails/app/views/links/show.html.erb +5 -0
- data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
- data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
- data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
- data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
- data/spec/integration/rails/config/boot.rb +109 -0
- data/spec/integration/rails/config/environment.rb +12 -0
- data/spec/integration/rails/config/environments/development.rb +17 -0
- data/spec/integration/rails/config/environments/selenium.rb +22 -0
- data/spec/integration/rails/config/environments/test.rb +22 -0
- data/spec/integration/rails/config/initializers/inflections.rb +10 -0
- data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
- data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
- data/spec/integration/rails/config/locales/en.yml +5 -0
- data/spec/integration/rails/config/routes.rb +19 -0
- data/spec/integration/rails/public/404.html +30 -0
- data/spec/integration/rails/public/422.html +30 -0
- data/spec/integration/rails/public/500.html +33 -0
- data/spec/integration/rails/script/about +4 -0
- data/spec/integration/rails/script/console +3 -0
- data/spec/integration/rails/script/dbconsole +3 -0
- data/spec/integration/rails/script/destroy +3 -0
- data/spec/integration/rails/script/generate +3 -0
- data/spec/integration/rails/script/performance/benchmarker +3 -0
- data/spec/integration/rails/script/performance/profiler +3 -0
- data/spec/integration/rails/script/performance/request +3 -0
- data/spec/integration/rails/script/plugin +3 -0
- data/spec/integration/rails/script/process/inspector +3 -0
- data/spec/integration/rails/script/process/reaper +3 -0
- data/spec/integration/rails/script/process/spawner +3 -0
- data/spec/integration/rails/script/runner +3 -0
- data/spec/integration/rails/script/server +3 -0
- data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
- data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
- data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
- data/spec/integration/rails/test/integration/webrat_test.rb +122 -0
- data/spec/integration/rails/test/test_helper.rb +26 -0
- data/spec/integration/sinatra/Rakefile +5 -0
- data/spec/integration/sinatra/classic_app.rb +64 -0
- data/spec/integration/sinatra/modular_app.rb +16 -0
- data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
- data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
- data/spec/integration/sinatra/test/test_helper.rb +17 -0
- data/spec/private/core/configuration_spec.rb +87 -0
- data/spec/private/core/field_spec.rb +85 -0
- data/spec/private/core/link_spec.rb +24 -0
- data/spec/private/core/session_spec.rb +200 -0
- data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -0
- data/spec/private/nokogiri_spec.rb +77 -0
- data/spec/private/rails/attaches_file_spec.rb +81 -0
- data/spec/private/rails/rails_adapter_spec.rb +86 -0
- data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
- data/spec/public/basic_auth_spec.rb +24 -0
- data/spec/public/check_spec.rb +191 -0
- data/spec/public/choose_spec.rb +118 -0
- data/spec/public/click_area_spec.rb +106 -0
- data/spec/public/click_button_spec.rb +494 -0
- data/spec/public/click_link_spec.rb +511 -0
- data/spec/public/fill_in_spec.rb +224 -0
- data/spec/public/locators/field_by_xpath_spec.rb +19 -0
- data/spec/public/locators/field_labeled_spec.rb +172 -0
- data/spec/public/locators/field_with_id_spec.rb +16 -0
- data/spec/public/matchers/contain_spec.rb +114 -0
- data/spec/public/matchers/have_selector_spec.rb +146 -0
- data/spec/public/matchers/have_tag_spec.rb +39 -0
- data/spec/public/matchers/have_xpath_spec.rb +136 -0
- data/spec/public/reload_spec.rb +10 -0
- data/spec/public/save_and_open_spec.rb +70 -0
- data/spec/public/select_date_spec.rb +112 -0
- data/spec/public/select_datetime_spec.rb +137 -0
- data/spec/public/select_spec.rb +455 -0
- data/spec/public/select_time_spec.rb +100 -0
- data/spec/public/selenium/application_server_factory_spec.rb +49 -0
- data/spec/public/selenium/application_servers/external_spec.rb +12 -0
- data/spec/public/selenium/selenium_session_spec.rb +37 -0
- data/spec/public/set_hidden_field_spec.rb +5 -0
- data/spec/public/submit_form_spec.rb +5 -0
- data/spec/public/visit_spec.rb +58 -0
- data/spec/public/within_spec.rb +177 -0
- data/spec/rcov.opts +1 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +54 -0
- data/vendor/selenium-server.jar +0 -0
- 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
|