mkuklis-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 (213) hide show
  1. data/.document +4 -0
  2. data/.gitignore +15 -0
  3. data/History.txt +413 -0
  4. data/MIT-LICENSE.txt +19 -0
  5. data/README.rdoc +85 -0
  6. data/Rakefile +188 -0
  7. data/VERSION +1 -0
  8. data/install.rb +1 -0
  9. data/lib/webrat/adapters/mechanize.rb +78 -0
  10. data/lib/webrat/adapters/merb.rb +11 -0
  11. data/lib/webrat/adapters/rack.rb +25 -0
  12. data/lib/webrat/adapters/rails.rb +81 -0
  13. data/lib/webrat/adapters/sinatra.rb +9 -0
  14. data/lib/webrat/core/configuration.rb +92 -0
  15. data/lib/webrat/core/elements/area.rb +31 -0
  16. data/lib/webrat/core/elements/element.rb +33 -0
  17. data/lib/webrat/core/elements/field.rb +487 -0
  18. data/lib/webrat/core/elements/form.rb +103 -0
  19. data/lib/webrat/core/elements/label.rb +31 -0
  20. data/lib/webrat/core/elements/link.rb +93 -0
  21. data/lib/webrat/core/elements/select_option.rb +48 -0
  22. data/lib/webrat/core/locators/area_locator.rb +38 -0
  23. data/lib/webrat/core/locators/button_locator.rb +54 -0
  24. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  25. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  26. data/lib/webrat/core/locators/field_locator.rb +25 -0
  27. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  28. data/lib/webrat/core/locators/form_locator.rb +19 -0
  29. data/lib/webrat/core/locators/label_locator.rb +34 -0
  30. data/lib/webrat/core/locators/link_locator.rb +74 -0
  31. data/lib/webrat/core/locators/locator.rb +20 -0
  32. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  33. data/lib/webrat/core/locators.rb +20 -0
  34. data/lib/webrat/core/logging.rb +23 -0
  35. data/lib/webrat/core/matchers/have_content.rb +68 -0
  36. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  37. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  38. data/lib/webrat/core/matchers/have_xpath.rb +122 -0
  39. data/lib/webrat/core/matchers.rb +4 -0
  40. data/lib/webrat/core/methods.rb +64 -0
  41. data/lib/webrat/core/mime.rb +18 -0
  42. data/lib/webrat/core/save_and_open_page.rb +48 -0
  43. data/lib/webrat/core/scope.rb +365 -0
  44. data/lib/webrat/core/session.rb +306 -0
  45. data/lib/webrat/core/xml.rb +72 -0
  46. data/lib/webrat/core.rb +13 -0
  47. data/lib/webrat/core_extensions/blank.rb +58 -0
  48. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  49. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  50. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  51. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  52. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  53. data/lib/webrat/integrations/merb.rb +10 -0
  54. data/lib/webrat/integrations/rails.rb +25 -0
  55. data/lib/webrat/integrations/rspec-rails.rb +10 -0
  56. data/lib/webrat/integrations/selenium.rb +11 -0
  57. data/lib/webrat/merb.rb +9 -0
  58. data/lib/webrat/rspec-rails.rb +2 -0
  59. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  60. data/lib/webrat/selenium/application_servers/base.rb +54 -0
  61. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  62. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  63. data/lib/webrat/selenium/application_servers/rails.rb +67 -0
  64. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  65. data/lib/webrat/selenium/application_servers.rb +5 -0
  66. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  67. data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -0
  68. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  69. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  70. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  72. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  73. data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  74. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  75. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  76. data/lib/webrat/selenium/matchers.rb +4 -0
  77. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  78. data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
  79. data/lib/webrat/selenium/selenium_session.rb +272 -0
  80. data/lib/webrat/selenium/silence_stream.rb +18 -0
  81. data/lib/webrat/selenium.rb +70 -0
  82. data/lib/webrat.rb +18 -0
  83. data/spec/fakes/test_adapter.rb +37 -0
  84. data/spec/integration/mechanize/Rakefile +7 -0
  85. data/spec/integration/mechanize/config.ru +2 -0
  86. data/spec/integration/mechanize/sample_app.rb +20 -0
  87. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
  88. data/spec/integration/mechanize/spec/spec_helper.rb +27 -0
  89. data/spec/integration/merb/.gitignore +21 -0
  90. data/spec/integration/merb/Rakefile +35 -0
  91. data/spec/integration/merb/app/controllers/application.rb +2 -0
  92. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  93. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  94. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  95. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  96. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  97. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  98. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  99. data/spec/integration/merb/config/environments/development.rb +15 -0
  100. data/spec/integration/merb/config/environments/rake.rb +11 -0
  101. data/spec/integration/merb/config/environments/test.rb +14 -0
  102. data/spec/integration/merb/config/init.rb +25 -0
  103. data/spec/integration/merb/config/rack.rb +11 -0
  104. data/spec/integration/merb/config/router.rb +34 -0
  105. data/spec/integration/merb/spec/spec.opts +1 -0
  106. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  107. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  108. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  109. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  110. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  111. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  112. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  113. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  114. data/spec/integration/rack/Rakefile +5 -0
  115. data/spec/integration/rack/app.rb +89 -0
  116. data/spec/integration/rack/test/helper.rb +21 -0
  117. data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
  118. data/spec/integration/rails/.gitignore +3 -0
  119. data/spec/integration/rails/Rakefile +30 -0
  120. data/spec/integration/rails/app/controllers/application.rb +15 -0
  121. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  122. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  123. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  124. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  125. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  126. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  127. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  128. data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  129. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  130. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  131. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  132. data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  133. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  134. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  135. data/spec/integration/rails/config/boot.rb +109 -0
  136. data/spec/integration/rails/config/environment.rb +12 -0
  137. data/spec/integration/rails/config/environments/development.rb +17 -0
  138. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  139. data/spec/integration/rails/config/environments/test.rb +22 -0
  140. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  141. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  142. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  143. data/spec/integration/rails/config/locales/en.yml +5 -0
  144. data/spec/integration/rails/config/routes.rb +19 -0
  145. data/spec/integration/rails/public/404.html +30 -0
  146. data/spec/integration/rails/public/422.html +30 -0
  147. data/spec/integration/rails/public/500.html +33 -0
  148. data/spec/integration/rails/script/about +4 -0
  149. data/spec/integration/rails/script/console +3 -0
  150. data/spec/integration/rails/script/dbconsole +3 -0
  151. data/spec/integration/rails/script/destroy +3 -0
  152. data/spec/integration/rails/script/generate +3 -0
  153. data/spec/integration/rails/script/performance/benchmarker +3 -0
  154. data/spec/integration/rails/script/performance/profiler +3 -0
  155. data/spec/integration/rails/script/performance/request +3 -0
  156. data/spec/integration/rails/script/plugin +3 -0
  157. data/spec/integration/rails/script/process/inspector +3 -0
  158. data/spec/integration/rails/script/process/reaper +3 -0
  159. data/spec/integration/rails/script/process/spawner +3 -0
  160. data/spec/integration/rails/script/runner +3 -0
  161. data/spec/integration/rails/script/server +3 -0
  162. data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  163. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  164. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  165. data/spec/integration/rails/test/integration/webrat_test.rb +122 -0
  166. data/spec/integration/rails/test/test_helper.rb +26 -0
  167. data/spec/integration/sinatra/Rakefile +5 -0
  168. data/spec/integration/sinatra/classic_app.rb +64 -0
  169. data/spec/integration/sinatra/modular_app.rb +16 -0
  170. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  171. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  172. data/spec/integration/sinatra/test/test_helper.rb +17 -0
  173. data/spec/private/core/configuration_spec.rb +87 -0
  174. data/spec/private/core/field_spec.rb +85 -0
  175. data/spec/private/core/link_spec.rb +24 -0
  176. data/spec/private/core/session_spec.rb +200 -0
  177. data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -0
  178. data/spec/private/nokogiri_spec.rb +77 -0
  179. data/spec/private/rails/attaches_file_spec.rb +81 -0
  180. data/spec/private/rails/rails_adapter_spec.rb +86 -0
  181. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  182. data/spec/public/basic_auth_spec.rb +24 -0
  183. data/spec/public/check_spec.rb +191 -0
  184. data/spec/public/choose_spec.rb +118 -0
  185. data/spec/public/click_area_spec.rb +106 -0
  186. data/spec/public/click_button_spec.rb +494 -0
  187. data/spec/public/click_link_spec.rb +511 -0
  188. data/spec/public/fill_in_spec.rb +224 -0
  189. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  190. data/spec/public/locators/field_labeled_spec.rb +172 -0
  191. data/spec/public/locators/field_with_id_spec.rb +16 -0
  192. data/spec/public/matchers/contain_spec.rb +114 -0
  193. data/spec/public/matchers/have_selector_spec.rb +146 -0
  194. data/spec/public/matchers/have_tag_spec.rb +39 -0
  195. data/spec/public/matchers/have_xpath_spec.rb +136 -0
  196. data/spec/public/reload_spec.rb +10 -0
  197. data/spec/public/save_and_open_spec.rb +70 -0
  198. data/spec/public/select_date_spec.rb +112 -0
  199. data/spec/public/select_datetime_spec.rb +137 -0
  200. data/spec/public/select_spec.rb +455 -0
  201. data/spec/public/select_time_spec.rb +100 -0
  202. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  203. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  204. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  205. data/spec/public/set_hidden_field_spec.rb +5 -0
  206. data/spec/public/submit_form_spec.rb +5 -0
  207. data/spec/public/visit_spec.rb +58 -0
  208. data/spec/public/within_spec.rb +177 -0
  209. data/spec/rcov.opts +1 -0
  210. data/spec/spec.opts +2 -0
  211. data/spec/spec_helper.rb +54 -0
  212. data/vendor/selenium-server.jar +0 -0
  213. metadata +409 -0
