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,303 @@
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
+ # Subclasses can override this to show error messages without html
223
+ def formatted_error #:nodoc:
224
+ response_body
225
+ end
226
+
227
+ def scopes #:nodoc:
228
+ @_scopes ||= []
229
+ end
230
+
231
+ def page_scope #:nodoc:
232
+ @_page_scope ||= Scope.from_page(self, response, response_body)
233
+ end
234
+
235
+ def dom
236
+ page_scope.dom
237
+ end
238
+
239
+ def xml_content_type?
240
+ false
241
+ end
242
+
243
+ def simulate
244
+ return if Webrat.configuration.mode == :selenium
245
+ yield
246
+ end
247
+
248
+ def automate
249
+ return unless Webrat.configuration.mode == :selenium
250
+ yield
251
+ end
252
+
253
+ def_delegators :current_scope, :fill_in, :fills_in
254
+ def_delegators :current_scope, :set_hidden_field
255
+ def_delegators :current_scope, :submit_form
256
+ def_delegators :current_scope, :check, :checks
257
+ def_delegators :current_scope, :uncheck, :unchecks
258
+ def_delegators :current_scope, :choose, :chooses
259
+ def_delegators :current_scope, :select, :selects
260
+ def_delegators :current_scope, :unselect, :unselects
261
+ def_delegators :current_scope, :select_datetime, :selects_datetime
262
+ def_delegators :current_scope, :select_date, :selects_date
263
+ def_delegators :current_scope, :select_time, :selects_time
264
+ def_delegators :current_scope, :attach_file, :attaches_file
265
+ def_delegators :current_scope, :click_area, :clicks_area
266
+ def_delegators :current_scope, :click_link, :clicks_link
267
+ def_delegators :current_scope, :click_button, :clicks_button
268
+ def_delegators :current_scope, :field_labeled
269
+ def_delegators :current_scope, :field_by_xpath
270
+ def_delegators :current_scope, :field_with_id
271
+ def_delegators :current_scope, :select_option
272
+ def_delegators :current_scope, :field_named
273
+
274
+ private
275
+
276
+ def process_request(http_method, url, data, headers)
277
+ if headers.empty?
278
+ send "#{http_method}", url, data || {}
279
+ else
280
+ send "#{http_method}", url, data || {}, headers
281
+ end
282
+ end
283
+
284
+ def response_location
285
+ response_headers['Location']
286
+ end
287
+
288
+ def current_host
289
+ URI.parse(current_url).host || @custom_headers["Host"] || "www.example.com"
290
+ end
291
+
292
+ def response_location_host
293
+ URI.parse(response_location).host || "www.example.com"
294
+ end
295
+
296
+ def reset
297
+ @elements = {}
298
+ @_scopes = nil
299
+ @_page_scope = nil
300
+ end
301
+
302
+ end
303
+ end
@@ -0,0 +1,72 @@
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::HTML(stringlike.body.to_s)
15
+ else
16
+ Nokogiri::HTML(stringlike.to_s)
17
+ end
18
+ end
19
+
20
+ def self.html_document(stringlike) #:nodoc:
21
+ return stringlike.dom if stringlike.respond_to?(:dom)
22
+
23
+ if Nokogiri::HTML::Document === stringlike
24
+ stringlike
25
+ elsif Nokogiri::XML::NodeSet === stringlike
26
+ stringlike
27
+ elsif stringlike.respond_to?(:body)
28
+ Nokogiri::HTML(stringlike.body.to_s)
29
+ else
30
+ Nokogiri::HTML(stringlike.to_s)
31
+ end
32
+ end
33
+
34
+ def self.xml_document(stringlike) #:nodoc:
35
+ return stringlike.dom if stringlike.respond_to?(:dom)
36
+
37
+ if Nokogiri::HTML::Document === stringlike
38
+ stringlike
39
+ elsif Nokogiri::XML::NodeSet === stringlike
40
+ stringlike
41
+ elsif stringlike.respond_to?(:body)
42
+ Nokogiri::XML(stringlike.body.to_s)
43
+ else
44
+ Nokogiri::XML(stringlike.to_s)
45
+ end
46
+ end
47
+
48
+ def self.define_dom_method(object, dom) #:nodoc:
49
+ object.meta_class.send(:define_method, :dom) do
50
+ dom
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+
57
+ module Nokogiri #:nodoc:
58
+ module CSS #:nodoc:
59
+ class XPathVisitor #:nodoc:
60
+
61
+ def visit_pseudo_class_text(node) #:nodoc:
62
+ "@type='text'"
63
+ end
64
+
65
+ def visit_pseudo_class_password(node) #:nodoc:
66
+ "@type='password'"
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+
@@ -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