rsel 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +22 -8
  3. data/docs/development.md +1 -0
  4. data/docs/history.md +11 -1
  5. data/docs/index.md +1 -0
  6. data/docs/scoping.md +1 -1
  7. data/docs/studying.md +76 -0
  8. data/lib/rsel/selenium_test.rb +505 -90
  9. data/lib/rsel/study_html.rb +198 -0
  10. data/lib/rsel/support.rb +105 -4
  11. data/rsel.gemspec +1 -1
  12. data/spec/spec_helper.rb +4 -22
  13. data/spec/st_alerts.rb +48 -0
  14. data/spec/st_browser_spec.rb +58 -0
  15. data/spec/st_buttons_spec.rb +95 -0
  16. data/spec/st_checkboxes_spec.rb +235 -0
  17. data/spec/st_conditionals_spec.rb +180 -0
  18. data/spec/st_dropdowns_spec.rb +140 -0
  19. data/spec/st_field_equals_among_spec.rb +48 -0
  20. data/spec/st_fields_equal_among_spec.rb +74 -0
  21. data/spec/st_fields_equal_spec.rb +90 -0
  22. data/spec/st_fields_spec.rb +167 -0
  23. data/spec/st_initialization_spec.rb +33 -0
  24. data/spec/st_links_spec.rb +84 -0
  25. data/spec/st_method_missing_spec.rb +59 -0
  26. data/spec/st_navigation_spec.rb +56 -0
  27. data/spec/st_radiobuttons_spec.rb +123 -0
  28. data/spec/st_respond_to_spec.rb +16 -0
  29. data/spec/st_scenario_spec.rb +26 -0
  30. data/spec/st_set_field_among_spec.rb +45 -0
  31. data/spec/st_set_field_spec.rb +842 -0
  32. data/spec/st_set_fields_among_spec.rb +74 -0
  33. data/spec/st_set_fields_spec.rb +97 -0
  34. data/spec/st_spec_helper.rb +43 -0
  35. data/spec/st_stop_on_failure_spec.rb +199 -0
  36. data/spec/st_tables_spec.rb +42 -0
  37. data/spec/st_temporal_visibility_spec.rb +122 -0
  38. data/spec/st_visibility_spec.rb +125 -0
  39. data/spec/st_waiting_spec.rb +37 -0
  40. data/spec/study_html_spec.rb +310 -0
  41. data/spec/support_spec.rb +163 -13
  42. data/test/server/README.txt +3 -0
  43. data/test/views/alert.erb +15 -0
  44. data/test/views/form.erb +6 -1
  45. data/test/views/index.erb +2 -0
  46. data/test/views/slowtext.erb +1 -1
  47. metadata +38 -9
  48. data/spec/selenium_test_spec.rb +0 -2656
