kbaum-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 (214) hide show
  1. data/.document +4 -0
  2. data/.gitignore +15 -0
  3. data/History.txt +406 -0
  4. data/MIT-LICENSE.txt +19 -0
  5. data/README.rdoc +85 -0
  6. data/Rakefile +186 -0
  7. data/VERSION +1 -0
  8. data/install.rb +1 -0
  9. data/lib/webrat.rb +18 -0
  10. data/lib/webrat/adapters/mechanize.rb +78 -0
  11. data/lib/webrat/adapters/merb.rb +11 -0
  12. data/lib/webrat/adapters/rack.rb +25 -0
  13. data/lib/webrat/adapters/rails.rb +96 -0
  14. data/lib/webrat/adapters/sinatra.rb +9 -0
  15. data/lib/webrat/core.rb +13 -0
  16. data/lib/webrat/core/configuration.rb +96 -0
  17. data/lib/webrat/core/elements/area.rb +31 -0
  18. data/lib/webrat/core/elements/element.rb +33 -0
  19. data/lib/webrat/core/elements/field.rb +487 -0
  20. data/lib/webrat/core/elements/form.rb +103 -0
  21. data/lib/webrat/core/elements/label.rb +31 -0
  22. data/lib/webrat/core/elements/link.rb +93 -0
  23. data/lib/webrat/core/elements/select_option.rb +48 -0
  24. data/lib/webrat/core/locators.rb +20 -0
  25. data/lib/webrat/core/locators/area_locator.rb +38 -0
  26. data/lib/webrat/core/locators/button_locator.rb +54 -0
  27. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  28. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  29. data/lib/webrat/core/locators/field_locator.rb +25 -0
  30. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  31. data/lib/webrat/core/locators/form_locator.rb +19 -0
  32. data/lib/webrat/core/locators/label_locator.rb +34 -0
  33. data/lib/webrat/core/locators/link_locator.rb +74 -0
  34. data/lib/webrat/core/locators/locator.rb +20 -0
  35. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  36. data/lib/webrat/core/logging.rb +23 -0
  37. data/lib/webrat/core/matchers.rb +4 -0
  38. data/lib/webrat/core/matchers/have_content.rb +68 -0
  39. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  40. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  41. data/lib/webrat/core/matchers/have_xpath.rb +122 -0
  42. data/lib/webrat/core/methods.rb +64 -0
  43. data/lib/webrat/core/mime.rb +18 -0
  44. data/lib/webrat/core/save_and_open_page.rb +48 -0
  45. data/lib/webrat/core/scope.rb +365 -0
  46. data/lib/webrat/core/session.rb +307 -0
  47. data/lib/webrat/core/xml.rb +72 -0
  48. data/lib/webrat/core_extensions/blank.rb +58 -0
  49. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  50. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  51. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  52. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  53. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  54. data/lib/webrat/integrations/merb.rb +10 -0
  55. data/lib/webrat/integrations/rails.rb +9 -0
  56. data/lib/webrat/integrations/rspec-rails.rb +10 -0
  57. data/lib/webrat/integrations/selenium.rb +11 -0
  58. data/lib/webrat/merb.rb +9 -0
  59. data/lib/webrat/rspec-rails.rb +2 -0
  60. data/lib/webrat/selenium.rb +70 -0
  61. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  62. data/lib/webrat/selenium/application_servers.rb +5 -0
  63. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  64. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  65. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  66. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  67. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  68. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  69. data/lib/webrat/selenium/location_strategy_javascript/label.js +24 -0
  70. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +12 -0
  72. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  73. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  74. data/lib/webrat/selenium/matchers.rb +4 -0
  75. data/lib/webrat/selenium/matchers/have_content.rb +66 -0
  76. data/lib/webrat/selenium/matchers/have_selector.rb +74 -0
  77. data/lib/webrat/selenium/matchers/have_tag.rb +49 -0
  78. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  79. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  80. data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
  81. data/lib/webrat/selenium/selenium_session.rb +250 -0
  82. data/lib/webrat/selenium/silence_stream.rb +18 -0
  83. data/selenium_rc_server.patch +20 -0
  84. data/spec/fakes/test_adapter.rb +37 -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 +20 -0
  88. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
  89. data/spec/integration/mechanize/spec/spec_helper.rb +27 -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 +21 -0
  118. data/spec/integration/rack/test/webrat_rack_test.rb +73 -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.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 +43 -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 +11 -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 +11 -0
  134. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -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 +18 -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 +97 -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 +110 -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. data/webrat.gemspec +356 -0
  214. metadata +410 -0
