indirect-webrat 0.7.4

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 (218) hide show
  1. data/.document +4 -0
  2. data/.gitignore +21 -0
  3. data/Gemfile +14 -0
  4. data/History.txt +470 -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 +30 -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 +82 -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 +85 -0
  41. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  42. data/lib/webrat/core/matchers/have_xpath.rb +124 -0
  43. data/lib/webrat/core/methods.rb +73 -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 +362 -0
  47. data/lib/webrat/core/session.rb +318 -0
  48. data/lib/webrat/core/xml.rb +44 -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/rack.rb +9 -0
  57. data/lib/webrat/integrations/rails.rb +25 -0
  58. data/lib/webrat/integrations/rspec-rails.rb +11 -0
  59. data/lib/webrat/integrations/selenium.rb +11 -0
  60. data/lib/webrat/merb.rb +9 -0
  61. data/lib/webrat/rspec-rails.rb +2 -0
  62. data/lib/webrat/selenium.rb +70 -0
  63. data/lib/webrat/selenium/application_server_factory.rb +43 -0
  64. data/lib/webrat/selenium/application_servers.rb +5 -0
  65. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  66. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  67. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  68. data/lib/webrat/selenium/application_servers/rack.rb +51 -0
  69. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  70. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  72. data/lib/webrat/selenium/location_strategy_javascript/label.js +48 -0
  73. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  74. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  75. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  76. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  77. data/lib/webrat/selenium/matchers.rb +4 -0
  78. data/lib/webrat/selenium/matchers/have_content.rb +78 -0
  79. data/lib/webrat/selenium/matchers/have_selector.rb +57 -0
  80. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  81. data/lib/webrat/selenium/matchers/have_xpath.rb +53 -0
  82. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  83. data/lib/webrat/selenium/selenium_rc_server.rb +89 -0
  84. data/lib/webrat/selenium/selenium_session.rb +276 -0
  85. data/lib/webrat/selenium/silence_stream.rb +18 -0
  86. data/spec/fakes/test_adapter.rb +33 -0
  87. data/spec/integration/mechanize/Rakefile +7 -0
  88. data/spec/integration/mechanize/config.ru +2 -0
  89. data/spec/integration/mechanize/sample_app.rb +35 -0
  90. data/spec/integration/mechanize/spec/mechanize_spec.rb +30 -0
  91. data/spec/integration/mechanize/spec/spec_helper.rb +29 -0
  92. data/spec/integration/merb/.gitignore +21 -0
  93. data/spec/integration/merb/Rakefile +35 -0
  94. data/spec/integration/merb/app/controllers/application.rb +2 -0
  95. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  96. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  97. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  98. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  99. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  100. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  101. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  102. data/spec/integration/merb/config/environments/development.rb +15 -0
  103. data/spec/integration/merb/config/environments/rake.rb +11 -0
  104. data/spec/integration/merb/config/environments/test.rb +14 -0
  105. data/spec/integration/merb/config/init.rb +25 -0
  106. data/spec/integration/merb/config/rack.rb +11 -0
  107. data/spec/integration/merb/config/router.rb +34 -0
  108. data/spec/integration/merb/spec/spec.opts +1 -0
  109. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  110. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  111. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  112. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  113. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  114. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  115. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  116. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  117. data/spec/integration/rack/Rakefile +5 -0
  118. data/spec/integration/rack/app.rb +89 -0
  119. data/spec/integration/rack/test/helper.rb +20 -0
  120. data/spec/integration/rack/test/webrat_rack_test.rb +74 -0
  121. data/spec/integration/rails/.gitignore +3 -0
  122. data/spec/integration/rails/Rakefile +30 -0
  123. data/spec/integration/rails/app/controllers/application_controller.rb +15 -0
  124. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  125. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  126. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  127. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  128. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  129. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  130. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  131. data/spec/integration/rails/app/views/buttons/show.html.erb +9 -0
  132. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  133. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  134. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  135. data/spec/integration/rails/app/views/webrat/buttons.html.erb +9 -0
  136. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  137. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  138. data/spec/integration/rails/config/boot.rb +109 -0
  139. data/spec/integration/rails/config/environment.rb +12 -0
  140. data/spec/integration/rails/config/environments/development.rb +17 -0
  141. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  142. data/spec/integration/rails/config/environments/test.rb +22 -0
  143. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  144. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  145. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  146. data/spec/integration/rails/config/locales/en.yml +5 -0
  147. data/spec/integration/rails/config/routes.rb +19 -0
  148. data/spec/integration/rails/public/404.html +30 -0
  149. data/spec/integration/rails/public/422.html +30 -0
  150. data/spec/integration/rails/public/500.html +33 -0
  151. data/spec/integration/rails/script/about +4 -0
  152. data/spec/integration/rails/script/console +3 -0
  153. data/spec/integration/rails/script/dbconsole +3 -0
  154. data/spec/integration/rails/script/destroy +3 -0
  155. data/spec/integration/rails/script/generate +3 -0
  156. data/spec/integration/rails/script/performance/benchmarker +3 -0
  157. data/spec/integration/rails/script/performance/profiler +3 -0
  158. data/spec/integration/rails/script/performance/request +3 -0
  159. data/spec/integration/rails/script/plugin +3 -0
  160. data/spec/integration/rails/script/process/inspector +3 -0
  161. data/spec/integration/rails/script/process/reaper +3 -0
  162. data/spec/integration/rails/script/process/spawner +3 -0
  163. data/spec/integration/rails/script/runner +3 -0
  164. data/spec/integration/rails/script/server +3 -0
  165. data/spec/integration/rails/test/integration/button_click_test.rb +66 -0
  166. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  167. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  168. data/spec/integration/rails/test/integration/webrat_test.rb +123 -0
  169. data/spec/integration/rails/test/test_helper.rb +27 -0
  170. data/spec/integration/sinatra/Rakefile +5 -0
  171. data/spec/integration/sinatra/classic_app.rb +63 -0
  172. data/spec/integration/sinatra/modular_app.rb +15 -0
  173. data/spec/integration/sinatra/test/classic_app_test.rb +38 -0
  174. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  175. data/spec/integration/sinatra/test/test_helper.rb +16 -0
  176. data/spec/private/core/configuration_spec.rb +87 -0
  177. data/spec/private/core/field_spec.rb +83 -0
  178. data/spec/private/core/form_spec.rb +51 -0
  179. data/spec/private/core/link_spec.rb +24 -0
  180. data/spec/private/core/session_spec.rb +182 -0
  181. data/spec/private/mechanize/mechanize_adapter_spec.rb +96 -0
  182. data/spec/private/nokogiri_spec.rb +77 -0
  183. data/spec/private/rails/attaches_file_spec.rb +114 -0
  184. data/spec/private/rails/rails_adapter_spec.rb +79 -0
  185. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  186. data/spec/public/basic_auth_spec.rb +35 -0
  187. data/spec/public/check_spec.rb +191 -0
  188. data/spec/public/choose_spec.rb +118 -0
  189. data/spec/public/click_area_spec.rb +106 -0
  190. data/spec/public/click_button_spec.rb +494 -0
  191. data/spec/public/click_link_spec.rb +544 -0
  192. data/spec/public/fill_in_spec.rb +224 -0
  193. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  194. data/spec/public/locators/field_labeled_spec.rb +172 -0
  195. data/spec/public/locators/field_with_id_spec.rb +16 -0
  196. data/spec/public/matchers/contain_spec.rb +118 -0
  197. data/spec/public/matchers/have_selector_spec.rb +146 -0
  198. data/spec/public/matchers/have_tag_spec.rb +39 -0
  199. data/spec/public/matchers/have_xpath_spec.rb +165 -0
  200. data/spec/public/reload_spec.rb +10 -0
  201. data/spec/public/save_and_open_spec.rb +49 -0
  202. data/spec/public/select_date_spec.rb +112 -0
  203. data/spec/public/select_datetime_spec.rb +137 -0
  204. data/spec/public/select_spec.rb +474 -0
  205. data/spec/public/select_time_spec.rb +100 -0
  206. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  207. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  208. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  209. data/spec/public/set_hidden_field_spec.rb +5 -0
  210. data/spec/public/submit_form_spec.rb +56 -0
  211. data/spec/public/visit_spec.rb +58 -0
  212. data/spec/public/within_spec.rb +177 -0
  213. data/spec/rcov.opts +1 -0
  214. data/spec/spec.opts +2 -0
  215. data/spec/spec_helper.rb +53 -0
  216. data/vendor/selenium-server.jar +0 -0
  217. data/webrat.gemspec +355 -0
  218. metadata +424 -0