@@ -0,0 +1,58 @@
1
+ require 'spec/st_spec_helper'
2
+
3
+ describe 'browser window' do
4
+ describe "#open_browser" do
5
+ it "raises StopTestCannotConnect if the connection fails" do
6
+ st = Rsel::SeleniumTest.new('bogus_host')
7
+ lambda do
8
+ st.open_browser
9
+ end.should raise_error(Rsel::StopTestCannotConnect)
10
+ end
11
+
12
+ # TODO: Find a cross-platform way of testing this
13
+ #it "uses the javascript-xpath library for *iexplore" do
14
+ #st = Rsel::SeleniumTest.new('localhost', :browser => '*iexplore')
15
+ #st.open_browser
16
+ #end
17
+
18
+ it "reports failure to connect to a bogus Selenium server" do
19
+ st = Rsel::SeleniumTest.new('http://localhost:8070', { :host => 'localhost', :port => '8070' })
20
+ lambda do
21
+ st.open_browser
22
+ end.should raise_error(Rsel::StopTestCannotConnect)
23
+ end
24
+
25
+ end
26
+
27
+ describe "#maximize_browser" do
28
+ it "returns true" do
29
+ st = Rsel::SeleniumTest.new('http://localhost:8070')
30
+ st.open_browser
31
+ st.maximize_browser.should be_true
32
+ st.close_browser
33
+ end
34
+ end
35
+
36
+ describe "#close_browser" do
37
+ before(:each) do
38
+ @st_temp = Rsel::SeleniumTest.new('http://localhost:8070/')
39
+ @st_temp.open_browser
40
+ end
41
+
42
+ it "returns true if there are no errors" do
43
+ @st_temp.close_browser('and show errors').should be_true
44
+ end
45
+
46
+ it "returns true if there are errors, but show_errors is unset" do
47
+ @st_temp.field_equals("Nonexistent field", "Nonexistent words")
48
+ @st_temp.close_browser('without showing errors').should be_true
49
+ end
50
+
51
+ it "raises StopTestStepFailed if there are errors and show_errors is set" do
52
+ @st_temp.field_equals("Nonexistent field", "Nonexistent words")
53
+ lambda do
54
+ @st_temp.close_browser('and show errors')
55
+ end.should raise_error(Rsel::StopTestStepFailed)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec/st_spec_helper'
2
+
3
+ describe 'buttons' do
4
+ before(:each) do
5
+ @st.visit("/form").should be_true
6
+ end
7
+
8
+ describe "#click_button" do
9
+ context "passes when" do
10
+ context "studying and " do
11
+ it "button exists and is enabled" do
12
+ @st.begin_study
13
+ @st.click_button("Submit person form").should be_true
14
+ @st.end_study
15
+ end
16
+
17
+ it "button exists within scope" do
18
+ @st.begin_study
19
+ @st.click_button("Submit person form", :within => "person_form").should be_true
20
+ @st.end_study
21
+ end
22
+ end
23
+
24
+ it "button exists and is enabled" do
25
+ @st.click_button("Submit person form").should be_true
26
+ end
27
+
28
+ it "button exists within scope" do
29
+ @st.click_button("Submit person form", :within => "person_form").should be_true
30
+ end
31
+
32
+ it "button exists in table row" do
33
+ # TODO
34
+ end
35
+ end
36
+
37
+ context "fails when" do
38
+ it "button does not exist" do
39
+ @st.click_button("No such button").should be_false
40
+ end
41
+
42
+ it "button exists, but not within scope" do
43
+ @st.click_button("Submit person form", :within => "spouse_form").should be_false
44
+ end
45
+
46
+ it "button exists, but not in table row" do
47
+ # TODO
48
+ end
49
+
50
+ it "button exists, but is read-only" do
51
+ @st.visit("/readonly_form").should be_true
52
+ @st.click_button("Submit person form").should be_false
53
+ end
54
+ end
55
+ end
56
+
57
+
58
+ describe "#button_exists" do
59
+ context "passes when" do
60
+ context "button with text" do
61
+ it "exists" do
62
+ @st.button_exists("Submit person form").should be_true
63
+ @st.button_exists("Save preferences").should be_true
64
+ end
65
+
66
+ it "exists within scope" do
67
+ @st.button_exists("Submit person form", :within => "person_form").should be_true
68
+ @st.button_exists("Submit spouse form", :within => "spouse_form").should be_true
69
+ end
70
+
71
+ it "exists in table row" do
72
+ # TODO
73
+ end
74
+ end
75
+ end
76
+
77
+ context "fails when" do
78
+ it "no such button exists" do
79
+ @st.button_exists("Apple").should be_false
80
+ @st.button_exists("Big Red").should be_false
81
+ end
82
+
83
+ it "button exists, but not within scope" do
84
+ @st.button_exists("Submit spouse form", :within => "person_form").should be_false
85
+ @st.button_exists("Submit person form", :within => "spouse_form").should be_false
86
+ end
87
+
88
+ it "button exists, but not in table row" do
89
+ # TODO
90
+ end
91
+ end
92
+ end
93
+
94
+ end
95
+
@@ -0,0 +1,235 @@
1
+ require 'spec/st_spec_helper'
2
+
3
+ describe 'checkboxes' do
4
+ before(:each) do
5
+ @st.visit("/form").should be_true
6
+ end
7
+
8
+ describe "#enable_checkbox" do
9
+ context "passes when" do
10
+ context "checkbox with label" do
11
+ it "exists" do
12
+ @st.enable_checkbox("I like cheese").should be_true
13
+ @st.enable_checkbox("I like salami").should be_true
14
+ end
15
+
16
+ it "exists and is already checked" do
17
+ @st.enable_checkbox("I like cheese")
18
+ @st.enable_checkbox("I like cheese").should be_true
19
+ end
20
+
21
+ it "exists within scope" do
22
+ @st.enable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
23
+ @st.enable_checkbox("I like salami", :within => "salami_checkbox").should be_true
24
+ end
25
+
26
+ it "exists in table row" do
27
+ @st.visit("/table")
28
+ @st.enable_checkbox("Like", :in_row => "Marcus").should be_true
29
+ end
30
+ end
31
+
32
+ context "checkbox with id=" do
33
+ it "exists" do
34
+ @st.enable_checkbox("id=like_cheese").should be_true
35
+ end
36
+ end
37
+
38
+ context "checkbox with xpath=" do
39
+ it "exists" do
40
+ @st.enable_checkbox("xpath=//input[@id='like_cheese']").should be_true
41
+ end
42
+ end
43
+ end
44
+
45
+ context "fails when" do
46
+ context "checkbox with label" do
47
+ it "does not exist" do
48
+ @st.enable_checkbox("I dislike bacon").should be_false
49
+ @st.enable_checkbox("I like broccoli").should be_false
50
+ end
51
+
52
+ it "exists, but not within scope" do
53
+ @st.enable_checkbox("I like cheese", :within => "salami_checkbox").should be_false
54
+ @st.enable_checkbox("I like salami", :within => "cheese_checkbox").should be_false
55
+ end
56
+
57
+ it "exists, but not in table row" do
58
+ @st.visit("/table")
59
+ @st.enable_checkbox("Like", :in_row => "Eric").should be_false
60
+ end
61
+
62
+ it "exists, but is read-only" do
63
+ @st.visit("/readonly_form").should be_true
64
+ @st.enable_checkbox("I like salami").should be_false
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "#disable_checkbox" do
71
+ context "passes when" do
72
+ context "checkbox with label" do
73
+ it "exists" do
74
+ @st.disable_checkbox("I like cheese").should be_true
75
+ @st.disable_checkbox("I like salami").should be_true
76
+ end
77
+
78
+ it "exists and is already unchecked" do
79
+ @st.disable_checkbox("I like cheese")
80
+ @st.disable_checkbox("I like cheese").should be_true
81
+ end
82
+
83
+ it "exists within scope" do
84
+ @st.disable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
85
+ @st.disable_checkbox("I like salami", :within => "preferences_form").should be_true
86
+ end
87
+
88
+ it "exists in table row" do
89
+ @st.visit("/table")
90
+ @st.disable_checkbox("Like", :in_row => "Marcus").should be_true
91
+ end
92
+ end
93
+
94
+ context "checkbox with id=" do
95
+ it "exists" do
96
+ @st.disable_checkbox("id=like_cheese").should be_true
97
+ end
98
+ end
99
+
100
+ context "checkbox with xpath=" do
101
+ it "exists" do
102
+ @st.disable_checkbox("xpath=//input[@id='like_cheese']").should be_true
103
+ end
104
+ end
105
+ end
106
+
107
+ context "fails when" do
108
+ context "checkbox with label" do
109
+ it "does not exist" do
110
+ @st.disable_checkbox("I dislike bacon").should be_false
111
+ @st.disable_checkbox("I like broccoli").should be_false
112
+ end
113
+
114
+ it "exists, but not within scope" do
115
+ @st.disable_checkbox("I like cheese", :within => "salami_checkbox").should be_false
116
+ @st.disable_checkbox("I like salami", :within => "cheese_checkbox").should be_false
117
+ end
118
+
119
+ it "exists, but not in table row" do
120
+ @st.visit("/table")
121
+ @st.disable_checkbox("Like", :in_row => "Eric").should be_false
122
+ end
123
+
124
+ it "exists, but is read-only" do
125
+ @st.visit("/readonly_form").should be_true
126
+ @st.disable_checkbox("I like cheese").should be_false
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "#checkbox_is_enabled" do
133
+ context "passes when" do
134
+ context "checkbox with label" do
135
+ it "exists and is checked" do
136
+ @st.enable_checkbox("I like cheese").should be_true
137
+ @st.checkbox_is_enabled("I like cheese").should be_true
138
+ end
139
+
140
+ it "exists within scope and is checked" do
141
+ @st.enable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
142
+ @st.checkbox_is_enabled("I like cheese", :within => "cheese_checkbox").should be_true
143
+ end
144
+
145
+ it "exists in table row and is checked" do
146
+ @st.visit("/table")
147
+ @st.enable_checkbox("Like", :in_row => "Ken").should be_true
148
+ @st.checkbox_is_enabled("Like", :in_row => "Ken").should be_true
149
+ end
150
+
151
+ it "exists and is checked, but read-only" do
152
+ @st.visit("/readonly_form").should be_true
153
+ @st.checkbox_is_enabled("I like cheese").should be_true
154
+ end
155
+ end
156
+ end
157
+
158
+ context "fails when" do
159
+ context "checkbox with label" do
160
+ it "does not exist" do
161
+ @st.checkbox_is_enabled("I dislike bacon").should be_false
162
+ end
163
+
164
+ it "exists but is unchecked" do
165
+ @st.disable_checkbox("I like cheese").should be_true
166
+ @st.checkbox_is_enabled("I like cheese").should be_false
167
+ end
168
+
169
+ it "exists and is checked, but not within scope" do
170
+ @st.enable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
171
+ @st.checkbox_is_enabled("I like cheese", :within => "salami_checkbox").should be_false
172
+ end
173
+
174
+ it "exists and is checked, but not in table row" do
175
+ @st.visit("/table")
176
+ @st.enable_checkbox("Like", :in_row => "Marcus").should be_true
177
+ @st.checkbox_is_enabled("Like", :in_row => "Eric").should be_false
178
+ end
179
+ end
180
+ end
181
+ end
182
+
183
+ describe "#checkbox_is_disabled" do
184
+ context "passes when" do
185
+ context "checkbox with label" do
186
+ it "exists and is unchecked" do
187
+ @st.disable_checkbox("I like cheese").should be_true
188
+ @st.checkbox_is_disabled("I like cheese").should be_true
189
+ end
190
+
191
+ it "exists within scope and is unchecked" do
192
+ @st.disable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
193
+ @st.checkbox_is_disabled("I like cheese", :within => "cheese_checkbox").should be_true
194
+ end
195
+
196
+ it "exists in table row and is unchecked" do
197
+ @st.visit("/table")
198
+ @st.disable_checkbox("Like", :in_row => "Ken").should be_true
199
+ @st.checkbox_is_disabled("Like", :in_row => "Ken").should be_true
200
+ end
201
+
202
+ it "exists and is unchecked, but read-only" do
203
+ @st.visit("/readonly_form").should be_true
204
+ @st.checkbox_is_disabled("I like salami").should be_true
205
+ end
206
+ end
207
+ end
208
+
209
+ context "fails when" do
210
+ context "checkbox with label" do
211
+ it "does not exist" do
212
+ @st.checkbox_is_disabled("I dislike bacon").should be_false
213
+ end
214
+
215
+ it "exists but is checked" do
216
+ @st.enable_checkbox("I like cheese").should be_true
217
+ @st.checkbox_is_disabled("I like cheese").should be_false
218
+ end
219
+
220
+ it "exists and is unchecked, but not within scope" do
221
+ @st.disable_checkbox("I like cheese", :within => "cheese_checkbox").should be_true
222
+ @st.checkbox_is_disabled("I like cheese", :within => "salami_checkbox").should be_false
223
+ end
224
+
225
+ it "exists and is unchecked, but not in table row" do
226
+ @st.visit("/table")
227
+ @st.disable_checkbox("Like", :in_row => "Marcus").should be_true
228
+ @st.checkbox_is_disabled("Like", :in_row => "Eric").should be_false
229
+ end
230
+ end
231
+ end
232
+ end
233
+ end
234
+
235
+
@@ -0,0 +1,180 @@
1
+ require 'spec/st_spec_helper'
2
+
3
+ describe 'conditionals' do
4
+ before(:each) do
5
+ @st.visit("/").should be_true
6
+ @st.reset_conditionals
7
+ end
8
+
9
+ describe "#if_i_see" do
10
+ context "passes when" do
11
+ it "sees text" do
12
+ @st.if_i_see("About this site").should be_true
13
+ @st.click("About this site").should be_true
14
+ @st.end_if.should be_true
15
+ end
16
+
17
+ it "is inside a passed block" do
18
+ @st.if_i_see("About this site").should be_true
19
+ @st.click("About this site").should be_true
20
+ @st.page_loads_in_seconds_or_less(10).should be_true
21
+ @st.if_i_see("This site is").should be_true
22
+ @st.see("is really cool.").should be_true
23
+ @st.end_if.should be_true
24
+ @st.end_if.should be_true
25
+ end
26
+ end
27
+
28
+ context "skips when" do
29
+ it "does not see text" do
30
+ @st.if_i_see("Bogus link").should be_nil
31
+ @st.click("Bogus link").should be_nil
32
+ @st.end_if.should be_true
33
+ end
34
+
35
+ it "is inside a skipped block" do
36
+ @st.if_i_see("Bogus link").should be_nil
37
+ @st.click("Bogus link").should be_nil
38
+ @st.if_i_see("About this site").should be_nil
39
+ @st.click("About this site").should be_nil
40
+ @st.end_if.should be_nil
41
+ @st.end_if.should be_true
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "#if_parameter" do
47
+ context "passes when" do
48
+ it "sees yes" do
49
+ @st.if_parameter("yes").should be_true
50
+ @st.click("About this site").should be_true
51
+ @st.end_if.should be_true
52
+ end
53
+
54
+ it "sees true" do
55
+ @st.if_parameter("true").should be_true
56
+ @st.click("About this site").should be_true
57
+ @st.end_if.should be_true
58
+ end
59
+
60
+ it "sees YES" do
61
+ @st.if_parameter("YES").should be_true
62
+ @st.click("About this site").should be_true
63
+ @st.end_if.should be_true
64
+ end
65
+
66
+ it "sees TRUE" do
67
+ @st.if_parameter("TRUE").should be_true
68
+ @st.click("About this site").should be_true
69
+ @st.end_if.should be_true
70
+ end
71
+
72
+ it "is inside a passed block" do
73
+ @st.if_i_see("About this site").should be_true
74
+ @st.click("About this site").should be_true
75
+ @st.page_loads_in_seconds_or_less(10).should be_true
76
+ @st.if_parameter("True").should be_true
77
+ @st.see("is really cool.").should be_true
78
+ @st.end_if.should be_true
79
+ @st.end_if.should be_true
80
+ end
81
+ end
82
+
83
+ context "skips when" do
84
+ it "sees something other than yes or true" do
85
+ @st.if_parameter("Bogus").should be_nil
86
+ @st.click("Bogus link").should be_nil
87
+ @st.end_if.should be_true
88
+ end
89
+
90
+ it "is inside a skipped block" do
91
+ @st.if_parameter("Bogus link").should be_nil
92
+ @st.click("Bogus link").should be_nil
93
+ @st.if_parameter("TRUE").should be_nil
94
+ @st.click("About this site").should be_nil
95
+ @st.end_if.should be_nil
96
+ @st.end_if.should be_true
97
+ end
98
+ end
99
+ end
100
+
101
+ # TODO: if_is
102
+ describe "#if_is" do
103
+ context "passes when" do
104
+ it "sees the same string" do
105
+ @st.if_is("yes", 'yes').should be_true
106
+ @st.click("About this site").should be_true
107
+ @st.end_if.should be_true
108
+ end
109
+
110
+ it "sees a matching empty string" do
111
+ @st.if_is("",'').should be_true
112
+ @st.click("About this site").should be_true
113
+ @st.end_if.should be_true
114
+ end
115
+
116
+ it "is inside a passed block" do
117
+ @st.if_i_see("About this site").should be_true
118
+ @st.click("About this site").should be_true
119
+ @st.page_loads_in_seconds_or_less(10).should be_true
120
+ @st.if_is("True", "True").should be_true
121
+ @st.see("is really cool.").should be_true
122
+ @st.end_if.should be_true
123
+ @st.end_if.should be_true
124
+ end
125
+ end
126
+
127
+ context "skips when" do
128
+ it "sees different strings" do
129
+ @st.if_is("Ken", "Bogus").should be_nil
130
+ @st.click("Bogus link").should be_nil
131
+ @st.end_if.should be_true
132
+ end
133
+
134
+ it "is inside a skipped block" do
135
+ @st.if_is("Ken", "Bogus").should be_nil
136
+ @st.click("Bogus link").should be_nil
137
+ @st.if_is("True", "True").should be_nil
138
+ @st.click("About this site").should be_nil
139
+ @st.end_if.should be_nil
140
+ @st.end_if.should be_true
141
+ end
142
+ end
143
+ end
144
+
145
+ describe "#otherwise" do
146
+ context "skips when" do
147
+ it "its if was true" do
148
+ @st.if_i_see("About this site").should be_true
149
+ @st.click("About this site").should be_true
150
+ @st.otherwise.should be_nil
151
+ @st.click("Bogus link").should be_nil
152
+ @st.end_if.should be_true
153
+ end
154
+ end
155
+ context "passes when" do
156
+ it "its if was false" do
157
+ @st.if_i_see("Bogus link").should be_nil
158
+ @st.click("Bogus link").should be_nil
159
+ @st.otherwise.should be_true
160
+ @st.click("About this site").should be_true
161
+ @st.end_if.should be_true
162
+ end
163
+ end
164
+
165
+ context "fails when" do
166
+ it "does not have a matching if" do
167
+ @st.otherwise.should be_false
168
+ end
169
+ end
170
+ end
171
+
172
+ describe "#end_if" do
173
+ context "fails when" do
174
+ it "does not have a matching if" do
175
+ @st.end_if.should be_false
176
+ end
177
+ end
178
+ end
179
+
180
+ end