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,24 @@
1
+ module Webrat
2
+
3
+ def self.rexml_document(stringlike)
4
+ stringlike = stringlike.body.to_s if stringlike.respond_to?(:body)
5
+
6
+ case stringlike
7
+ when REXML::Document
8
+ stringlike.root
9
+ when REXML::Node, Array
10
+ stringlike
11
+ else
12
+ begin
13
+ REXML::Document.new(stringlike.to_s).root
14
+ rescue REXML::ParseException => e
15
+ if e.message.include?("second root element")
16
+ REXML::Document.new("<fake-root-element>#{stringlike}</fake-root-element>").root
17
+ else
18
+ raise e
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ end
@@ -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
+
@@ -0,0 +1,5 @@
1
+ class NilClass #:nodoc:
2
+ def to_param
3
+ nil
4
+ end
5
+ end
@@ -0,0 +1,27 @@
1
+ class TCPSocket
2
+
3
+ def self.wait_for_service_with_timeout(options)
4
+ start_time = Time.now
5
+
6
+ until listening_service?(options)
7
+ verbose_wait
8
+
9
+ if options[:timeout] && (Time.now > start_time + options[:timeout])
10
+ raise SocketError.new("Socket did not open within #{options[:timeout]} seconds")
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.wait_for_service_termination_with_timeout(options)
16
+ start_time = Time.now
17
+
18
+ while listening_service?(options)
19
+ verbose_wait
20
+
21
+ if options[:timeout] && (Time.now > start_time + options[:timeout])
22
+ raise SocketError.new("Socket did not terminate within #{options[:timeout]} seconds")
23
+ end
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,69 @@
1
+ require "webrat/culerity/session"
2
+ require "webrat/culerity/scope"
3
+ require "webrat/culerity/locator"
4
+ require "webrat/culerity/core_ext/button"
5
+ require "webrat/culerity/core_ext/container"
6
+ require "webrat/culerity/core_ext/frame"
7
+ require "webrat/culerity/core_ext/generic_field"
8
+ require "webrat/culerity/core_ext/socket"
9
+
10
+ module Webrat
11
+
12
+ def self.start_app_server #:nodoc:
13
+ pid_file = prepare_pid_file("#{RAILS_ROOT}/tmp/pids", "mongrel_culerity.pid")
14
+ system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.application_environment} --pid #{pid_file} &")
15
+ TCPSocket.wait_for_service :host => Webrat.configuration.application_address, :port => Webrat.configuration.application_port.to_i
16
+ end
17
+
18
+ def self.stop_app_server #:nodoc:
19
+ pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_culerity.pid")
20
+ system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}"
21
+ end
22
+
23
+ def self.prepare_pid_file(file_path, pid_file_name)
24
+ FileUtils.mkdir_p File.expand_path(file_path)
25
+ File.expand_path("#{file_path}/#{pid_file_name}")
26
+ end
27
+
28
+ # To use Webrat's Celerity support, activate it with (for example, in your <tt>env.rb</tt>):
29
+ #
30
+ # require "webrat"
31
+ # require "webrat/culerity"
32
+ #
33
+ # Webrat.configure do |config|
34
+ # config.mode = :culerity
35
+ # end
36
+ #
37
+ # == Auto-starting of the mongrel server
38
+ #
39
+ # Webrat will automatically start an instance of Mongrel when a test is run. The Mongrel will
40
+ # run in the "test" environment and will run on port 3001.
41
+ module Culerity
42
+ module Methods
43
+ def response
44
+ webrat_session.response
45
+ end
46
+
47
+ def execute_script(source)
48
+ webrat_session.execute_script(source)
49
+ end
50
+
51
+ def clear_cookies
52
+ webrat_session.clear_cookies
53
+ end
54
+
55
+ def within_frame(name, &block)
56
+ webrat_session.within_frame(name, &block)
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ module ActionController #:nodoc:
63
+ IntegrationTest.class_eval do
64
+ include Webrat::Methods
65
+ include Webrat::Matchers
66
+ include Webrat::HaveTagMatcher
67
+ include Webrat::Culerity::Methods
68
+ end
69
+ end
@@ -0,0 +1,6 @@
1
+ # Webrat matches button with alt as well, but Celerity doesn't list alt as a valid attribute
2
+ # for a button.
3
+ # class ::Celerity::Button
4
+ # remove_const :ATTRIBUTES if defined?(ATTRIBUTES) # shushes the warning
5
+ # ATTRIBUTES = BASE_ATTRIBUTES | [:type, :disabled, :tabindex, :accesskey, :onfocus, :onblur] | [:src, :usemap, :ismap] | [:alt]
6
+ # end
@@ -0,0 +1,13 @@
1
+ # module Celerity
2
+ # module Container
3
+ # # Used internally to update the page object.
4
+ # # @api private
5
+ # def update_page(page)
6
+ # @browser.page = page unless page.web_response.content_type == "application/json"
7
+ # end
8
+ #
9
+ # def generic_field(*args)
10
+ # GenericField.new(self, *args)
11
+ # end
12
+ # end
13
+ # end
@@ -0,0 +1,14 @@
1
+ # class Celerity::Frame
2
+ # # Fixes an exception that is raised when setting a field in a frame.
3
+ # # Fixed in kamal-celerity. Will remove when applied upstream.
4
+ # def locate
5
+ # super
6
+ # if @object
7
+ # @inline_frame_object = @object.getEnclosedWindow.getFrameElement
8
+ # self.page = @object.getEnclosedPage
9
+ # if (frame = self.page.getDocumentElement)
10
+ # @object = frame
11
+ # end
12
+ # end
13
+ # end
14
+ # end
@@ -0,0 +1,21 @@
1
+ # module Celerity
2
+ # class GenericField < Element
3
+ # include Container
4
+ # RADIO_CHECK = CheckBox::TAGS | Radio::TAGS
5
+ # TAGS = TextField::TAGS | Hidden::TAGS | RADIO_CHECK
6
+ # DEFAULT_HOW = :name
7
+ #
8
+ # def set?
9
+ # assert_exists
10
+ # assert_radio_check
11
+ # @object.isChecked
12
+ # end
13
+ # alias_method :checked?, :set?
14
+ #
15
+ # protected
16
+ # def assert_radio_check
17
+ # locator = ElementLocator.new(@container, self.class)
18
+ # raise "Not a radio or checkbox" unless RADIO_CHECK.any? { |ident| locator.send(:element_matches_ident?, @object, ident) }
19
+ # end
20
+ # end
21
+ # end
@@ -0,0 +1,21 @@
1
+ require 'timeout'
2
+ require 'socket'
3
+
4
+ class TCPSocket
5
+ def self.wait_for_service(options)
6
+ socket = nil
7
+ Timeout::timeout(options[:timeout] || 20) do
8
+ loop do
9
+ begin
10
+ socket = TCPSocket.new(options[:host], options[:port])
11
+ return
12
+ rescue Errno::ECONNREFUSED
13
+ puts ".\n"
14
+ sleep 2
15
+ end
16
+ end
17
+ end
18
+ ensure
19
+ socket.close unless socket.nil?
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ module Webrat
2
+ class CulerityLocator
3
+ def initialize(container, value, element_type, *how)
4
+ @container = container
5
+ @value = value
6
+ @element_type = element_type
7
+ @how = how.blank? ? [:id, :name, :label] : how
8
+ end
9
+
10
+ def locate
11
+ @how.each do |how|
12
+ e = @container.send(@element_type, how => @value)
13
+ return e if e.exists?
14
+ end
15
+ nil
16
+ end
17
+
18
+ def locate!
19
+ locate || raise(NotFoundError.new("#{@element_type} matching \"#{@value}\" not found"))
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,97 @@
1
+ module Webrat
2
+ class CulerityScope
3
+ attr_reader :container
4
+
5
+ def initialize(container)
6
+ @container = container
7
+ end
8
+
9
+ def check(id_or_name_or_label, value = true)
10
+ elem = element_locator(id_or_name_or_label, :check_box)
11
+ elem.set(value)
12
+ end
13
+
14
+ webrat_deprecate :checks, :check
15
+
16
+ def choose(id_or_name_or_label)
17
+ elem = element_locator(id_or_name_or_label, :radio)
18
+ elem.set
19
+ end
20
+
21
+ webrat_deprecate :chooses, :choose
22
+
23
+ def click_button(value_or_id_or_alt = nil, options = {})
24
+ options = value_or_id_or_alt if value_or_id_or_alt.is_a?(Hash)
25
+
26
+ with_handler options.delete(:confirm) do
27
+ if value_or_id_or_alt
28
+ elem = element_locator(value_or_id_or_alt, :button, :value, :id, :text, :alt)
29
+ else
30
+ elem = container.buttons[0] # celerity should really include Enumerable here
31
+ end
32
+ elem.click
33
+ end
34
+ end
35
+
36
+ webrat_deprecate :clicks_button, :click_button
37
+
38
+ def click_link(text_or_title_or_id, options = {})
39
+ with_handler options.delete(:confirm) do
40
+ elem = element_locator(text_or_title_or_id, :link, :text, :title, :id)
41
+ elem.click
42
+ end
43
+ end
44
+
45
+ webrat_deprecate :clicks_link, :click_link
46
+
47
+ def field_by_xpath(xpath)
48
+ element_locator(xpath, :generic_field, :xpath)
49
+ end
50
+
51
+ def field_labeled(label)
52
+ element_locator(label, :generic_field, :label)
53
+ end
54
+
55
+ def field_with_id(id)
56
+ element_locator(id, :generic_field, :id)
57
+ end
58
+
59
+ def fill_in(id_or_name_or_label, options = {})
60
+ elem = element_locator(id_or_name_or_label, :text_field)
61
+ elem.set(options[:with])
62
+ end
63
+
64
+ webrat_deprecate :fills_in, :fill_in
65
+
66
+ def response_body
67
+ container.html
68
+ end
69
+
70
+ def select(option_text, options = {})
71
+ elem = element_locator(options[:from], :select_list)
72
+ elem.select(option_text)
73
+ end
74
+
75
+ webrat_deprecate :selects, :select
76
+
77
+ def uncheck(id_or_name_or_label)
78
+ check(id_or_name_or_label, false)
79
+ end
80
+
81
+ webrat_deprecate :unchecks, :uncheck
82
+
83
+ protected
84
+
85
+ # Returns a +Culerity::Element+
86
+ def element_locator(locator, element, *how)
87
+ CulerityLocator.new(container, locator, element, *how).locate!
88
+ end
89
+
90
+ def with_handler(proc, &block)
91
+ old_handler = container.browser.webclient.confirm_handler
92
+ container.browser.webclient.confirm_handler = proc
93
+ block.call
94
+ container.browser.webclient.confirm_handler = old_handler
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,155 @@
1
+ require "culerity"
2
+ require "forwardable"
3
+ require "webrat/core/save_and_open_page"
4
+
5
+ module Webrat #:nodoc:
6
+ class CulerityResponse
7
+ attr_reader :body
8
+
9
+ def initialize(body)
10
+ @body = body
11
+ end
12
+ end
13
+
14
+ class CuleritySession #:nodoc:
15
+ include Webrat::SaveAndOpenPage
16
+ extend Forwardable
17
+
18
+ attr_reader :current_url
19
+
20
+ def initialize(*args) # :nodoc:
21
+ end
22
+
23
+ def response
24
+ CulerityResponse.new(response_body)
25
+ end
26
+
27
+ def visit(url = nil, http_method = :get, data = {})
28
+ reset
29
+ # TODO querify data
30
+ @current_url = container.goto(absolute_url(url))
31
+ end
32
+
33
+ webrat_deprecate :visits, :visit
34
+
35
+ def click_link_within(selector, text_or_title_or_id)
36
+ within(selector) do
37
+ click_link(text_or_title_or_id)
38
+ end
39
+ end
40
+
41
+ webrat_deprecate :clicks_link_within, :click_link_within
42
+
43
+ def reload
44
+ reset
45
+ container.refresh
46
+ end
47
+
48
+ webrat_deprecate :reloads, :reload
49
+
50
+ def clear_cookies
51
+ container.clear_cookies
52
+ end
53
+
54
+ def execute_script(source)
55
+ container.execute_script(source)
56
+ end
57
+
58
+ def current_scope
59
+ scopes.last || base_scope
60
+ end
61
+
62
+ def scopes
63
+ @_scopes ||= []
64
+ end
65
+
66
+ def base_scope
67
+ @_base_scope ||= CulerityScope.new(container)
68
+ end
69
+
70
+ def within(selector)
71
+ xpath = Webrat::XML.css_to_xpath(selector).first
72
+ scope = CulerityScope.new(container.element_by_xpath(xpath))
73
+ scopes.push(scope)
74
+ ret = yield
75
+ scopes.pop
76
+ return ret
77
+ end
78
+
79
+ def within_frame(name)
80
+ scope = CulerityScope.new(container.frame(:name => name))
81
+ scopes.push(scope)
82
+ if block_given?
83
+ ret = yield
84
+ scopes.pop
85
+ return ret
86
+ end
87
+ scope
88
+ end
89
+
90
+ def_delegators :current_scope, :check, :checks
91
+ def_delegators :current_scope, :choose, :chooses
92
+ def_delegators :current_scope, :click_button, :clicks_button
93
+ def_delegators :current_scope, :click_link, :clicks_link
94
+ def_delegators :current_scope, :fill_in, :fills_in
95
+ def_delegators :current_scope, :field_by_xpath
96
+ def_delegators :current_scope, :field_labeled
97
+ def_delegators :current_scope, :field_with_id
98
+ def_delegators :current_scope, :response_body
99
+ def_delegators :current_scope, :select, :selects
100
+ def_delegators :current_scope, :uncheck, :unchecks
101
+
102
+ protected
103
+
104
+ def container
105
+ setup unless $setup_done
106
+ unless @_browser
107
+ @_server = ::Culerity::run_server
108
+ @_browser = ::Culerity::RemoteBrowserProxy.new @_server, {:browser => :firefox, :log_level => :off}
109
+ at_exit do
110
+ @_browser.exit
111
+ @_server.close
112
+ end
113
+ end
114
+ @_browser
115
+ end
116
+
117
+ def absolute_url(url) #:nodoc:
118
+ if url =~ Regexp.new('^https?://')
119
+ url
120
+ elsif url =~ Regexp.new('^/')
121
+ "#{current_host}#{url}"
122
+ else
123
+ "#{current_host}/#{url}"
124
+ end
125
+ end
126
+
127
+ def current_host
128
+ @_current_host ||= [Webrat.configuration.application_address, Webrat.configuration.application_port].join(":")
129
+ end
130
+
131
+ def setup #:nodoc:
132
+ silence_stream(STDOUT) do
133
+ Webrat.start_app_server
134
+ end
135
+ teardown_at_exit
136
+ $setup_done = true
137
+ end
138
+
139
+ def teardown_at_exit #:nodoc:
140
+ at_exit do
141
+ silence_stream(STDOUT) do
142
+ Webrat.stop_app_server
143
+ end
144
+ end
145
+ end
146
+
147
+ private
148
+
149
+ def reset
150
+ @_scopes = nil
151
+ @_base_scope = nil
152
+ end
153
+
154
+ end
155
+ end