thoughtbot-webrat 0.7.2.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. data/.document +4 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +13 -0
  4. data/History.txt +450 -0
  5. data/MIT-LICENSE.txt +19 -0
  6. data/README.rdoc +85 -0
  7. data/Rakefile +143 -0
  8. data/Thorfile +118 -0
  9. data/install.rb +1 -0
  10. data/lib/webrat.rb +18 -0
  11. data/lib/webrat/adapters/mechanize.rb +94 -0
  12. data/lib/webrat/adapters/merb.rb +11 -0
  13. data/lib/webrat/adapters/rack.rb +29 -0
  14. data/lib/webrat/adapters/rails.rb +77 -0
  15. data/lib/webrat/adapters/sinatra.rb +9 -0
  16. data/lib/webrat/core.rb +13 -0
  17. data/lib/webrat/core/configuration.rb +114 -0
  18. data/lib/webrat/core/elements/area.rb +31 -0
  19. data/lib/webrat/core/elements/element.rb +33 -0
  20. data/lib/webrat/core/elements/field.rb +438 -0
  21. data/lib/webrat/core/elements/form.rb +127 -0
  22. data/lib/webrat/core/elements/label.rb +31 -0
  23. data/lib/webrat/core/elements/link.rb +93 -0
  24. data/lib/webrat/core/elements/select_option.rb +48 -0
  25. data/lib/webrat/core/locators.rb +20 -0
  26. data/lib/webrat/core/locators/area_locator.rb +38 -0
  27. data/lib/webrat/core/locators/button_locator.rb +54 -0
  28. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  29. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  30. data/lib/webrat/core/locators/field_locator.rb +25 -0
  31. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  32. data/lib/webrat/core/locators/form_locator.rb +19 -0
  33. data/lib/webrat/core/locators/label_locator.rb +34 -0
  34. data/lib/webrat/core/locators/link_locator.rb +74 -0
  35. data/lib/webrat/core/locators/locator.rb +20 -0
  36. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  37. data/lib/webrat/core/logging.rb +23 -0
  38. data/lib/webrat/core/matchers.rb +4 -0
  39. data/lib/webrat/core/matchers/have_content.rb +68 -0
  40. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  41. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  42. data/lib/webrat/core/matchers/have_xpath.rb +125 -0
  43. data/lib/webrat/core/methods.rb +64 -0
  44. data/lib/webrat/core/mime.rb +18 -0
  45. data/lib/webrat/core/save_and_open_page.rb +28 -0
  46. data/lib/webrat/core/scope.rb +366 -0
  47. data/lib/webrat/core/session.rb +303 -0
  48. data/lib/webrat/core/xml.rb +72 -0
  49. data/lib/webrat/core_extensions/blank.rb +58 -0
  50. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  51. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  52. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  53. data/lib/webrat/core_extensions/nil_to_query_string.rb +5 -0
  54. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  55. data/lib/webrat/integrations/merb.rb +10 -0
  56. data/lib/webrat/integrations/rails.rb +25 -0
  57. data/lib/webrat/integrations/rspec-rails.rb +11 -0
  58. data/lib/webrat/integrations/selenium.rb +11 -0
  59. data/lib/webrat/merb.rb +9 -0
  60. data/lib/webrat/rspec-rails.rb +2 -0
  61. data/lib/webrat/selenium.rb +70 -0
  62. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  63. data/lib/webrat/selenium/application_servers.rb +5 -0
  64. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  65. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  66. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  67. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  68. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  69. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  70. data/lib/webrat/selenium/location_strategy_javascript/label.js +48 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  72. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  73. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  74. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  75. data/lib/webrat/selenium/matchers.rb +4 -0
  76. data/lib/webrat/selenium/matchers/have_content.rb +78 -0
  77. data/lib/webrat/selenium/matchers/have_selector.rb +57 -0
  78. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  79. data/lib/webrat/selenium/matchers/have_xpath.rb +53 -0
  80. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  81. data/lib/webrat/selenium/selenium_rc_server.rb +89 -0
  82. data/lib/webrat/selenium/selenium_session.rb +272 -0
  83. data/lib/webrat/selenium/silence_stream.rb +18 -0
  84. data/spec/fakes/test_adapter.rb +33 -0
  85. data/spec/integration/mechanize/Rakefile +7 -0
  86. data/spec/integration/mechanize/config.ru +2 -0
  87. data/spec/integration/mechanize/sample_app.rb +35 -0
  88. data/spec/integration/mechanize/spec/mechanize_spec.rb +30 -0
  89. data/spec/integration/mechanize/spec/spec_helper.rb +29 -0
  90. data/spec/integration/merb/.gitignore +21 -0
  91. data/spec/integration/merb/Rakefile +35 -0
  92. data/spec/integration/merb/app/controllers/application.rb +2 -0
  93. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  94. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  95. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  96. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  97. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  98. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  99. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  100. data/spec/integration/merb/config/environments/development.rb +15 -0
  101. data/spec/integration/merb/config/environments/rake.rb +11 -0
  102. data/spec/integration/merb/config/environments/test.rb +14 -0
  103. data/spec/integration/merb/config/init.rb +25 -0
  104. data/spec/integration/merb/config/rack.rb +11 -0
  105. data/spec/integration/merb/config/router.rb +34 -0
  106. data/spec/integration/merb/spec/spec.opts +1 -0
  107. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  108. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  109. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  110. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  111. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  112. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  113. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  114. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  115. data/spec/integration/rack/Rakefile +5 -0
  116. data/spec/integration/rack/app.rb +89 -0
  117. data/spec/integration/rack/test/helper.rb +20 -0
  118. data/spec/integration/rack/test/webrat_rack_test.rb +74 -0
  119. data/spec/integration/rails/.gitignore +3 -0
  120. data/spec/integration/rails/Rakefile +30 -0
  121. data/spec/integration/rails/app/controllers/application_controller.rb +15 -0
  122. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  123. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  124. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  125. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  126. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  127. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  128. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  129. data/spec/integration/rails/app/views/buttons/show.html.erb +9 -0
  130. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  131. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  132. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  133. data/spec/integration/rails/app/views/webrat/buttons.html.erb +9 -0
  134. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  135. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  136. data/spec/integration/rails/config/boot.rb +109 -0
  137. data/spec/integration/rails/config/environment.rb +12 -0
  138. data/spec/integration/rails/config/environments/development.rb +17 -0
  139. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  140. data/spec/integration/rails/config/environments/test.rb +22 -0
  141. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  142. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  143. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  144. data/spec/integration/rails/config/locales/en.yml +5 -0
  145. data/spec/integration/rails/config/routes.rb +19 -0
  146. data/spec/integration/rails/public/404.html +30 -0
  147. data/spec/integration/rails/public/422.html +30 -0
  148. data/spec/integration/rails/public/500.html +33 -0
  149. data/spec/integration/rails/script/about +4 -0
  150. data/spec/integration/rails/script/console +3 -0
  151. data/spec/integration/rails/script/dbconsole +3 -0
  152. data/spec/integration/rails/script/destroy +3 -0
  153. data/spec/integration/rails/script/generate +3 -0
  154. data/spec/integration/rails/script/performance/benchmarker +3 -0
  155. data/spec/integration/rails/script/performance/profiler +3 -0
  156. data/spec/integration/rails/script/performance/request +3 -0
  157. data/spec/integration/rails/script/plugin +3 -0
  158. data/spec/integration/rails/script/process/inspector +3 -0
  159. data/spec/integration/rails/script/process/reaper +3 -0
  160. data/spec/integration/rails/script/process/spawner +3 -0
  161. data/spec/integration/rails/script/runner +3 -0
  162. data/spec/integration/rails/script/server +3 -0
  163. data/spec/integration/rails/test/integration/button_click_test.rb +66 -0
  164. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  165. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  166. data/spec/integration/rails/test/integration/webrat_test.rb +123 -0
  167. data/spec/integration/rails/test/test_helper.rb +27 -0
  168. data/spec/integration/sinatra/Rakefile +5 -0
  169. data/spec/integration/sinatra/classic_app.rb +63 -0
  170. data/spec/integration/sinatra/modular_app.rb +15 -0
  171. data/spec/integration/sinatra/test/classic_app_test.rb +38 -0
  172. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  173. data/spec/integration/sinatra/test/test_helper.rb +16 -0
  174. data/spec/private/core/configuration_spec.rb +87 -0
  175. data/spec/private/core/field_spec.rb +83 -0
  176. data/spec/private/core/form_spec.rb +51 -0
  177. data/spec/private/core/link_spec.rb +24 -0
  178. data/spec/private/core/session_spec.rb +182 -0
  179. data/spec/private/mechanize/mechanize_adapter_spec.rb +96 -0
  180. data/spec/private/nokogiri_spec.rb +77 -0
  181. data/spec/private/rails/attaches_file_spec.rb +114 -0
  182. data/spec/private/rails/rails_adapter_spec.rb +79 -0
  183. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  184. data/spec/public/basic_auth_spec.rb +35 -0
  185. data/spec/public/check_spec.rb +191 -0
  186. data/spec/public/choose_spec.rb +118 -0
  187. data/spec/public/click_area_spec.rb +106 -0
  188. data/spec/public/click_button_spec.rb +494 -0
  189. data/spec/public/click_link_spec.rb +532 -0
  190. data/spec/public/fill_in_spec.rb +224 -0
  191. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  192. data/spec/public/locators/field_labeled_spec.rb +172 -0
  193. data/spec/public/locators/field_with_id_spec.rb +16 -0
  194. data/spec/public/matchers/contain_spec.rb +133 -0
  195. data/spec/public/matchers/have_selector_spec.rb +146 -0
  196. data/spec/public/matchers/have_tag_spec.rb +39 -0
  197. data/spec/public/matchers/have_xpath_spec.rb +154 -0
  198. data/spec/public/reload_spec.rb +10 -0
  199. data/spec/public/save_and_open_spec.rb +49 -0
  200. data/spec/public/select_date_spec.rb +112 -0
  201. data/spec/public/select_datetime_spec.rb +137 -0
  202. data/spec/public/select_spec.rb +474 -0
  203. data/spec/public/select_time_spec.rb +100 -0
  204. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  205. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  206. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  207. data/spec/public/set_hidden_field_spec.rb +5 -0
  208. data/spec/public/submit_form_spec.rb +56 -0
  209. data/spec/public/visit_spec.rb +58 -0
  210. data/spec/public/within_spec.rb +177 -0
  211. data/spec/rcov.opts +1 -0
  212. data/spec/spec.opts +2 -0
  213. data/spec/spec_helper.rb +53 -0
  214. data/vendor/selenium-server.jar +0 -0
  215. metadata +424 -0
