mattwynne-cucover 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. data/.gitignore +6 -0
  2. data/Licence.txt +22 -0
  3. data/README.markdown +23 -7
  4. data/Rakefile +86 -0
  5. data/VERSION +1 -0
  6. data/bin/cucover +1 -1
  7. data/cucover.gemspec +305 -0
  8. data/examples/self_test/rails/.gitignore +2 -0
  9. data/examples/self_test/rails/README +256 -0
  10. data/examples/self_test/rails/Rakefile +10 -0
  11. data/examples/self_test/rails/app/controllers/application.rb +2 -0
  12. data/examples/self_test/rails/app/controllers/widgets_controller.rb +2 -0
  13. data/examples/self_test/rails/app/views/widgets/index.html.erb +1 -0
  14. data/examples/self_test/rails/config/boot.rb +109 -0
  15. data/examples/self_test/rails/config/database.yml +19 -0
  16. data/examples/self_test/rails/config/environment.rb +68 -0
  17. data/examples/self_test/rails/config/environments/development.rb +17 -0
  18. data/examples/self_test/rails/config/environments/production.rb +22 -0
  19. data/examples/self_test/rails/config/environments/test.rb +22 -0
  20. data/examples/self_test/rails/config/routes.rb +43 -0
  21. data/examples/self_test/rails/db/test.sqlite3 +0 -0
  22. data/examples/self_test/rails/features/see_widgets.feature +7 -0
  23. data/examples/self_test/rails/features/step_definitions/env.rb +0 -0
  24. data/examples/self_test/rails/features/step_definitions/webrat_steps.rb +7 -0
  25. data/examples/self_test/rails/features/support/env.rb +17 -0
  26. data/examples/self_test/rails/lib/tasks/cucumber.rake +15 -0
  27. data/examples/self_test/rails/public/404.html +30 -0
  28. data/examples/self_test/rails/public/422.html +30 -0
  29. data/examples/self_test/rails/public/500.html +30 -0
  30. data/examples/self_test/rails/public/dispatch.cgi +10 -0
  31. data/examples/self_test/rails/public/dispatch.fcgi +24 -0
  32. data/examples/self_test/rails/public/dispatch.rb +10 -0
  33. data/examples/self_test/rails/public/favicon.ico +0 -0
  34. data/examples/self_test/rails/public/images/rails.png +0 -0
  35. data/examples/self_test/rails/public/index.html +274 -0
  36. data/examples/self_test/rails/public/javascripts/application.js +2 -0
  37. data/examples/self_test/rails/public/javascripts/controls.js +963 -0
  38. data/examples/self_test/rails/public/javascripts/dragdrop.js +972 -0
  39. data/examples/self_test/rails/public/javascripts/effects.js +1120 -0
  40. data/examples/self_test/rails/public/javascripts/prototype.js +4225 -0
  41. data/examples/self_test/rails/public/robots.txt +5 -0
  42. data/examples/self_test/rails/script/about +4 -0
  43. data/examples/self_test/rails/script/console +3 -0
  44. data/examples/self_test/rails/script/cucumber +8 -0
  45. data/examples/self_test/rails/script/dbconsole +3 -0
  46. data/examples/self_test/rails/script/destroy +3 -0
  47. data/examples/self_test/rails/script/generate +3 -0
  48. data/examples/self_test/rails/script/performance/benchmarker +3 -0
  49. data/examples/self_test/rails/script/performance/profiler +3 -0
  50. data/examples/self_test/rails/script/performance/request +3 -0
  51. data/examples/self_test/rails/script/plugin +3 -0
  52. data/examples/self_test/rails/script/process/inspector +3 -0
  53. data/examples/self_test/rails/script/process/reaper +3 -0
  54. data/examples/self_test/rails/script/process/spawner +3 -0
  55. data/examples/self_test/rails/script/runner +3 -0
  56. data/examples/self_test/rails/script/server +3 -0
  57. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/.specification +148 -0
  58. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/History.txt +324 -0
  59. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/MIT-LICENSE.txt +19 -0
  60. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/README.rdoc +85 -0
  61. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/Rakefile +151 -0
  62. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/install.rb +1 -0
  63. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/configuration.rb +98 -0
  64. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/elements/area.rb +31 -0
  65. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/elements/element.rb +33 -0
  66. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/elements/field.rb +403 -0
  67. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/elements/form.rb +103 -0
  68. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/elements/label.rb +31 -0
  69. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/elements/link.rb +92 -0
  70. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/elements/select_option.rb +35 -0
  71. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/area_locator.rb +38 -0
  72. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/button_locator.rb +54 -0
  73. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  74. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  75. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/field_locator.rb +25 -0
  76. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/field_named_locator.rb +41 -0
  77. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/form_locator.rb +19 -0
  78. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/label_locator.rb +34 -0
  79. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/link_locator.rb +66 -0
  80. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/locator.rb +20 -0
  81. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators/select_option_locator.rb +59 -0
  82. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/locators.rb +20 -0
  83. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/logging.rb +21 -0
  84. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/matchers/have_content.rb +73 -0
  85. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/matchers/have_selector.rb +74 -0
  86. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/matchers/have_tag.rb +21 -0
  87. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/matchers/have_xpath.rb +147 -0
  88. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/matchers.rb +4 -0
  89. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/methods.rb +61 -0
  90. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/mime.rb +29 -0
  91. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/save_and_open_page.rb +50 -0
  92. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/scope.rb +350 -0
  93. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/session.rb +281 -0
  94. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/xml/hpricot.rb +19 -0
  95. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/xml/nokogiri.rb +76 -0
  96. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/xml/rexml.rb +24 -0
  97. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core/xml.rb +115 -0
  98. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core.rb +14 -0
  99. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core_extensions/blank.rb +58 -0
  100. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core_extensions/deprecate.rb +8 -0
  101. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  102. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core_extensions/meta_class.rb +6 -0
  103. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  104. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  105. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/mechanize.rb +74 -0
  106. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/merb.rb +9 -0
  107. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/merb_session.rb +65 -0
  108. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/rack.rb +24 -0
  109. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/rails.rb +105 -0
  110. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/rspec-rails.rb +13 -0
  111. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/application_server.rb +71 -0
  112. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/location_strategy_javascript/button.js +12 -0
  113. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  114. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  115. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/location_strategy_javascript/webratlink.js +9 -0
  116. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  117. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  118. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/matchers/have_content.rb +66 -0
  119. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  120. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  121. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  122. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/matchers.rb +4 -0
  123. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/merb_application_server.rb +48 -0
  124. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/rails_application_server.rb +42 -0
  125. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/selenium_extensions.js +6 -0
  126. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/selenium_rc_server.rb +80 -0
  127. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/selenium_session.rb +241 -0
  128. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium/sinatra_application_server.rb +35 -0
  129. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/selenium.rb +80 -0
  130. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat/sinatra.rb +44 -0
  131. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/lib/webrat.rb +34 -0
  132. data/examples/self_test/rails/vendor/gems/webrat-0.4.4/vendor/selenium-server.jar +0 -0
  133. data/examples/self_test/simple/features/call_foo.feature +4 -0
  134. data/examples/self_test/simple/features/call_foo_and_bar_together.feature +5 -0
  135. data/examples/self_test/simple/features/call_foo_from_background_then_bar.feature +7 -0
  136. data/examples/self_test/simple/features/call_foo_from_background_then_bar_then_baz.feature +10 -0
  137. data/examples/self_test/simple/features/call_foo_then_bar.feature +7 -0
  138. data/examples/self_test/simple/features/call_foo_then_bar_from_scenario_outline_examples.feature +9 -0
  139. data/examples/self_test/simple/features/fail.feature +10 -0
  140. data/examples/self_test/simple/features/step_definitions/main_steps.rb +15 -0
  141. data/examples/self_test/simple/lib/bar.rb +5 -0
  142. data/examples/self_test/simple/lib/baz.rb +5 -0
  143. data/examples/self_test/simple/lib/foo.rb +9 -0
  144. data/features/call_foo.feature +0 -0
  145. data/features/coverage_of.feature +44 -0
  146. data/features/fail.feature +54 -0
  147. data/features/lazy_run.feature +79 -0
  148. data/features/lazy_run_per_scenario.feature +113 -0
  149. data/features/lazy_run_per_scenario_outline_example.feature +31 -0
  150. data/features/lazy_run_triggered_by_rails_view_change.feature +42 -0
  151. data/features/run.feature +25 -0
  152. data/features/show_recordings.feature +28 -0
  153. data/features/step_definitions/main_steps.rb +36 -0
  154. data/features/support/env.rb +48 -0
  155. data/lib/cucover/cli.rb +26 -0
  156. data/lib/cucover/cli_commands/coverage_of.rb +36 -0
  157. data/lib/cucover/cli_commands/cucumber.rb +25 -0
  158. data/lib/cucover/cli_commands/show_recordings.rb +29 -0
  159. data/lib/cucover/controller.rb +28 -0
  160. data/lib/cucover/cucumber_hooks.rb +29 -0
  161. data/lib/cucover/logging_config.rb +16 -0
  162. data/lib/cucover/monkey.rb +14 -0
  163. data/lib/cucover/rails.rb +20 -0
  164. data/lib/cucover/recorder.rb +37 -0
  165. data/lib/cucover/recording/covered_file.rb +53 -0
  166. data/lib/cucover/recording.rb +64 -0
  167. data/lib/cucover/store.rb +70 -0
  168. data/lib/cucover.rb +35 -212
  169. data/lib/dependencies.rb +10 -0
  170. data/spec/cucover/cli_spec.rb +31 -0
  171. data/spec/cucover/controller_spec.rb +16 -0
  172. data/spec/cucover/recording/covered_file_spec.rb +20 -0
  173. data/spec/cucover/store_spec.rb +28 -0
  174. data/spec/spec_helper.rb +7 -0
  175. data/tmp/.gitignore +0 -0
  176. metadata +304 -21