data/Rakefile ADDED
@@ -0,0 +1,188 @@
1
+ require "rubygems"
2
+
3
+ begin
4
+ require 'jeweler'
5
+ rescue LoadError
6
+ desc "Install gem using sudo"
7
+ task(:install) do
8
+ $stderr.puts "Jeweler not available. `gem install jeweler` to install this gem"
9
+ end
10
+ else
11
+ Jeweler::Tasks.new do |s|
12
+ s.name = "mkuklis-webrat"
13
+ s.author = "Bryan Helmkamp"
14
+ s.email = "bryan" + "@" + "brynary.com"
15
+ s.homepage = "http://github.com/mkuklis/webrat"
16
+ s.summary = "Ruby Acceptance Testing for Web applications"
17
+ s.description = <<-EOS.strip
18
+ Webrat lets you quickly write expressive and robust acceptance tests
19
+ for a Ruby web application. It supports simulating a browser inside
20
+ a Ruby process to avoid the performance hit and browser dependency of
21
+ Selenium or Watir, but the same API can also be used to drive real
22
+ Selenium tests when necessary (eg. for testing AJAX interactions).
23
+ Most Ruby web frameworks and testing frameworks are supported.
24
+ EOS
25
+
26
+ s.rubyforge_project = "webrat"
27
+ s.extra_rdoc_files = %w[README.rdoc MIT-LICENSE.txt History.txt]
28
+
29
+ # Dependencies
30
+ s.add_dependency "nokogiri", ">= 1.2.0"
31
+ s.add_dependency "rack", ">= 1.0"
32
+
33
+ s.add_development_dependency "rails", ">= 2.3"
34
+ s.add_development_dependency "merb-core", ">= 1.0"
35
+ s.add_development_dependency "launchy"
36
+ end
37
+
38
+ Jeweler::RubyforgeTasks.new
39
+ end
40
+
41
+ begin
42
+ require 'spec/rake/spectask'
43
+ rescue LoadError
44
+ desc "Run specs"
45
+ task(:spec) { $stderr.puts '`gem install rspec` to run specs' }
46
+ else
47
+ desc "Run API and Core specs"
48
+ Spec::Rake::SpecTask.new do |t|
49
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
50
+ t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
51
+ end
52
+
53
+ desc "Run all specs in spec directory with RCov"
54
+ Spec::Rake::SpecTask.new(:rcov) do |t|
55
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
56
+ t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
57
+ t.rcov = true
58
+ t.rcov_opts = lambda do
59
+ IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
60
+ end
61
+ end
62
+ end
63
+
64
+ desc "Run everything against multiruby"
65
+ task :multiruby do
66
+ result = system "multiruby -S rake spec"
67
+ raise "Multiruby tests failed" unless result
68
+ result = system "jruby -S rake spec"
69
+ raise "JRuby tests failed" unless result
70
+
71
+ Dir.chdir "spec/integration/rails" do
72
+ result = system "multiruby -S rake test_unit:rails"
73
+ raise "Rails integration tests failed" unless result
74
+
75
+ result = system "jruby -S rake test_unit:rails"
76
+ raise "Rails integration tests failed" unless result
77
+ end
78
+
79
+ Dir.chdir "spec/integration/merb" do
80
+ result = system "multiruby -S rake spec"
81
+ raise "Merb integration tests failed" unless result
82
+
83
+ result = system "jruby -S rake spec"
84
+ raise "Rails integration tests failed" unless result
85
+ end
86
+
87
+ Dir.chdir "spec/integration/sinatra" do
88
+ result = system "multiruby -S rake test"
89
+ raise "Sinatra integration tests failed" unless result
90
+
91
+ result = system "jruby -S rake test"
92
+ raise "Sinatra integration tests failed" unless result
93
+ end
94
+
95
+ Dir.chdir "spec/integration/rack" do
96
+ result = system "multiruby -S rake test"
97
+ raise "Rack integration tests failed" unless result
98
+
99
+ result = system "jruby -S rake test"
100
+ raise "Rack integration tests failed" unless result
101
+ end
102
+
103
+ puts
104
+ puts "Multiruby OK!"
105
+ end
106
+
107
+ desc "Run each spec in isolation to test for dependency issues"
108
+ task :spec_deps do
109
+ Dir["spec/**/*_spec.rb"].each do |test|
110
+ if !system("spec #{test} &> /dev/null")
111
+ puts "Dependency Issues: #{test}"
112
+ end
113
+ end
114
+ end
115
+
116
+ namespace :spec do
117
+ desc "Run the integration specs"
118
+ task :integration => [
119
+ "integration:rack",
120
+ "integration:sinatra",
121
+ "integration:merb",
122
+ "integration:mechanize",
123
+ "integration:rails:webrat",
124
+ "integration:rails:selenium",
125
+ ]
126
+
127
+ namespace :integration do
128
+ namespace :rails do
129
+ task :selenium do
130
+ Dir.chdir "spec/integration/rails" do
131
+ result = system "rake test_unit:selenium"
132
+ raise "Rails integration tests failed" unless result
133
+ end
134
+ end
135
+
136
+ task :webrat do
137
+ Dir.chdir "spec/integration/rails" do
138
+ result = system "rake test_unit:rails"
139
+ raise "Rails integration tests failed" unless result
140
+ end
141
+ end
142
+ end
143
+
144
+ desc "Run the Merb integration specs"
145
+ task :merb do
146
+ Dir.chdir "spec/integration/merb" do
147
+ result = system "rake spec"
148
+ raise "Merb integration tests failed" unless result
149
+ end
150
+ end
151
+
152
+ desc "Run the Sinatra integration specs"
153
+ task :sinatra do
154
+ Dir.chdir "spec/integration/sinatra" do
155
+ result = system "rake test"
156
+ raise "Sinatra integration tests failed" unless result
157
+ end
158
+ end
159
+
160
+ desc "Run the Sinatra integration specs"
161
+ task :rack do
162
+ Dir.chdir "spec/integration/rack" do
163
+ result = system "rake test"
164
+ raise "Rack integration tests failed" unless result
165
+ end
166
+ end
167
+
168
+ desc "Run the Mechanize integration specs"
169
+ task :mechanize do
170
+ Dir.chdir "spec/integration/mechanize" do
171
+ result = system "rake spec"
172
+ raise "Mechanize integration tests failed" unless result
173
+ end
174
+ end
175
+ end
176
+ end
177
+
178
+ desc 'Removes trailing whitespace'
179
+ task :whitespace do
180
+ sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;}
181
+ end
182
+
183
+ if defined?(Jeweler)
184
+ task :spec => :check_dependencies
185
+ task :build => :gemspec
186
+ end
187
+
188
+ task :default => :spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ puts IO.read(File.join(File.dirname(__FILE__), 'README.rdoc'))
@@ -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,11 @@
1
+ require "webrat/integrations/merb"
2
+
3
+ module Webrat
4
+ class MerbAdapter < RackAdapter #:nodoc:
5
+ def initialize(context=nil)
6
+ app = context.respond_to?(:app) ?
7
+ context.app : Merb::Rack::Application.new
8
+ super(Rack::Test::Session.new(Rack::MockSession.new(app, "www.example.com")))
9
+ end
10
+ end
11
+ 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,81 @@
1
+ require "webrat/integrations/rails"
2
+ require "action_controller/record_identifier"
3
+
4
+ module Webrat
5
+ class RailsAdapter #:nodoc:
6
+ include ActionController::RecordIdentifier
7
+
8
+ attr_reader :integration_session
9
+
10
+ def initialize(session)
11
+ @integration_session = session
12
+ end
13
+
14
+ def doc_root
15
+ File.expand_path(File.join(RAILS_ROOT, 'public'))
16
+ end
17
+
18
+ def saved_page_dir
19
+ File.expand_path(File.join(RAILS_ROOT, "tmp"))
20
+ end
21
+
22
+ def get(url, data, headers = nil)
23
+ do_request(:get, url, data, headers)
24
+ end
25
+
26
+ def post(url, data, headers = nil)
27
+ do_request(:post, url, data, headers)
28
+ end
29
+
30
+ def put(url, data, headers = nil)
31
+ do_request(:put, url, data, headers)
32
+ end
33
+
34
+ def delete(url, data, headers = nil)
35
+ do_request(:delete, url, data, headers)
36
+ end
37
+
38
+ def response_body
39
+ response.body
40
+ end
41
+
42
+ def response_code
43
+ response.code.to_i
44
+ end
45
+
46
+ def xml_content_type?
47
+ response.headers["Content-Type"].to_s =~ /xml/
48
+ end
49
+
50
+ protected
51
+
52
+ def do_request(http_method, url, data, headers) #:nodoc:
53
+ update_protocol(url)
54
+ integration_session.send(http_method, normalize_url(url), data, headers)
55
+ end
56
+
57
+ # remove protocol, host and anchor
58
+ def normalize_url(href) #:nodoc:
59
+ uri = URI.parse(href)
60
+ normalized_url = []
61
+ normalized_url << "#{uri.scheme}://" if uri.scheme
62
+ normalized_url << uri.host if uri.host
63
+ normalized_url << ":#{uri.port}" if uri.port && ![80,443].include?(uri.port)
64
+ normalized_url << uri.path if uri.path
65
+ normalized_url << "?#{uri.query}" if uri.query
66
+ normalized_url.join
67
+ end
68
+
69
+ def update_protocol(href) #:nodoc:
70
+ if href =~ /^https:/
71
+ integration_session.https!(true)
72
+ elsif href =~ /^http:/
73
+ integration_session.https!(false)
74
+ end
75
+ end
76
+
77
+ def response #:nodoc:
78
+ integration_session.response
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,9 @@
1
+ module Webrat
2
+ class SinatraAdapter < RackAdapter
3
+ def initialize(context)
4
+ app = context.respond_to?(:app) ? context.app : Sinatra::Application
5
+
6
+ super(Rack::Test::Session.new(Rack::MockSession.new(app, "www.example.com")))
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,92 @@
1
+ require "webrat/core_extensions/deprecate"
2
+
3
+ module Webrat
4
+
5
+ # Configures Webrat. If this is not done, Webrat will be created
6
+ # with all of the default settings.
7
+ def self.configure(configuration = Webrat.configuration)
8
+ yield configuration if block_given?
9
+ @@configuration = configuration
10
+ end
11
+
12
+ def self.configuration # :nodoc:
13
+ @@configuration ||= Webrat::Configuration.new
14
+ end
15
+
16
+ # Webrat can be configured using the Webrat.configure method. For example:
17
+ #
18
+ # Webrat.configure do |config|
19
+ # config.mode = :sinatra
20
+ # end
21
+ class Configuration
22
+
23
+ # Webrat's mode, set automatically when requiring webrat/rails, webrat/merb, etc.
24
+ attr_reader :mode # :nodoc:
25
+
26
+ # Save and open pages with error status codes (500-599) in a browser? Defualts to true.
27
+ attr_writer :open_error_files
28
+
29
+ # Which rails environment should the selenium tests be run in? Defaults to selenium.
30
+ attr_accessor :application_environment
31
+ webrat_deprecate :selenium_environment, :application_environment
32
+ webrat_deprecate :selenium_environment=, :application_environment=
33
+
34
+ # Which port is the application running on for selenium testing? Defaults to 3001.
35
+ attr_accessor :application_port
36
+ webrat_deprecate :selenium_port, :application_port
37
+ webrat_deprecate :selenium_port=, :application_port=
38
+
39
+ # Which underlying app framework we're testing with selenium
40
+ attr_accessor :application_framework
41
+
42
+ # Which server the application is running on for selenium testing? Defaults to localhost
43
+ attr_accessor :application_address
44
+
45
+ # Which server Selenium server is running on. Defaults to nil(server starts in webrat process and runs locally)
46
+ attr_accessor :selenium_server_address
47
+
48
+ # Which server Selenium port is running on. Defaults to 4444
49
+ attr_accessor :selenium_server_port
50
+
51
+ # Set the key that Selenium uses to determine the browser running. Default *firefox
52
+ attr_accessor :selenium_browser_key
53
+
54
+ # Set the timeout for waiting for the browser process to start
55
+ attr_accessor :selenium_browser_startup_timeout
56
+
57
+ # How many redirects to the same URL should be halted as an infinite redirect
58
+ # loop? Defaults to 10
59
+ attr_accessor :infinite_redirect_limit
60
+
61
+ def initialize # :nodoc:
62
+ self.open_error_files = true
63
+ self.application_environment = :test
64
+ self.application_port = 3001
65
+ self.application_address = 'localhost'
66
+ self.application_framework = :rails
67
+ self.selenium_server_port = 4444
68
+ self.infinite_redirect_limit = 10
69
+ self.selenium_browser_key = '*firefox'
70
+ self.selenium_browser_startup_timeout = 5
71
+ end
72
+
73
+ def open_error_files? #:nodoc:
74
+ @open_error_files ? true : false
75
+ end
76
+
77
+ # Allows setting of webrat's mode, valid modes are:
78
+ # :rails, :selenium, :rack, :sinatra, :mechanize, :merb
79
+ def mode=(mode)
80
+ @mode = mode.to_sym
81
+
82
+ begin
83
+ require("webrat/integrations/#{mode}")
84
+ rescue LoadError
85
+ # Only some modes have integration code that needs to
86
+ # be loaded, so this is OK
87
+ end
88
+ end
89
+
90
+ end
91
+
92
+ end
@@ -0,0 +1,31 @@
1
+ require "webrat/core/elements/element"
2
+
3
+ module Webrat
4
+ class Area < Element #:nodoc:
5
+
6
+ def self.xpath_search
7
+ [".//area"]
8
+ end
9
+
10
+ def click(method = nil, options = {})
11
+ @session.request_page(absolute_href, :get, {})
12
+ end
13
+
14
+ protected
15
+
16
+ def href
17
+ @element["href"]
18
+ end
19
+
20
+ def absolute_href
21
+ if href =~ /^\?/
22
+ "#{@session.current_url}#{href}"
23
+ elsif href !~ %r{^https?://[\w|.]+(/.*)} && (href !~ /^\//)
24
+ "#{@session.current_url}/#{href}"
25
+ else
26
+ href
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ module Webrat
2
+
3
+ class Element # :nodoc:
4
+
5
+ def self.load_all(session, dom)
6
+ dom.xpath(*xpath_search).map do |element|
7
+ load(session, element)
8
+ end
9
+ end
10
+
11
+ def self.load(session, element)
12
+ return nil if element.nil?
13
+ session.elements[element.path] ||= self.new(session, element)
14
+ end
15
+
16
+ attr_reader :element
17
+
18
+ def initialize(session, element)
19
+ @session = session
20
+ @element = element
21
+ end
22
+
23
+ def path
24
+ @element.path
25
+ end
26
+
27
+ def inspect
28
+ "#<#{self.class} @element=#{element.inspect}>"
29
+ end
30
+
31
+ end
32
+
33
+ end