dstrelau-webrat 0.5.1

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 (225) hide show
  1. data/.document +4 -0
  2. data/.gitignore +15 -0
  3. data/History.txt +381 -0
  4. data/MIT-LICENSE.txt +19 -0
  5. data/README.rdoc +85 -0
  6. data/Rakefile +181 -0
  7. data/VERSION +1 -0
  8. data/install.rb +1 -0
  9. data/lib/webrat.rb +10 -0
  10. data/lib/webrat/core.rb +14 -0
  11. data/lib/webrat/core/configuration.rb +102 -0
  12. data/lib/webrat/core/elements/area.rb +31 -0
  13. data/lib/webrat/core/elements/element.rb +33 -0
  14. data/lib/webrat/core/elements/field.rb +411 -0
  15. data/lib/webrat/core/elements/form.rb +103 -0
  16. data/lib/webrat/core/elements/label.rb +31 -0
  17. data/lib/webrat/core/elements/link.rb +93 -0
  18. data/lib/webrat/core/elements/select_option.rb +35 -0
  19. data/lib/webrat/core/locators.rb +20 -0
  20. data/lib/webrat/core/locators/area_locator.rb +38 -0
  21. data/lib/webrat/core/locators/button_locator.rb +54 -0
  22. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  23. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  24. data/lib/webrat/core/locators/field_locator.rb +25 -0
  25. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  26. data/lib/webrat/core/locators/form_locator.rb +19 -0
  27. data/lib/webrat/core/locators/label_locator.rb +34 -0
  28. data/lib/webrat/core/locators/link_locator.rb +74 -0
  29. data/lib/webrat/core/locators/locator.rb +20 -0
  30. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  31. data/lib/webrat/core/logging.rb +24 -0
  32. data/lib/webrat/core/matchers.rb +4 -0
  33. data/lib/webrat/core/matchers/have_content.rb +73 -0
  34. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  35. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  36. data/lib/webrat/core/matchers/have_xpath.rb +147 -0
  37. data/lib/webrat/core/methods.rb +63 -0
  38. data/lib/webrat/core/mime.rb +18 -0
  39. data/lib/webrat/core/save_and_open_page.rb +48 -0
  40. data/lib/webrat/core/scope.rb +350 -0
  41. data/lib/webrat/core/session.rb +308 -0
  42. data/lib/webrat/core/xml.rb +115 -0
  43. data/lib/webrat/core/xml/hpricot.rb +19 -0
  44. data/lib/webrat/core/xml/nokogiri.rb +76 -0
  45. data/lib/webrat/core/xml/rexml.rb +24 -0
  46. data/lib/webrat/core_extensions/blank.rb +58 -0
  47. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  48. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  49. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  50. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  51. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  52. data/lib/webrat/culerity.rb +69 -0
  53. data/lib/webrat/culerity/core_ext/button.rb +6 -0
  54. data/lib/webrat/culerity/core_ext/container.rb +13 -0
  55. data/lib/webrat/culerity/core_ext/frame.rb +14 -0
  56. data/lib/webrat/culerity/core_ext/generic_field.rb +21 -0
  57. data/lib/webrat/culerity/core_ext/socket.rb +21 -0
  58. data/lib/webrat/culerity/locator.rb +22 -0
  59. data/lib/webrat/culerity/scope.rb +97 -0
  60. data/lib/webrat/culerity/session.rb +155 -0
  61. data/lib/webrat/mechanize.rb +78 -0
  62. data/lib/webrat/merb.rb +9 -0
  63. data/lib/webrat/merb_adapter.rb +82 -0
  64. data/lib/webrat/merb_multipart_support.rb +27 -0
  65. data/lib/webrat/rack.rb +25 -0
  66. data/lib/webrat/rails.rb +106 -0
  67. data/lib/webrat/rspec-rails.rb +10 -0
  68. data/lib/webrat/selenium.rb +80 -0
  69. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  70. data/lib/webrat/selenium/application_servers.rb +5 -0
  71. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  72. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  73. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  74. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  75. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  76. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  77. data/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  78. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  79. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +12 -0
  80. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  81. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  82. data/lib/webrat/selenium/matchers.rb +4 -0
  83. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  84. data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  85. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  86. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  87. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  88. data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
  89. data/lib/webrat/selenium/selenium_session.rb +248 -0
  90. data/lib/webrat/selenium/silence_stream.rb +18 -0
  91. data/lib/webrat/sinatra.rb +11 -0
  92. data/spec/fakes/test_adapter.rb +37 -0
  93. data/spec/integration/mechanize/Rakefile +7 -0
  94. data/spec/integration/mechanize/config.ru +2 -0
  95. data/spec/integration/mechanize/sample_app.rb +20 -0
  96. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
  97. data/spec/integration/mechanize/spec/spec_helper.rb +27 -0
  98. data/spec/integration/merb/.gitignore +21 -0
  99. data/spec/integration/merb/Rakefile +35 -0
  100. data/spec/integration/merb/app/controllers/application.rb +2 -0
  101. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  102. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  103. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  104. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  105. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  106. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  107. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  108. data/spec/integration/merb/config/environments/development.rb +15 -0
  109. data/spec/integration/merb/config/environments/rake.rb +11 -0
  110. data/spec/integration/merb/config/environments/test.rb +14 -0
  111. data/spec/integration/merb/config/init.rb +25 -0
  112. data/spec/integration/merb/config/rack.rb +11 -0
  113. data/spec/integration/merb/config/router.rb +34 -0
  114. data/spec/integration/merb/spec/spec.opts +1 -0
  115. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  116. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  117. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  118. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  119. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  120. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  121. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  122. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  123. data/spec/integration/rack/Rakefile +5 -0
  124. data/spec/integration/rack/app.rb +89 -0
  125. data/spec/integration/rack/test/helper.rb +21 -0
  126. data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
  127. data/spec/integration/rails/.gitignore +3 -0
  128. data/spec/integration/rails/Rakefile +30 -0
  129. data/spec/integration/rails/app/controllers/application.rb +15 -0
  130. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  131. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  132. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  133. data/spec/integration/rails/app/controllers/webrat_controller.rb +43 -0
  134. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  135. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  136. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  137. data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  138. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  139. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  140. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  141. data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  142. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  143. data/spec/integration/rails/config/boot.rb +109 -0
  144. data/spec/integration/rails/config/environment.rb +12 -0
  145. data/spec/integration/rails/config/environments/development.rb +17 -0
  146. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  147. data/spec/integration/rails/config/environments/test.rb +22 -0
  148. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  149. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  150. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  151. data/spec/integration/rails/config/locales/en.yml +5 -0
  152. data/spec/integration/rails/config/routes.rb +18 -0
  153. data/spec/integration/rails/public/404.html +30 -0
  154. data/spec/integration/rails/public/422.html +30 -0
  155. data/spec/integration/rails/public/500.html +33 -0
  156. data/spec/integration/rails/script/about +4 -0
  157. data/spec/integration/rails/script/console +3 -0
  158. data/spec/integration/rails/script/dbconsole +3 -0
  159. data/spec/integration/rails/script/destroy +3 -0
  160. data/spec/integration/rails/script/generate +3 -0
  161. data/spec/integration/rails/script/performance/benchmarker +3 -0
  162. data/spec/integration/rails/script/performance/profiler +3 -0
  163. data/spec/integration/rails/script/performance/request +3 -0
  164. data/spec/integration/rails/script/plugin +3 -0
  165. data/spec/integration/rails/script/process/inspector +3 -0
  166. data/spec/integration/rails/script/process/reaper +3 -0
  167. data/spec/integration/rails/script/process/spawner +3 -0
  168. data/spec/integration/rails/script/runner +3 -0
  169. data/spec/integration/rails/script/server +3 -0
  170. data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  171. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  172. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  173. data/spec/integration/rails/test/integration/webrat_test.rb +97 -0
  174. data/spec/integration/rails/test/test_helper.rb +26 -0
  175. data/spec/integration/sinatra/Rakefile +5 -0
  176. data/spec/integration/sinatra/classic_app.rb +64 -0
  177. data/spec/integration/sinatra/modular_app.rb +16 -0
  178. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  179. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  180. data/spec/integration/sinatra/test/test_helper.rb +17 -0
  181. data/spec/private/core/configuration_spec.rb +116 -0
  182. data/spec/private/core/field_spec.rb +85 -0
  183. data/spec/private/core/link_spec.rb +24 -0
  184. data/spec/private/core/logging_spec.rb +10 -0
  185. data/spec/private/core/session_spec.rb +200 -0
  186. data/spec/private/mechanize/mechanize_adapter_spec.rb +75 -0
  187. data/spec/private/merb/attaches_file_spec.rb +93 -0
  188. data/spec/private/merb/merb_adapter_spec.rb +61 -0
  189. data/spec/private/nokogiri_spec.rb +77 -0
  190. data/spec/private/rails/attaches_file_spec.rb +81 -0
  191. data/spec/private/rails/rails_adapter_spec.rb +112 -0
  192. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  193. data/spec/public/basic_auth_spec.rb +24 -0
  194. data/spec/public/check_spec.rb +191 -0
  195. data/spec/public/choose_spec.rb +118 -0
  196. data/spec/public/click_area_spec.rb +106 -0
  197. data/spec/public/click_button_spec.rb +496 -0
  198. data/spec/public/click_link_spec.rb +511 -0
  199. data/spec/public/fill_in_spec.rb +209 -0
  200. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  201. data/spec/public/locators/field_labeled_spec.rb +172 -0
  202. data/spec/public/locators/field_with_id_spec.rb +16 -0
  203. data/spec/public/matchers/contain_spec.rb +114 -0
  204. data/spec/public/matchers/have_selector_spec.rb +142 -0
  205. data/spec/public/matchers/have_tag_spec.rb +39 -0
  206. data/spec/public/matchers/have_xpath_spec.rb +136 -0
  207. data/spec/public/reload_spec.rb +10 -0
  208. data/spec/public/save_and_open_spec.rb +70 -0
  209. data/spec/public/select_date_spec.rb +112 -0
  210. data/spec/public/select_datetime_spec.rb +137 -0
  211. data/spec/public/select_spec.rb +249 -0
  212. data/spec/public/select_time_spec.rb +100 -0
  213. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  214. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  215. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  216. data/spec/public/set_hidden_field_spec.rb +5 -0
  217. data/spec/public/submit_form_spec.rb +5 -0
  218. data/spec/public/visit_spec.rb +58 -0
  219. data/spec/public/within_spec.rb +177 -0
  220. data/spec/rcov.opts +1 -0
  221. data/spec/spec.opts +2 -0
  222. data/spec/spec_helper.rb +52 -0
  223. data/vendor/selenium-server.jar +0 -0
  224. data/webrat.gemspec +365 -0
  225. metadata +387 -0