@@ -0,0 +1,272 @@
1
+ require "webrat/core/save_and_open_page"
2
+ require "webrat/selenium/selenium_rc_server"
3
+ require "webrat/selenium/application_server_factory"
4
+ require "webrat/selenium/application_servers/base"
5
+
6
+ begin
7
+ require "selenium"
8
+ rescue LoadError => e
9
+ e.message << " (You may need to install the selenium-rc gem)"
10
+ raise e
11
+ end
12
+
13
+ module Webrat
14
+ class TimeoutError < WebratError
15
+ end
16
+
17
+ class SeleniumResponse
18
+ attr_reader :body
19
+ attr_reader :session
20
+
21
+ def initialize(session, body)
22
+ @session = session
23
+ @body = body
24
+ end
25
+
26
+ def selenium
27
+ session.selenium
28
+ end
29
+ end
30
+
31
+ class SeleniumSession
32
+ include Webrat::SaveAndOpenPage
33
+ include Webrat::Selenium::SilenceStream
34
+
35
+ def initialize(*args) # :nodoc:
36
+ end
37
+
38
+ def simulate
39
+ end
40
+
41
+ def automate
42
+ yield
43
+ end
44
+
45
+ def visit(url)
46
+ selenium.open(url)
47
+ end
48
+
49
+ webrat_deprecate :visits, :visit
50
+
51
+ def fill_in(field_identifier, options)
52
+ locator = "webrat=#{field_identifier}"
53
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
54
+ selenium.type(locator, "#{options[:with]}")
55
+ end
56
+
57
+ webrat_deprecate :fills_in, :fill_in
58
+
59
+ def response
60
+ SeleniumResponse.new(self, response_body)
61
+ end
62
+
63
+ def response_body #:nodoc:
64
+ selenium.get_html_source
65
+ end
66
+
67
+ def current_url
68
+ selenium.location
69
+ end
70
+
71
+ def click_button(button_text_or_regexp = nil, options = {})
72
+ if button_text_or_regexp.is_a?(Hash) && options == {}
73
+ pattern, options = nil, button_text_or_regexp
74
+ elsif button_text_or_regexp
75
+ pattern = adjust_if_regexp(button_text_or_regexp)
76
+ end
77
+ pattern ||= '*'
78
+ locator = "button=#{pattern}"
79
+
80
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
81
+ selenium.click locator
82
+ end
83
+
84
+ webrat_deprecate :clicks_button, :click_button
85
+
86
+ def click_link(link_text_or_regexp, options = {})
87
+ if link_text_or_regexp.is_a?(Regexp)
88
+ pattern = "evalregex:#{link_text_or_regexp.inspect}"
89
+ else
90
+ pattern = link_text_or_regexp.to_s
91
+ end
92
+
93
+ locator = "webratlink=#{pattern}"
94
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
95
+ selenium.click locator
96
+ end
97
+
98
+ webrat_deprecate :clicks_link, :click_link
99
+
100
+ def click_link_within(selector, link_text, options = {})
101
+ locator = "webratlinkwithin=#{selector}|#{link_text}"
102
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
103
+ selenium.click locator
104
+ end
105
+
106
+ webrat_deprecate :clicks_link_within, :click_link_within
107
+
108
+ def select(option_text, options = {})
109
+ id_or_name_or_label = options[:from]
110
+
111
+ if id_or_name_or_label
112
+ select_locator = "webrat=#{id_or_name_or_label}"
113
+ else
114
+ select_locator = "webratselectwithoption=#{option_text}"
115
+ end
116
+
117
+ selenium.wait_for_element select_locator, :timeout_in_seconds => 5
118
+ selenium.select(select_locator, option_text)
119
+ end
120
+
121
+ webrat_deprecate :selects, :select
122
+
123
+ def choose(label_text)
124
+ locator = "webrat=#{label_text}"
125
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
126
+ selenium.click locator
127
+ end
128
+
129
+ webrat_deprecate :chooses, :choose
130
+
131
+ def check(label_text)
132
+ locator = "webrat=#{label_text}"
133
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
134
+ selenium.click locator
135
+ end
136
+ alias_method :uncheck, :check
137
+
138
+ webrat_deprecate :checks, :check
139
+
140
+ def fire_event(field_identifier, event)
141
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
142
+ selenium.fire_event(locator, "#{event}")
143
+ end
144
+
145
+ def key_down(field_identifier, key_code)
146
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
147
+ selenium.key_down(locator, key_code)
148
+ end
149
+
150
+ def key_up(field_identifier, key_code)
151
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
152
+ selenium.key_up(locator, key_code)
153
+ end
154
+
155
+ def wait_for(params={})
156
+ timeout = params[:timeout] || 5
157
+ message = params[:message] || "Timeout exceeded"
158
+
159
+ begin_time = Time.now
160
+
161
+ while (Time.now - begin_time) < timeout
162
+ value = nil
163
+
164
+ begin
165
+ value = yield
166
+ rescue Exception => e
167
+ unless is_ignorable_wait_for_exception?(e)
168
+ raise e
169
+ end
170
+ end
171
+
172
+ return value if value
173
+
174
+ sleep 0.25
175
+ end
176
+
177
+ error_message = "#{message} (after #{timeout} sec)"
178
+
179
+ if $browser && Webrat.configuration.selenium_verbose_output
180
+ error_message += <<-EOS
181
+
182
+
183
+ HTML of the page was:
184
+
185
+ #{selenium.get_html_source}"
186
+ EOS
187
+ end
188
+
189
+ raise Webrat::TimeoutError.new(error_message)
190
+ true
191
+ end
192
+
193
+ def selenium
194
+ return $browser if $browser
195
+ setup
196
+ $browser
197
+ end
198
+
199
+ webrat_deprecate :browser, :selenium
200
+
201
+
202
+ def save_and_open_screengrab
203
+ return unless File.exist?(Webrat.configuration.saved_pages_dir)
204
+
205
+ filename = "#{Webrat.configuration.saved_pages_dir}/webrat-#{Time.now.to_i}.png"
206
+
207
+ if $browser.chrome_backend?
208
+ $browser.capture_entire_page_screenshot(filename, '')
209
+ else
210
+ $browser.capture_screenshot(filename)
211
+ end
212
+ open_in_browser(filename)
213
+
214
+ end
215
+
216
+ protected
217
+ def is_ignorable_wait_for_exception?(exception) #:nodoc:
218
+ if defined?(::Spec::Expectations::ExpectationNotMetError)
219
+ return true if exception.class == ::Spec::Expectations::ExpectationNotMetError
220
+ end
221
+ return true if [::Selenium::CommandError, Webrat::WebratError].include?(exception.class)
222
+ return false
223
+ end
224
+
225
+ def setup #:nodoc:
226
+ Webrat::Selenium::SeleniumRCServer.boot
227
+ Webrat::Selenium::ApplicationServerFactory.app_server_instance.boot
228
+
229
+ create_browser
230
+ $browser.start
231
+
232
+ extend_selenium
233
+ define_location_strategies
234
+ $browser.window_maximize
235
+ end
236
+
237
+
238
+ def create_browser
239
+ $browser = ::Selenium::Client::Driver.new(Webrat.configuration.selenium_server_address || "localhost",
240
+ Webrat.configuration.selenium_server_port, Webrat.configuration.selenium_browser_key, "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port_for_selenium}")
241
+ $browser.set_speed(0) unless Webrat.configuration.selenium_server_address
242
+
243
+ at_exit do
244
+ silence_stream(STDOUT) do
245
+ $browser.stop
246
+ end
247
+ end
248
+ end
249
+
250
+ def adjust_if_regexp(text_or_regexp) #:nodoc:
251
+ if text_or_regexp.is_a?(Regexp)
252
+ "evalregex:#{text_or_regexp.inspect}"
253
+ else
254
+ "evalregex:/#{text_or_regexp}/"
255
+ end
256
+ end
257
+
258
+ def extend_selenium #:nodoc:
259
+ extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
260
+ extenions_js = File.read(extensions_file)
261
+ selenium.get_eval(extenions_js)
262
+ end
263
+
264
+ def define_location_strategies #:nodoc:
265
+ Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
266
+ strategy_js = File.read(file)
267
+ strategy_name = File.basename(file, '.js')
268
+ selenium.add_location_strategy(strategy_name, strategy_js)
269
+ end
270
+ end
271
+ end
272
+ end
@@ -0,0 +1,18 @@
1
+ module Webrat
2
+ module Selenium
3
+ module SilenceStream
4
+ # active_support already defines silence_stream, no need to do that again if it's already present.
5
+ # http://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/kernel/reporting.rb
6
+ unless Kernel.respond_to?(:silence_stream)
7
+ def silence_stream(stream)
8
+ old_stream = stream.dup
9
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
10
+ stream.sync = true
11
+ yield
12
+ ensure
13
+ stream.reopen(old_stream)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,33 @@
1
+ module Webrat #:nodoc:
2
+ def self.adapter_class #:nodoc:
3
+ TestAdapter
4
+ end
5
+
6
+ class TestAdapter #:nodoc:
7
+ attr_accessor :response_body
8
+ attr_writer :response_code
9
+
10
+ def initialize(*args)
11
+ end
12
+
13
+ def response
14
+ @response ||= Object.new
15
+ end
16
+
17
+ def response_code
18
+ @response_code ||= 200
19
+ end
20
+
21
+ def get(url, data, headers = nil)
22
+ end
23
+
24
+ def post(url, data, headers = nil)
25
+ end
26
+
27
+ def put(url, data, headers = nil)
28
+ end
29
+
30
+ def delete(url, data, headers = nil)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'spec/rake/spectask'
3
+
4
+ Spec::Rake::SpecTask.new do |t|
5
+ t.spec_opts = ['--color']
6
+ t.spec_files = FileList['spec/**/*_spec.rb']
7
+ end
@@ -0,0 +1,2 @@
1
+ require "sample_app"
2
+ run SampleApp
@@ -0,0 +1,35 @@
1
+ require "sinatra/base"
2
+
3
+ class SampleApp < Sinatra::Default
4
+ get "/" do
5
+ "Hello World"
6
+ end
7
+
8
+ get "/internal_redirect" do
9
+ redirect URI.join(request.url, "redirected").to_s
10
+ end
11
+
12
+ get "/external_redirect" do
13
+ redirect "http://example.tst/"
14
+ end
15
+
16
+ get "/redirected" do
17
+ "Redirected"
18
+ end
19
+
20
+ get "/form" do
21
+ <<-EOS
22
+ <html>
23
+ <form action="/form" method="post">
24
+ <input type="hidden" name="_method" value="put" />
25
+ <label for="email">Email:</label> <input type="text" id="email" name="email" /></label>
26
+ <input type="submit" value="Add" />
27
+ </form>
28
+ </html>
29
+ EOS
30
+ end
31
+
32
+ put "/form" do
33
+ "Welcome #{params[:email]}"
34
+ end
35
+ end
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe "Webrat's Mechanize mode" do
4
+ it "should work" do
5
+ response = visit("http://localhost:9292/")
6
+ response.should contain("Hello World")
7
+ end
8
+
9
+ it "should follow redirects" do
10
+ response = visit("http://localhost:9292/internal_redirect")
11
+ response.should contain("Redirected")
12
+ end
13
+
14
+ it "should follow links"
15
+
16
+ it "should submit forms" do
17
+ visit "http://localhost:9292/form"
18
+ fill_in "Email", :with => "albert@example.com"
19
+ response = click_button "Add"
20
+
21
+ response.should contain("Welcome albert@example.com")
22
+ end
23
+
24
+ it "should not follow external redirects" do
25
+ pending do
26
+ response = visit("http://localhost:9292/external_redirect")
27
+ response.should contain("Foo")
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ require "rubygems"
2
+ require "spec"
3
+
4
+ $LOAD_PATH.unshift File.dirname(__FILE__) + "/../../../../lib"
5
+ require "webrat"
6
+
7
+ Webrat.configure do |config|
8
+ config.mode = :mechanize
9
+ end
10
+
11
+ Spec::Runner.configure do |config|
12
+ config.include Webrat::Methods
13
+ config.include Webrat::Matchers
14
+
15
+ config.before :suite do
16
+ if File.exists?("rack.pid")
17
+ Process.kill("TERM", File.read("rack.pid").to_i)
18
+ end
19
+
20
+ system "rackup --daemonize --pid rack.pid config.ru"
21
+ end
22
+
23
+ config.after :suite do
24
+ if File.exists?("rack.pid")
25
+ Process.kill("TERM", File.read("rack.pid").to_i)
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,21 @@
1
+ .DS_Store
2
+ log/*
3
+ tmp/*
4
+ TAGS
5
+ *~
6
+ .#*
7
+ schema/schema.rb
8
+ schema/*_structure.sql
9
+ schema/*.sqlite3
10
+ schema/*.sqlite
11
+ schema/*.db
12
+ *.sqlite
13
+ *.sqlite3
14
+ *.db
15
+ src/*
16
+ .hgignore
17
+ .hg/*
18
+ .svn/*
19
+ gems/gems/*
20
+ gems/specifications/*
21
+ merb_profile_results