@@ -0,0 +1,241 @@
1
+ require "webrat/core/save_and_open_page"
2
+ require "webrat/selenium/selenium_rc_server"
3
+ require "webrat/selenium/application_server"
4
+
5
+ module Webrat
6
+ class TimeoutError < WebratError
7
+ end
8
+
9
+ class SeleniumResponse
10
+ attr_reader :body
11
+ attr_reader :session
12
+
13
+ def initialize(session, body)
14
+ @session = session
15
+ @body = body
16
+ end
17
+
18
+ def selenium
19
+ session.selenium
20
+ end
21
+ end
22
+
23
+ class SeleniumSession
24
+ include Webrat::SaveAndOpenPage
25
+
26
+ def initialize(*args) # :nodoc:
27
+ end
28
+
29
+ def simulate
30
+ end
31
+
32
+ def automate
33
+ yield
34
+ end
35
+
36
+ def visit(url)
37
+ selenium.open(url)
38
+ end
39
+
40
+ webrat_deprecate :visits, :visit
41
+
42
+ def fill_in(field_identifier, options)
43
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
44
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
45
+ selenium.type(locator, "#{options[:with]}")
46
+ end
47
+
48
+ webrat_deprecate :fills_in, :fill_in
49
+
50
+ def response
51
+ SeleniumResponse.new(self, response_body)
52
+ end
53
+
54
+ def response_body #:nodoc:
55
+ selenium.get_html_source
56
+ end
57
+
58
+ def click_button(button_text_or_regexp = nil, options = {})
59
+ if button_text_or_regexp.is_a?(Hash) && options == {}
60
+ pattern, options = nil, button_text_or_regexp
61
+ elsif button_text_or_regexp
62
+ pattern = adjust_if_regexp(button_text_or_regexp)
63
+ end
64
+ pattern ||= '*'
65
+ locator = "button=#{pattern}"
66
+
67
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
68
+ selenium.click locator
69
+ end
70
+
71
+ webrat_deprecate :clicks_button, :click_button
72
+
73
+ def click_link(link_text_or_regexp, options = {})
74
+ pattern = adjust_if_regexp(link_text_or_regexp)
75
+ locator = "webratlink=#{pattern}"
76
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
77
+ selenium.click locator
78
+ end
79
+
80
+ webrat_deprecate :clicks_link, :click_link
81
+
82
+ def click_link_within(selector, link_text, options = {})
83
+ locator = "webratlinkwithin=#{selector}|#{link_text}"
84
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
85
+ selenium.click locator
86
+ end
87
+
88
+ webrat_deprecate :clicks_link_within, :click_link_within
89
+
90
+ def select(option_text, options = {})
91
+ id_or_name_or_label = options[:from]
92
+
93
+ if id_or_name_or_label
94
+ select_locator = "webrat=#{id_or_name_or_label}"
95
+ else
96
+ select_locator = "webratselectwithoption=#{option_text}"
97
+ end
98
+
99
+ selenium.wait_for_element select_locator, :timeout_in_seconds => 5
100
+ selenium.select(select_locator, option_text)
101
+ end
102
+
103
+ webrat_deprecate :selects, :select
104
+
105
+ def choose(label_text)
106
+ locator = "webrat=#{label_text}"
107
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
108
+ selenium.click locator
109
+ end
110
+
111
+ webrat_deprecate :chooses, :choose
112
+
113
+ def check(label_text)
114
+ locator = "webrat=#{label_text}"
115
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
116
+ selenium.click locator
117
+ end
118
+ alias_method :uncheck, :check
119
+
120
+ webrat_deprecate :checks, :check
121
+
122
+ def fire_event(field_identifier, event)
123
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
124
+ selenium.fire_event(locator, "#{event}")
125
+ end
126
+
127
+ def key_down(field_identifier, key_code)
128
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
129
+ selenium.key_down(locator, key_code)
130
+ end
131
+
132
+ def key_up(field_identifier, key_code)
133
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
134
+ selenium.key_up(locator, key_code)
135
+ end
136
+
137
+ def wait_for(params={})
138
+ timeout = params[:timeout] || 5
139
+ message = params[:message] || "Timeout exceeded"
140
+
141
+ begin_time = Time.now
142
+
143
+ while (Time.now - begin_time) < timeout
144
+ value = nil
145
+
146
+ begin
147
+ value = yield
148
+ rescue ::Spec::Expectations::ExpectationNotMetError, ::Selenium::CommandError, Webrat::WebratError
149
+ value = nil
150
+ end
151
+
152
+ return value if value
153
+
154
+ sleep 0.25
155
+ end
156
+
157
+ raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)")
158
+ true
159
+ end
160
+
161
+ def selenium
162
+ return $browser if $browser
163
+ setup
164
+ $browser
165
+ end
166
+
167
+ webrat_deprecate :browser, :selenium
168
+
169
+
170
+ def save_and_open_screengrab
171
+ return unless File.exist?(saved_page_dir)
172
+
173
+ filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png"
174
+
175
+ if $browser.chrome_backend?
176
+ $browser.capture_entire_page_screenshot(filename, '')
177
+ else
178
+ $browser.capture_screenshot(filename)
179
+ end
180
+ open_in_browser(filename)
181
+ end
182
+
183
+ protected
184
+
185
+ def silence_stream(stream)
186
+ old_stream = stream.dup
187
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
188
+ stream.sync = true
189
+ yield
190
+ ensure
191
+ stream.reopen(old_stream)
192
+ end
193
+
194
+ def setup #:nodoc:
195
+ Webrat::Selenium::SeleniumRCServer.boot
196
+ Webrat::Selenium::ApplicationServer.boot
197
+
198
+ create_browser
199
+ $browser.start
200
+
201
+ extend_selenium
202
+ define_location_strategies
203
+ $browser.window_maximize
204
+ end
205
+
206
+
207
+ def create_browser
208
+ $browser = ::Selenium::Client::Driver.new(Webrat.configuration.selenium_server_address || "localhost",
209
+ Webrat.configuration.selenium_server_port, Webrat.configuration.selenium_browser_key, "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}")
210
+ $browser.set_speed(0) unless Webrat.configuration.selenium_server_address
211
+
212
+ at_exit do
213
+ silence_stream(STDOUT) do
214
+ $browser.stop
215
+ end
216
+ end
217
+ end
218
+
219
+ def adjust_if_regexp(text_or_regexp) #:nodoc:
220
+ if text_or_regexp.is_a?(Regexp)
221
+ "evalregex:#{text_or_regexp.inspect}"
222
+ else
223
+ "evalregex:/#{text_or_regexp}/"
224
+ end
225
+ end
226
+
227
+ def extend_selenium #:nodoc:
228
+ extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
229
+ extenions_js = File.read(extensions_file)
230
+ selenium.get_eval(extenions_js)
231
+ end
232
+
233
+ def define_location_strategies #:nodoc:
234
+ Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
235
+ strategy_js = File.read(file)
236
+ strategy_name = File.basename(file, '.js')
237
+ selenium.add_location_strategy(strategy_name, strategy_js)
238
+ end
239
+ end
240
+ end
241
+ end
@@ -0,0 +1,35 @@
1
+ module Webrat
2
+ module Selenium
3
+
4
+ class SinatraApplicationServer < ApplicationServer
5
+
6
+ def start
7
+ fork do
8
+ File.open('rack.pid', 'w') { |fp| fp.write Process.pid }
9
+ exec 'rackup', File.expand_path(Dir.pwd + '/config.ru'), '-p', Webrat.configuration.application_port.to_s
10
+ end
11
+ end
12
+
13
+ def stop
14
+ silence_stream(STDOUT) do
15
+ pid = File.read(pid_file)
16
+ system("kill -9 #{pid}")
17
+ FileUtils.rm_f pid_file
18
+ end
19
+ end
20
+
21
+ def fail
22
+ $stderr.puts
23
+ $stderr.puts
24
+ $stderr.puts "==> Failed to boot the Sinatra application server... exiting!"
25
+ exit
26
+ end
27
+
28
+ def pid_file
29
+ prepare_pid_file(Dir.pwd, 'rack.pid')
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,80 @@
1
+ require "webrat"
2
+ gem "selenium-client", ">=1.2.14"
3
+ require "selenium/client"
4
+ require "webrat/selenium/selenium_session"
5
+ require "webrat/selenium/matchers"
6
+ require "webrat/core_extensions/tcp_socket"
7
+
8
+ module Webrat
9
+ # To use Webrat's Selenium support, you'll need the selenium-client gem installed.
10
+ # Activate it with (for example, in your <tt>env.rb</tt>):
11
+ #
12
+ # require "webrat"
13
+ #
14
+ # Webrat.configure do |config|
15
+ # config.mode = :selenium
16
+ # end
17
+ #
18
+ # == Dropping down to the selenium-client API
19
+ #
20
+ # If you ever need to do something with Selenium not provided in the Webrat API,
21
+ # you can always drop down to the selenium-client API using the <tt>selenium</tt> method.
22
+ # For example:
23
+ #
24
+ # When "I drag the photo to the left" do
25
+ # selenium.dragdrop("id=photo_123", "+350, 0")
26
+ # end
27
+ #
28
+ # == Choosing the underlying framework to test
29
+ #
30
+ # Webrat assumes you're using rails by default but it can also work with sinatra
31
+ # and merb. To take advantage of this you can use the configuration block to
32
+ # set the application_framework variable.
33
+ # require "webrat"
34
+ #
35
+ # Webrat.configure do |config|
36
+ # config.mode = :selenium
37
+ # config.application_port = 4567
38
+ # config.application_framework = :sinatra # could also be :merb
39
+ # end
40
+ #
41
+ # == Auto-starting of the appserver and java server
42
+ #
43
+ # Webrat will automatically start the Selenium Java server process and an instance
44
+ # of Mongrel when a test is run. The Mongrel will run in the "selenium" environment
45
+ # instead of "test", so ensure you've got that defined, and will run on port
46
+ # Webrat.configuration.application_port.
47
+ #
48
+ # == Waiting
49
+ #
50
+ # In order to make writing Selenium tests as easy as possible, Webrat will automatically
51
+ # wait for the correct elements to exist on the page when trying to manipulate them
52
+ # with methods like <tt>fill_in</tt>, etc. In general, this means you should be able to write
53
+ # your Webrat::Selenium tests ignoring the concurrency issues that can plague in-browser
54
+ # testing, so long as you're using the Webrat API.
55
+ module Selenium
56
+ module Methods
57
+ def response
58
+ webrat_session.response
59
+ end
60
+
61
+ def wait_for(*args, &block)
62
+ webrat_session.wait_for(*args, &block)
63
+ end
64
+
65
+ def save_and_open_screengrab
66
+ webrat_session.save_and_open_screengrab
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ if defined?(ActionController::IntegrationTest)
73
+ module ActionController #:nodoc:
74
+ IntegrationTest.class_eval do
75
+ include Webrat::Methods
76
+ include Webrat::Selenium::Methods
77
+ include Webrat::Selenium::Matchers
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,44 @@
1
+ require "webrat/rack"
2
+ require "sinatra/test"
3
+
4
+ module Webrat
5
+ class SinatraSession < RackSession
6
+ include Sinatra::Test
7
+
8
+ attr_reader :request, :response
9
+
10
+ def initialize(context = nil)
11
+ super(context)
12
+
13
+ app = context.respond_to?(:app) ? context.app : Sinatra::Application
14
+ @browser = Sinatra::TestHarness.new(app)
15
+ end
16
+
17
+ %w(get head post put delete).each do |verb|
18
+ class_eval <<-RUBY
19
+ def #{verb}(path, data, headers = {})
20
+ params = data.inject({}) do |data, (key,value)|
21
+ data[key] = Rack::Utils.unescape(value)
22
+ data
23
+ end
24
+ headers["HTTP_HOST"] = "www.example.com"
25
+ @browser.#{verb}(path, params, headers)
26
+ end
27
+ RUBY
28
+ end
29
+
30
+ def response_body
31
+ @browser.body
32
+ end
33
+
34
+ def response_code
35
+ @browser.status
36
+ end
37
+
38
+ private
39
+
40
+ def response
41
+ @browser.response
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,34 @@
1
+ require "rubygems"
2
+
3
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
4
+
5
+ module Webrat
6
+ # The common base class for all exceptions raised by Webrat.
7
+ class WebratError < StandardError
8
+ end
9
+
10
+ VERSION = '0.4.4'
11
+
12
+ def self.require_xml
13
+ gem "nokogiri", ">= 1.0.6"
14
+
15
+ if on_java?
16
+ # We need Nokogiri's CSS to XPath support, even if using REXML and Hpricot for parsing and searching
17
+ require "nokogiri/css"
18
+ require "hpricot"
19
+ require "rexml/document"
20
+ else
21
+ require "nokogiri"
22
+ require "webrat/core/xml/nokogiri"
23
+ end
24
+ end
25
+
26
+ def self.on_java?
27
+ RUBY_PLATFORM =~ /java/
28
+ end
29
+
30
+ end
31
+
32
+ Webrat.require_xml
33
+
34
+ require "webrat/core"
@@ -0,0 +1,4 @@
1
+ Feature: Call Foo
2
+
3
+ Scenario: Call Foo
4
+ When I call Foo
@@ -0,0 +1,5 @@
1
+ Feature: Call Foo and Bar Together
2
+
3
+ Scenario: Call Foo and Bar
4
+ When I call Foo
5
+ And I call Bar
@@ -0,0 +1,7 @@
1
+ Feature: Call Foo from Background then Bar
2
+
3
+ Background:
4
+ Given I have called Foo
5
+
6
+ Scenario: Call Bar
7
+ When I call Bar
@@ -0,0 +1,10 @@
1
+ Feature: Call Foo from Background then Bar then Baz
2
+
3
+ Background:
4
+ Given I have called Foo
5
+
6
+ Scenario: Call Bar
7
+ When I call Bar
8
+
9
+ Scenario: Call Baz
10
+ When I call Baz
@@ -0,0 +1,7 @@
1
+ Feature: Call Foo then Bar
2
+
3
+ Scenario: Call Foo
4
+ When I call Foo
5
+
6
+ Scenario: Call Bar
7
+ When I call Bar
@@ -0,0 +1,9 @@
1
+ Feature: Call Foo then Bar from Scenario Outline Examples
2
+
3
+ Scenario Outline: Call Something
4
+ When I call <Code>
5
+
6
+ Examples:
7
+ | Code |
8
+ | Foo |
9
+ | Bar |
@@ -0,0 +1,10 @@
1
+ Feature: Epic Fail
2
+ In order to make my job look really hard
3
+ As a developer
4
+ I want tests to fail from time to time
5
+
6
+ Scenario: Do something stupid
7
+ When I divide by zero
8
+
9
+
10
+
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../../lib/foo'
2
+ require File.dirname(__FILE__) + '/../../lib/bar'
3
+ require File.dirname(__FILE__) + '/../../lib/baz'
4
+
5
+ Given /^I have called ([\w]+)$/ do |class_name|
6
+ Object.const_get(class_name).new.execute
7
+ end
8
+
9
+ When /^I call ([\w]+)$/ do |class_name|
10
+ Given "I have called #{class_name}"
11
+ end
12
+
13
+ When /^I divide by zero$/ do
14
+ 1/0
15
+ end
@@ -0,0 +1,5 @@
1
+ class Bar
2
+ def execute
3
+ true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Baz
2
+ def execute
3
+ true
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class Foo
2
+ def execute
3
+ true
4
+ end
5
+
6
+ def sloppy_method
7
+ 1/0
8
+ end
9
+ end
File without changes
@@ -0,0 +1,44 @@
1
+ Feature: Coverage Of
2
+ In order to find out how well tested a source file that I'm working on is
3
+ As a developer
4
+ I want to be able to ask Cucover which features cover which lines of a given source file
5
+
6
+ Background:
7
+ Given I am using the simple example app
8
+
9
+ Scenario: Get coverage of a source file that's partly touched by the feature that was run
10
+ Given I have run cucover -- features/call_foo.feature
11
+ When I run cucover --coverage-of lib/foo.rb
12
+ Then it should pass with:
13
+ """
14
+ 1 class Foo
15
+ 2 def execute features/call_foo.feature:3
16
+ 3 true features/call_foo.feature:3
17
+ 4 end features/call_foo.feature:3
18
+ 5
19
+ 6 def sloppy_me..
20
+ 7 1/0
21
+ 8 end
22
+ 9 end
23
+
24
+ """
25
+
26
+ Scenario: Run another feature that also covers the same source file
27
+ Given I have run cucover -- features/call_foo.feature
28
+ And I have run cucover -- features/call_foo_and_bar_together.feature
29
+ When I run cucover --coverage-of lib/foo.rb
30
+ Then it should pass with:
31
+ """
32
+ 1 class Foo
33
+ 2 def execute features/call_foo_and_bar_together.feature:3, features/call_foo.feature:3
34
+ 3 true features/call_foo_and_bar_together.feature:3, features/call_foo.feature:3
35
+ 4 end features/call_foo_and_bar_together.feature:3, features/call_foo.feature:3
36
+ 5
37
+ 6 def sloppy_me..
38
+ 7 1/0
39
+ 8 end
40
+ 9 end
41
+
42
+ """
43
+
44
+
@@ -0,0 +1,54 @@
1
+ Feature: Fail
2
+ In order to diagnose a fault
3
+ As a developer
4
+ I want to get useful information when a feature fails
5
+
6
+ Scenario: Two features, one fails
7
+ And I am using the simple example app
8
+ When I run cucover -- features/call_foo.feature features/fail.feature
9
+ Then it should fail with:
10
+ """
11
+ Feature: Call Foo
12
+
13
+ Scenario: Call Foo # features/call_foo.feature:3
14
+ When I call Foo # features/step_definitions/main_steps.rb:9
15
+
16
+ Feature: Epic Fail
17
+ In order to make my job look really hard
18
+ As a developer
19
+ I want tests to fail from time to time
20
+
21
+ Scenario: Do something stupid # features/fail.feature:6
22
+ When I divide by zero # features/step_definitions/main_steps.rb:13
23
+ divided by 0 (ZeroDivisionError)
24
+ ./features/step_definitions/main_steps.rb:14:in `/'
25
+ ./features/step_definitions/main_steps.rb:14:in `/^I divide by zero$/'
26
+ features/fail.feature:7:in `When I divide by zero'
27
+
28
+ 2 scenarios (1 failed, 1 passed)
29
+ 2 steps (1 failed, 1 passed)
30
+
31
+ """
32
+
33
+ Scenario: Run failing feature twice
34
+ And I am using the simple example app
35
+ And I have tried to run cucover -- features/fail.feature
36
+ When I run cucover -- features/fail.feature
37
+ Then it should fail with:
38
+ """
39
+ Feature: Epic Fail
40
+ In order to make my job look really hard
41
+ As a developer
42
+ I want tests to fail from time to time
43
+
44
+ Scenario: Do something stupid # features/fail.feature:6
45
+ When I divide by zero # features/step_definitions/main_steps.rb:13
46
+ divided by 0 (ZeroDivisionError)
47
+ ./features/step_definitions/main_steps.rb:14:in `/'
48
+ ./features/step_definitions/main_steps.rb:14:in `/^I divide by zero$/'
49
+ features/fail.feature:7:in `When I divide by zero'
50
+
51
+ 1 scenario (1 failed)
52
+ 1 step (1 failed)
53
+
54
+ """