@@ -0,0 +1,318 @@
1
+ require "forwardable"
2
+ require "ostruct"
3
+
4
+ require "webrat/core/mime"
5
+ require "webrat/core/save_and_open_page"
6
+
7
+ module Webrat
8
+ # A page load or form submission returned an unsuccessful response code (500-599)
9
+ class PageLoadError < WebratError
10
+ end
11
+
12
+ class InfiniteRedirectError < WebratError
13
+ end
14
+
15
+ def self.session_class
16
+ if Webrat.configuration.mode == :selenium
17
+ SeleniumSession
18
+ else
19
+ Session
20
+ end
21
+ end
22
+
23
+ def self.adapter_class
24
+ case Webrat.configuration.mode
25
+ when :rails
26
+ RailsAdapter
27
+ when :merb
28
+ MerbAdapter
29
+ when :rack
30
+ RackAdapter
31
+ when :rack_test
32
+ warn("The :rack_test mode is deprecated. Please use :rack instead")
33
+ require "webrat/rack"
34
+ RackAdapter
35
+ when :sinatra
36
+ warn("The :sinatra mode is deprecated. Please use :rack instead")
37
+ SinatraAdapter
38
+ when :mechanize
39
+ MechanizeAdapter
40
+ else
41
+ raise WebratError.new(<<-STR)
42
+ Unknown Webrat mode: #{Webrat.configuration.mode.inspect}
43
+
44
+ Please ensure you have a Webrat configuration block that specifies a mode
45
+ in your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber).
46
+
47
+ This configure block supercedes the need to require "webrat/<framework>".
48
+
49
+ For example:
50
+
51
+ Webrat.configure do |config|
52
+ config.mode = :rails
53
+ end
54
+ STR
55
+ end
56
+ end
57
+
58
+ class Session
59
+ extend Forwardable
60
+ include Logging
61
+ include SaveAndOpenPage
62
+
63
+ attr_accessor :adapter
64
+
65
+ attr_reader :current_url
66
+ attr_reader :elements
67
+
68
+ def_delegators :@adapter, :response, :response_code, :response_body, :response_headers,
69
+ :response_body=, :response_code=,
70
+ :get, :post, :put, :delete
71
+
72
+ def initialize(adapter = nil)
73
+ @adapter = adapter
74
+ @http_method = :get
75
+ @data = {}
76
+ @default_headers = {}
77
+ @custom_headers = {}
78
+ @current_url = nil
79
+ reset
80
+ end
81
+
82
+ def current_dom #:nodoc:
83
+ current_scope.dom
84
+ end
85
+
86
+ # For backwards compatibility -- removing in 1.0
87
+ def current_page #:nodoc:
88
+ warn "current_page is deprecated and will be going away in the next release. Use current_url instead."
89
+ page = OpenStruct.new
90
+ page.url = @current_url
91
+ page.http_method = @http_method
92
+ page.data = @data
93
+ page
94
+ end
95
+
96
+ def header(key, value)
97
+ @custom_headers[key] = value
98
+ end
99
+
100
+ def http_accept(mime_type)
101
+ header('Accept', Webrat::MIME.mime_type(mime_type))
102
+ end
103
+
104
+ def basic_auth(user, pass)
105
+ encoded_login = ["#{user}:#{pass}"].pack("m*").gsub(/\n/, '')
106
+ header('HTTP_AUTHORIZATION', "Basic #{encoded_login}")
107
+ end
108
+
109
+ def headers #:nodoc:
110
+ @default_headers.dup.merge(@custom_headers.dup)
111
+ end
112
+
113
+ def request_page(url, http_method, data) #:nodoc:
114
+ h = headers
115
+ h['HTTP_REFERER'] = @current_url if @current_url
116
+
117
+ debug_log "REQUESTING PAGE: #{http_method.to_s.upcase} #{url} with #{data.inspect} and HTTP headers #{h.inspect}"
118
+
119
+ process_request(http_method, url, data, h)
120
+
121
+ save_and_open_page if exception_caught? && Webrat.configuration.open_error_files?
122
+ raise PageLoadError.new("Page load was not successful (Code: #{response_code.inspect}):\n#{formatted_error}") unless success_code?
123
+
124
+ reset
125
+
126
+ @current_url = url
127
+ @http_method = http_method
128
+ @data = data
129
+
130
+ if internal_redirect?
131
+ check_for_infinite_redirects
132
+ request_page(response_location, :get, {})
133
+ end
134
+
135
+ return response
136
+ end
137
+
138
+ def check_for_infinite_redirects
139
+ if current_url == response_location
140
+ @_identical_redirect_count ||= 0
141
+ @_identical_redirect_count += 1
142
+ end
143
+
144
+ if infinite_redirect_limit_exceeded?
145
+ raise InfiniteRedirectError.new("#{Webrat.configuration.infinite_redirect_limit} redirects to the same URL (#{current_url.inspect})")
146
+ end
147
+ end
148
+
149
+ def infinite_redirect_limit_exceeded?
150
+ Webrat.configuration.infinite_redirect_limit &&
151
+ (@_identical_redirect_count || 0) > Webrat.configuration.infinite_redirect_limit
152
+ end
153
+
154
+ def success_code? #:nodoc:
155
+ (200..499).include?(response_code)
156
+ end
157
+
158
+ def redirect? #:nodoc:
159
+ [301, 302, 303, 307].include?(response_code)
160
+ end
161
+
162
+ def internal_redirect?
163
+ return false unless redirect?
164
+ #should keep internal_redirects if the subdomain changes
165
+ current_host_domain = current_host.split('.')[-2..-1].join('.') rescue current_host
166
+ response_location_host_domain = response_location_host.split('.')[-2..-1].join('.') rescue response_location_host
167
+ current_host_domain == response_location_host_domain
168
+ end
169
+
170
+ #easy helper to pull out where we were redirected to
171
+ def redirected_to
172
+ redirect? ? response_location : nil
173
+ end
174
+
175
+ def exception_caught? #:nodoc:
176
+ response_body =~ /Exception caught/
177
+ end
178
+
179
+ def current_scope #:nodoc:
180
+ scopes.last || page_scope
181
+ end
182
+
183
+ # Reloads the last page requested. Note that this will resubmit forms
184
+ # and their data.
185
+ def reload
186
+ request_page(@current_url, @http_method, @data)
187
+ end
188
+
189
+ webrat_deprecate :reloads, :reload
190
+
191
+
192
+ # Works like click_link, but only looks for the link text within a given selector
193
+ #
194
+ # Example:
195
+ # click_link_within "#user_12", "Vote"
196
+ def click_link_within(selector, link_text)
197
+ within(selector) do
198
+ click_link(link_text)
199
+ end
200
+ end
201
+
202
+ webrat_deprecate :clicks_link_within, :click_link_within
203
+
204
+ def within(selector)
205
+ scopes.push(Scope.from_scope(self, current_scope, selector))
206
+ ret = yield(current_scope)
207
+ scopes.pop
208
+ return ret
209
+ end
210
+
211
+ # Issues a GET request for a page, follows any redirects, and verifies the final page
212
+ # load was successful.
213
+ #
214
+ # Example:
215
+ # visit "/"
216
+ def visit(url = nil, http_method = :get, data = {})
217
+ request_page(url, http_method, data)
218
+ end
219
+
220
+ webrat_deprecate :visits, :visit
221
+
222
+ # Redirects to the address given at headers["Location"].
223
+ #
224
+ # Example:
225
+ # click_button "Save"
226
+ # follow_redirect!
227
+ def follow_redirect!
228
+ raise "not a redirect! Got #{response_code}" unless redirect?
229
+ visit(response_location)
230
+ response_code
231
+ end
232
+
233
+ # Subclasses can override this to show error messages without html
234
+ def formatted_error #:nodoc:
235
+ response_body
236
+ end
237
+
238
+ def scopes #:nodoc:
239
+ @_scopes ||= []
240
+ end
241
+
242
+ def page_scope #:nodoc:
243
+ @_page_scope ||= Scope.from_page(self, response, response_body)
244
+ end
245
+
246
+ def dom
247
+ page_scope.dom
248
+ end
249
+
250
+ def xml_content_type?
251
+ false
252
+ end
253
+
254
+ def simulate
255
+ return if Webrat.configuration.mode == :selenium
256
+ yield
257
+ end
258
+
259
+ def automate
260
+ return unless Webrat.configuration.mode == :selenium
261
+ yield
262
+ end
263
+
264
+ def_delegators :current_scope, :fill_in, :fills_in
265
+ def_delegators :current_scope, :set_hidden_field
266
+ def_delegators :current_scope, :submit_form
267
+ def_delegators :current_scope, :check, :checks
268
+ def_delegators :current_scope, :uncheck, :unchecks
269
+ def_delegators :current_scope, :choose, :chooses
270
+ def_delegators :current_scope, :select, :selects
271
+ def_delegators :current_scope, :unselect, :unselects
272
+ def_delegators :current_scope, :select_datetime, :selects_datetime
273
+ def_delegators :current_scope, :select_date, :selects_date
274
+ def_delegators :current_scope, :select_time, :selects_time
275
+ def_delegators :current_scope, :attach_file, :attaches_file
276
+ def_delegators :current_scope, :click_area, :clicks_area
277
+ def_delegators :current_scope, :click_link, :clicks_link
278
+ def_delegators :current_scope, :click_button, :clicks_button
279
+ def_delegators :current_scope, :field_labeled
280
+ def_delegators :current_scope, :field_by_xpath
281
+ def_delegators :current_scope, :field_with_id
282
+ def_delegators :current_scope, :select_option
283
+ def_delegators :current_scope, :field_named
284
+
285
+ private
286
+
287
+ def process_request(http_method, url, data, headers)
288
+ if headers.empty?
289
+ send "#{http_method}", url, data || {}
290
+ else
291
+ send "#{http_method}", url, data || {}, headers
292
+ end
293
+ end
294
+
295
+ def response_location
296
+ response_headers['Location']
297
+ end
298
+
299
+ def current_host
300
+ URI.parse(current_url).host || @custom_headers["Host"] || default_current_host
301
+ end
302
+
303
+ def response_location_host
304
+ URI.parse(response_location).host || default_current_host
305
+ end
306
+
307
+ def default_current_host
308
+ adapter.session.rack_mock_session.default_host
309
+ end
310
+
311
+ def reset
312
+ @elements = {}
313
+ @_scopes = nil
314
+ @_page_scope = nil
315
+ end
316
+
317
+ end
318
+ end
@@ -0,0 +1,44 @@
1
+ require "webrat/core_extensions/meta_class"
2
+
3
+ module Webrat #:nodoc:
4
+ module XML #:nodoc:
5
+
6
+ def self.document(stringlike) #:nodoc:
7
+ return stringlike.dom if stringlike.respond_to?(:dom)
8
+
9
+ if Nokogiri::HTML::Document === stringlike
10
+ stringlike
11
+ elsif Nokogiri::XML::NodeSet === stringlike
12
+ stringlike
13
+ elsif stringlike.respond_to?(:body)
14
+ Nokogiri.parse(stringlike.body.to_s)
15
+ else
16
+ Nokogiri.parse(stringlike.to_s)
17
+ end
18
+ end
19
+
20
+ def self.define_dom_method(object, dom) #:nodoc:
21
+ object.meta_class.send(:define_method, :dom) do
22
+ dom
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+
29
+ module Nokogiri #:nodoc:
30
+ module CSS #:nodoc:
31
+ class XPathVisitor #:nodoc:
32
+
33
+ def visit_pseudo_class_text(node) #:nodoc:
34
+ "@type='text'"
35
+ end
36
+
37
+ def visit_pseudo_class_password(node) #:nodoc:
38
+ "@type='password'"
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,58 @@
1
+ class Object #:nodoc:
2
+ # An object is blank if it's false, empty, or a whitespace string.
3
+ # For example, "", " ", +nil+, [], and {} are blank.
4
+ #
5
+ # This simplifies
6
+ #
7
+ # if !address.nil? && !address.empty?
8
+ #
9
+ # to
10
+ #
11
+ # if !address.blank?
12
+ def blank?
13
+ respond_to?(:empty?) ? empty? : !self
14
+ end
15
+
16
+ # An object is present if it's not blank.
17
+ def present?
18
+ !blank?
19
+ end
20
+ end
21
+
22
+ class NilClass #:nodoc:
23
+ def blank?
24
+ true
25
+ end
26
+ end
27
+
28
+ class FalseClass #:nodoc:
29
+ def blank?
30
+ true
31
+ end
32
+ end
33
+
34
+ class TrueClass #:nodoc:
35
+ def blank?
36
+ false
37
+ end
38
+ end
39
+
40
+ class Array #:nodoc:
41
+ alias_method :blank?, :empty?
42
+ end
43
+
44
+ class Hash #:nodoc:
45
+ alias_method :blank?, :empty?
46
+ end
47
+
48
+ class String #:nodoc:
49
+ def blank?
50
+ self !~ /\S/
51
+ end
52
+ end
53
+
54
+ class Numeric #:nodoc:
55
+ def blank?
56
+ false
57
+ end
58
+ end
@@ -0,0 +1,8 @@
1
+ class Module #:nodoc:
2
+ def webrat_deprecate(old_method_name, new_method_name)
3
+ define_method old_method_name do |*args|
4
+ warn "#{old_method_name} is deprecated. Use #{new_method_name} instead."
5
+ __send__(new_method_name, *args)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ class Array #:nodoc:
2
+
3
+ def detect_mapped
4
+ each do |element|
5
+ result = yield element
6
+ return result if result
7
+ end
8
+
9
+ return nil
10
+ end
11
+
12
+ end
@@ -0,0 +1,6 @@
1
+ class ::Object #:nodoc:
2
+ def meta_class
3
+ class << self; self end
4
+ end
5
+ end
6
+