@@ -0,0 +1,78 @@
1
+ require "mechanize"
2
+
3
+ module Webrat #:nodoc:
4
+ class MechanizeAdapter #:nodoc:
5
+ extend Forwardable
6
+
7
+ attr_accessor :response
8
+ alias :page :response
9
+
10
+ def initialize(*args)
11
+ end
12
+
13
+ def request_page(url, http_method, data) #:nodoc:
14
+ super(absolute_url(url), http_method, data)
15
+ end
16
+
17
+ def get(url, data, headers_argument_not_used = nil)
18
+ @response = mechanize.get(url, data)
19
+ end
20
+
21
+ def post(url, data, headers_argument_not_used = nil)
22
+ post_data = data.inject({}) do |memo, param|
23
+ case param.last
24
+ when Hash
25
+ param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
26
+ else
27
+ memo[param.first] = param.last
28
+ end
29
+ memo
30
+ end
31
+ @response = mechanize.post(url, post_data)
32
+ end
33
+
34
+ def response_body
35
+ @response.content
36
+ end
37
+
38
+ def response_code
39
+ @response.code.to_i
40
+ end
41
+
42
+ def mechanize
43
+ @mechanize ||= WWW::Mechanize.new
44
+ end
45
+
46
+ def_delegators :mechanize, :basic_auth
47
+
48
+ def absolute_url(url) #:nodoc:
49
+ current_host, current_path = split_current_url
50
+ if url =~ Regexp.new('^https?://')
51
+ url
52
+ elsif url =~ Regexp.new('^/')
53
+ current_host + url
54
+ elsif url =~ Regexp.new('^\.')
55
+ current_host + absolute_path(current_path, url)
56
+ else
57
+ url
58
+ end
59
+ end
60
+
61
+ private
62
+ def split_current_url
63
+ current_url =~ Regexp.new('^(https?://[^/]+)(/.*)?')
64
+ [Regexp.last_match(1), Regexp.last_match(2)]
65
+ end
66
+
67
+ def absolute_path(current_path, url)
68
+ levels_up = url.split('/').find_all { |x| x == '..' }.size
69
+ ancestor = if current_path.nil?
70
+ ""
71
+ else
72
+ current_path.split("/")[0..(-1 - levels_up)].join("/")
73
+ end
74
+ descendent = url.split("/")[levels_up..-1].join
75
+ "#{ancestor}/#{descendent}"
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,9 @@
1
+ require "webrat"
2
+
3
+ # This is a temporary hack to support backwards compatibility
4
+ # with Merb 1.0.8 until it's updated to use the new Webrat.configure
5
+ # syntax
6
+
7
+ Webrat.configure do |config|
8
+ config.mode = :merb
9
+ end
@@ -0,0 +1,82 @@
1
+ require "webrat"
2
+ require "merb-core"
3
+ require "webrat/merb_multipart_support"
4
+
5
+ module Webrat
6
+ class MerbAdapter #:nodoc:
7
+ include Merb::Test::MakeRequest
8
+
9
+ # Include Webrat's own version of multipart_post/put because the officially
10
+ # supported methods in Merb don't perform the request correctly.
11
+ include MerbMultipartSupport
12
+
13
+ attr_accessor :response
14
+
15
+ def initialize(context=nil); end
16
+
17
+ def get(url, data, headers = nil)
18
+ do_request(url, data, headers, "GET")
19
+ end
20
+
21
+ def post(url, data, headers = nil)
22
+ do_request(url, data, headers, "POST")
23
+ end
24
+
25
+ def put(url, data, headers = nil)
26
+ do_request(url, data, headers, "PUT")
27
+ end
28
+
29
+ def delete(url, data, headers = nil)
30
+ do_request(url, data, headers, "DELETE")
31
+ end
32
+
33
+ def response_body
34
+ @response.body.to_s
35
+ end
36
+
37
+ def response_code
38
+ @response.status
39
+ end
40
+
41
+ def do_request(url, data, headers, method)
42
+ if method == "POST" && has_file?(data)
43
+ @response = multipart_post(url, data, :headers => headers)
44
+
45
+ elsif method == "PUT" && has_file?(data)
46
+ @response = multipart_put(url, data, :headers => headers)
47
+
48
+ else
49
+ @response = request(url,
50
+ :params => (data && data.any?) ? data : nil,
51
+ :headers => headers,
52
+ :method => method)
53
+ end
54
+ end
55
+
56
+ protected
57
+
58
+ # Recursively search the data for a file attachment.
59
+ def has_file?(data)
60
+ data.each do |key, value|
61
+ if value.is_a?(Hash)
62
+ return has_file?(value)
63
+ else
64
+ return true if value.is_a?(File)
65
+ end
66
+ end
67
+ return false
68
+ end
69
+
70
+ end
71
+ end
72
+
73
+ module Merb #:nodoc:
74
+ module Test #:nodoc:
75
+ module RequestHelper #:nodoc:
76
+ def request(uri, env = {})
77
+ @_webrat_session ||= Webrat::MerbAdapter.new
78
+ @_webrat_session.response = @_webrat_session.request(uri, env)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,27 @@
1
+ module Webrat
2
+
3
+ # These methods are copied from merb-core/two-oh.rb which defines new
4
+ # multipart_post and multipart_put methods for Merb::Test::MultipartRequestHelper.
5
+ # We can't require two-oh.rb because it alters Merb's own behavior, causing
6
+ # failing specs in Merb when Webrat is required.
7
+ module MerbMultipartSupport
8
+ def multipart_request(path, params = {}, env = {})
9
+ multipart = Merb::Test::MultipartRequestHelper::Post.new(params)
10
+ body, head = multipart.to_multipart
11
+ env["CONTENT_TYPE"] = head
12
+ env["CONTENT_LENGTH"] = body.size
13
+ env[:input] = StringIO.new(body)
14
+ request(path, env)
15
+ end
16
+
17
+ def multipart_post(path, params = {}, env = {})
18
+ env[:method] = "POST"
19
+ multipart_request(path, params, env)
20
+ end
21
+
22
+ def multipart_put(path, params = {}, env = {}, &block)
23
+ env[:method] = "PUT"
24
+ multipart_request(path, params, env)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ require "rack/test"
2
+
3
+ module Webrat
4
+ class RackAdapter
5
+ extend Forwardable
6
+
7
+ def_delegators :@session, :get, :post, :put, :delete
8
+
9
+ def initialize(session) #:nodoc:
10
+ @session = session
11
+ end
12
+
13
+ def response_body
14
+ response.body
15
+ end
16
+
17
+ def response_code
18
+ response.status
19
+ end
20
+
21
+ def response
22
+ @session.last_response
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,106 @@
1
+ require "webrat"
2
+
3
+ require "action_controller"
4
+ require "action_controller/integration"
5
+ require "action_controller/record_identifier"
6
+
7
+ module Webrat
8
+ class RailsAdapter #:nodoc:
9
+ include ActionController::RecordIdentifier
10
+
11
+ attr_reader :integration_session
12
+
13
+ def initialize(session)
14
+ @integration_session = session
15
+ end
16
+
17
+ # The Rails version of within supports passing in a model and Webrat
18
+ # will apply a scope based on Rails' dom_id for that model.
19
+ #
20
+ # Example:
21
+ # within User.last do
22
+ # click_link "Delete"
23
+ # end
24
+ def within(selector_or_object, &block)
25
+ if selector_or_object.is_a?(String)
26
+ super
27
+ else
28
+ super('#' + dom_id(selector_or_object), &block)
29
+ end
30
+ end
31
+
32
+ def doc_root
33
+ File.expand_path(File.join(RAILS_ROOT, 'public'))
34
+ end
35
+
36
+ def saved_page_dir
37
+ File.expand_path(File.join(RAILS_ROOT, "tmp"))
38
+ end
39
+
40
+ def get(url, data, headers = nil)
41
+ do_request(:get, url, data, headers)
42
+ end
43
+
44
+ def post(url, data, headers = nil)
45
+ do_request(:post, url, data, headers)
46
+ end
47
+
48
+ def put(url, data, headers = nil)
49
+ do_request(:put, url, data, headers)
50
+ end
51
+
52
+ def delete(url, data, headers = nil)
53
+ do_request(:delete, url, data, headers)
54
+ end
55
+
56
+ def response_body
57
+ response.body
58
+ end
59
+
60
+ def response_code
61
+ response.code.to_i
62
+ end
63
+
64
+ def xml_content_type?
65
+ response.headers["Content-Type"].to_s =~ /xml/
66
+ end
67
+
68
+ protected
69
+
70
+ def do_request(http_method, url, data, headers) #:nodoc:
71
+ update_protocol(url)
72
+ integration_session.send(http_method, normalize_url(url), data, headers)
73
+ end
74
+
75
+ # remove protocol, host and anchor
76
+ def normalize_url(href) #:nodoc:
77
+ uri = URI.parse(href)
78
+ normalized_url = []
79
+ normalized_url << "#{uri.scheme}://" if uri.scheme
80
+ normalized_url << uri.host if uri.host
81
+ normalized_url << ":#{uri.port}" if uri.port && ![80,443].include?(uri.port)
82
+ normalized_url << uri.path if uri.path
83
+ normalized_url << "?#{uri.query}" if uri.query
84
+ normalized_url.join
85
+ end
86
+
87
+ def update_protocol(href) #:nodoc:
88
+ if href =~ /^https:/
89
+ integration_session.https!(true)
90
+ elsif href =~ /^http:/
91
+ integration_session.https!(false)
92
+ end
93
+ end
94
+
95
+ def response #:nodoc:
96
+ integration_session.response
97
+ end
98
+ end
99
+ end
100
+
101
+ module ActionController #:nodoc:
102
+ IntegrationTest.class_eval do
103
+ include Webrat::Methods
104
+ include Webrat::Matchers
105
+ end
106
+ end
@@ -0,0 +1,10 @@
1
+ # Supports using the matchers in controller, helper, and view specs if you're
2
+ # using rspec-rails. Just add a require statement to spec/spec_helper.rb or env.rb:
3
+ #
4
+ # require 'webrat/rspec-rails'
5
+ #
6
+ require "webrat/core/matchers"
7
+
8
+ Spec::Runner.configure do |config|
9
+ config.include(Webrat::Matchers, :type => [:controller, :helper, :view])
10
+ end
@@ -0,0 +1,80 @@
1
+ require "webrat"
2
+ require "selenium/client"
3
+ require "webrat/selenium/silence_stream"
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,40 @@
1
+ module Webrat
2
+ module Selenium
3
+
4
+ class ApplicationServerFactory
5
+
6
+ def self.app_server_instance
7
+ case Webrat.configuration.application_framework
8
+ when :sinatra
9
+ require "webrat/selenium/application_servers/sinatra"
10
+ return Webrat::Selenium::ApplicationServers::Sinatra.new
11
+ when :merb
12
+ require "webrat/selenium/application_servers/merb"
13
+ return Webrat::Selenium::ApplicationServers::Merb.new
14
+ when :rails
15
+ require "webrat/selenium/application_servers/rails"
16
+ return Webrat::Selenium::ApplicationServers::Rails.new
17
+ when :external
18
+ require "webrat/selenium/application_servers/external"
19
+ return Webrat::Selenium::ApplicationServers::External.new
20
+ else
21
+ raise WebratError.new(<<-STR)
22
+ Unknown Webrat application_framework: #{Webrat.configuration.application_framework.inspect}
23
+
24
+ Please ensure you have a Webrat configuration block that specifies an application_framework
25
+ in your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber).
26
+
27
+ For example:
28
+
29
+ Webrat.configure do |config|
30
+ # ...
31
+ config.application_framework = :rails
32
+ end
33
+ STR
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end