data/Rakefile ADDED
@@ -0,0 +1,186 @@
1
+ require "rubygems"
2
+
3
+ begin
4
+ require 'jeweler'
5
+
6
+ Jeweler::Tasks.new do |s|
7
+ s.name = "kbaum-webrat"
8
+ s.author = "Bryan Helmkamp"
9
+ s.email = "bryan" + "@" + "brynary.com"
10
+ s.homepage = "http://github.com/brynary/webrat"
11
+ s.summary = "Ruby Acceptance Testing for Web applications"
12
+ s.description = <<-EOS.strip
13
+ Webrat lets you quickly write expressive and robust acceptance tests
14
+ for a Ruby web application. It supports simulating a browser inside
15
+ a Ruby process to avoid the performance hit and browser dependency of
16
+ Selenium or Watir, but the same API can also be used to drive real
17
+ Selenium tests when necessary (eg. for testing AJAX interactions).
18
+ Most Ruby web frameworks and testing frameworks are supported.
19
+ EOS
20
+
21
+ s.rubyforge_project = "webrat"
22
+ s.extra_rdoc_files = %w[README.rdoc MIT-LICENSE.txt History.txt]
23
+
24
+ # Dependencies
25
+ s.add_dependency "nokogiri", ">= 1.2.0"
26
+ s.add_dependency "rack", ">= 1.0"
27
+
28
+ s.add_development_dependency "rails", ">= 2.3"
29
+ s.add_development_dependency "merb-core", ">= 1.0"
30
+ s.add_development_dependency "launchy"
31
+ end
32
+
33
+ Jeweler::RubyforgeTasks.new
34
+ rescue LoadError
35
+ puts "Jeweler not available. Install it with: gem install jeweler"
36
+ end
37
+
38
+ # require 'spec'
39
+ require 'spec/rake/spectask'
40
+ require 'spec/rake/verify_rcov'
41
+
42
+ desc "Run API and Core specs"
43
+ Spec::Rake::SpecTask.new do |t|
44
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
45
+ t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
46
+ end
47
+
48
+ desc "Run all specs in spec directory with RCov"
49
+ Spec::Rake::SpecTask.new(:rcov) do |t|
50
+ t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
51
+ t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
52
+ t.rcov = true
53
+ t.rcov_opts = lambda do
54
+ IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
55
+ end
56
+ end
57
+
58
+ RCov::VerifyTask.new(:verify_rcov => :rcov) do |t|
59
+ t.threshold = 96.2 # Make sure you have rcov 0.7 or higher!
60
+ end
61
+
62
+ desc "Run everything against multiruby"
63
+ task :multiruby do
64
+ result = system "multiruby -S rake spec"
65
+ raise "Multiruby tests failed" unless result
66
+ result = system "jruby -S rake spec"
67
+ raise "JRuby tests failed" unless result
68
+
69
+ Dir.chdir "spec/integration/rails" do
70
+ result = system "multiruby -S rake test_unit:rails"
71
+ raise "Rails integration tests failed" unless result
72
+
73
+ result = system "jruby -S rake test_unit:rails"
74
+ raise "Rails integration tests failed" unless result
75
+ end
76
+
77
+ Dir.chdir "spec/integration/merb" do
78
+ result = system "multiruby -S rake spec"
79
+ raise "Merb integration tests failed" unless result
80
+
81
+ result = system "jruby -S rake spec"
82
+ raise "Rails integration tests failed" unless result
83
+ end
84
+
85
+ Dir.chdir "spec/integration/sinatra" do
86
+ result = system "multiruby -S rake test"
87
+ raise "Sinatra integration tests failed" unless result
88
+
89
+ result = system "jruby -S rake test"
90
+ raise "Sinatra integration tests failed" unless result
91
+ end
92
+
93
+ Dir.chdir "spec/integration/rack" do
94
+ result = system "multiruby -S rake test"
95
+ raise "Rack integration tests failed" unless result
96
+
97
+ result = system "jruby -S rake test"
98
+ raise "Rack integration tests failed" unless result
99
+ end
100
+
101
+ puts
102
+ puts "Multiruby OK!"
103
+ end
104
+
105
+ desc "Run each spec in isolation to test for dependency issues"
106
+ task :spec_deps do
107
+ Dir["spec/**/*_spec.rb"].each do |test|
108
+ if !system("spec #{test} &> /dev/null")
109
+ puts "Dependency Issues: #{test}"
110
+ end
111
+ end
112
+ end
113
+
114
+ task :prepare do
115
+ system "ln -s ../../../../.. ./spec/integration/rails/vendor/plugins/webrat"
116
+ end
117
+
118
+ namespace :spec do
119
+ desc "Run the integration specs"
120
+ task :integration => ["integration:rails", "integration:merb", "integration:sinatra", "integration:rack", "integration:mechanize"]
121
+
122
+ namespace :integration do
123
+ desc "Run the Rails integration specs"
124
+ task :rails => ['rails:webrat'] #,'rails:selenium'] currently not running selenium as it doesn't pass.
125
+
126
+ namespace :rails do
127
+ task :selenium do
128
+ Dir.chdir "spec/integration/rails" do
129
+ result = system "rake test_unit:selenium"
130
+ raise "Rails integration tests failed" unless result
131
+ end
132
+ end
133
+
134
+ task :webrat do
135
+ Dir.chdir "spec/integration/rails" do
136
+ result = system "rake test_unit:rails"
137
+ raise "Rails integration tests failed" unless result
138
+ end
139
+ end
140
+ end
141
+
142
+ desc "Run the Merb integration specs"
143
+ task :merb do
144
+ Dir.chdir "spec/integration/merb" do
145
+ result = system "rake spec"
146
+ raise "Merb integration tests failed" unless result
147
+ end
148
+ end
149
+
150
+ desc "Run the Sinatra integration specs"
151
+ task :sinatra do
152
+ Dir.chdir "spec/integration/sinatra" do
153
+ result = system "rake test"
154
+ raise "Sinatra integration tests failed" unless result
155
+ end
156
+ end
157
+
158
+ desc "Run the Sinatra integration specs"
159
+ task :rack do
160
+ Dir.chdir "spec/integration/rack" do
161
+ result = system "rake test"
162
+ raise "Rack integration tests failed" unless result
163
+ end
164
+ end
165
+
166
+ desc "Run the Mechanize integration specs"
167
+ task :mechanize do
168
+ Dir.chdir "spec/integration/mechanize" do
169
+ result = system "rake spec"
170
+ raise "Mechanize integration tests failed" unless result
171
+ end
172
+ end
173
+ end
174
+ end
175
+
176
+ desc 'Removes trailing whitespace'
177
+ task :whitespace do
178
+ sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;}
179
+ end
180
+
181
+ if defined?(Jeweler)
182
+ task :spec => :check_dependencies
183
+ task :build => :gemspec
184
+ end
185
+
186
+ task :default => :spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.5.1
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ puts IO.read(File.join(File.dirname(__FILE__), 'README.rdoc'))
data/lib/webrat.rb ADDED
@@ -0,0 +1,18 @@
1
+ require "rack"
2
+ require "nokogiri"
3
+
4
+ module Webrat
5
+ VERSION = "0.6pre"
6
+
7
+ autoload :MechanizeAdapter, "webrat/adapters/mechanize"
8
+ autoload :MerbAdapter, "webrat/adapters/merb"
9
+ autoload :RackAdapter, "webrat/adapters/rack"
10
+ autoload :RailsAdapter, "webrat/adapters/rails"
11
+ autoload :SinatraAdapter, "webrat/adapters/sinatra"
12
+
13
+ # The common base class for all exceptions raised by Webrat.
14
+ class WebratError < StandardError
15
+ end
16
+ end
17
+
18
+ require "webrat/core"
@@ -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,96 @@
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
+ # The Rails version of within supports passing in a model and Webrat
15
+ # will apply a scope based on Rails' dom_id for that model.
16
+ #
17
+ # Example:
18
+ # within User.last do
19
+ # click_link "Delete"
20
+ # end
21
+ def within(selector_or_object, &block)
22
+ if selector_or_object.is_a?(String)
23
+ super
24
+ else
25
+ super('#' + dom_id(selector_or_object), &block)
26
+ end
27
+ end
28
+
29
+ def doc_root
30
+ File.expand_path(File.join(RAILS_ROOT, 'public'))
31
+ end
32
+
33
+ def saved_page_dir
34
+ File.expand_path(File.join(RAILS_ROOT, "tmp"))
35
+ end
36
+
37
+ def get(url, data, headers = nil)
38
+ do_request(:get, url, data, headers)
39
+ end
40
+
41
+ def post(url, data, headers = nil)
42
+ do_request(:post, url, data, headers)
43
+ end
44
+
45
+ def put(url, data, headers = nil)
46
+ do_request(:put, url, data, headers)
47
+ end
48
+
49
+ def delete(url, data, headers = nil)
50
+ do_request(:delete, url, data, headers)
51
+ end
52
+
53
+ def response_body
54
+ response.body
55
+ end
56
+
57
+ def response_code
58
+ response.code.to_i
59
+ end
60
+
61
+ def xml_content_type?
62
+ response.headers["Content-Type"].to_s =~ /xml/
63
+ end
64
+
65
+ protected
66
+
67
+ def do_request(http_method, url, data, headers) #:nodoc:
68
+ update_protocol(url)
69
+ integration_session.send(http_method, normalize_url(url), data, headers)
70
+ end
71
+
72
+ # remove protocol, host and anchor
73
+ def normalize_url(href) #:nodoc:
74
+ uri = URI.parse(href)
75
+ normalized_url = []
76
+ normalized_url << "#{uri.scheme}://" if uri.scheme
77
+ normalized_url << uri.host if uri.host
78
+ normalized_url << ":#{uri.port}" if uri.port && ![80,443].include?(uri.port)
79
+ normalized_url << uri.path if uri.path
80
+ normalized_url << "?#{uri.query}" if uri.query
81
+ normalized_url.join
82
+ end
83
+
84
+ def update_protocol(href) #:nodoc:
85
+ if href =~ /^https:/
86
+ integration_session.https!(true)
87
+ elsif href =~ /^http:/
88
+ integration_session.https!(false)
89
+ end
90
+ end
91
+
92
+ def response #:nodoc:
93
+ integration_session.response
94
+ end
95
+ end
96
+ 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,13 @@
1
+ require "webrat/core/configuration"
2
+ require "webrat/core/xml"
3
+ require "webrat/core/logging"
4
+ require "webrat/core/elements/form"
5
+ require "webrat/core/scope"
6
+ require "webrat/core/elements/link"
7
+ require "webrat/core/elements/area"
8
+ require "webrat/core/elements/label"
9
+ require "webrat/core/elements/select_option"
10
+ require "webrat/core/session"
11
+ require "webrat/core/methods"
12
+ require "webrat/core/matchers"
13
+ require "webrat/core/save_and_open_page"