aslakhellesoy-webrat 0.3.2.1 → 0.3.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -6,9 +6,13 @@
6
6
  * Removed auto-require of webrat/rails when requiring webrat when RAILS_ENV is
7
7
  defined
8
8
 
9
- In your env.rb file, ensure you have:
9
+ In your env.rb or test_helper.rb file, ensure you have something like:
10
10
 
11
- require "webrat/rails"
11
+ require "webrat"
12
+
13
+ Webrat.configure do |config|
14
+ config.mode = :rails
15
+ end
12
16
 
13
17
  * Major enhancements
14
18
 
@@ -16,8 +20,11 @@
16
20
  * Use Hpricot and REXML when not parsing with Nokogiri (on JRuby, for example)
17
21
 
18
22
  * Minor enhancements
19
-
23
+ * Added assert_contain, assert_not_contain [#86] (Mike Gaffney, Amos King)
24
+ * Add configuration options for the Selenium environment and port (Kieran Pilkington)
25
+ * Maximize the browser window after initializing Selenium (Luke Melia)
20
26
  * Better inspect output for Webrat elements
27
+ * Sets the Webrat mode with Configuration#mode= in the config block [#85] (Mike Gaffney)
21
28
  * Detect if the document is XML or HTML using the Content-Type when in Rails mode
22
29
  * Expose #selenium method for direct access to Selenium client
23
30
  * Check nokogiri gem version before requiring nokogiri
@@ -51,6 +58,8 @@
51
58
  * Raise Webrat::PageLoadError when a failure occurs so that application exceptions
52
59
  can be more accurately tested (Ryan Briones)
53
60
  * Helpful error message for missing option in select box. [#40] (Ben Mabey)
61
+ * Extracted save_and_open page to make it usable in Selenium mode (Luke Melia)
62
+ * Added save_and_open_screengrab for Selenium mode (Luke Melia)
54
63
 
55
64
  * Bug fixes
56
65
 
@@ -67,6 +76,13 @@
67
76
  * Extend Rails' ActionController::IntegrationTest instead of
68
77
  ActionController::Integration::Session (Fixes using Webrat's #select method and
69
78
  avoids usage of method_missing)
79
+ * Ensure that Webrat::MechanizeSession.request_page always uses an absolute
80
+ URL. (Graham Ashton)
81
+ * Strip anchor tags from URIs before passing to Rails integration session
82
+ (Noah Davis)
83
+ * Treat text and regexp when matching Selenium buttons (Ross Kaffenberger)
84
+ * Allow SeleniumSession's click_button to be called without an argument without
85
+ blowing up (Luke Melia)
70
86
 
71
87
  == 0.3.2 / 2008-11-08
72
88
 
data/README.rdoc CHANGED
@@ -59,9 +59,13 @@ To install the latest code as a plugin: (_Note:_ This may be less stable than us
59
59
 
60
60
  script/plugin install git://github.com/brynary/webrat.git
61
61
 
62
- In your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber) add:
62
+ In your test_helper.rb or env.rb (for Cucumber) add:
63
63
 
64
- require "webrat/rails"
64
+ require "webrat"
65
+
66
+ Webrat.configure do |config|
67
+ config.mode = :rails
68
+ end
65
69
 
66
70
  == Install with Merb
67
71
 
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- require 'rubygems'
1
+ # require 'rubygems'
2
2
  require "rake/gempackagetask"
3
3
  require 'rake/rdoctask'
4
4
  require "rake/clean"
@@ -28,8 +28,8 @@ spec = Gem::Specification.new do |s|
28
28
  s.extra_rdoc_files = %w(README.rdoc MIT-LICENSE.txt)
29
29
 
30
30
  # Dependencies
31
- s.add_dependency "nokogiri", ">= 1.0.6"
32
-
31
+ s.add_dependency "nokogiri", ">= 1.1.0"
32
+
33
33
  s.rubyforge_project = "webrat"
34
34
  end
35
35
 
@@ -52,13 +52,13 @@ end
52
52
  desc "Run API and Core specs"
53
53
  Spec::Rake::SpecTask.new do |t|
54
54
  t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
55
- t.spec_files = FileList['spec/**/*_spec.rb']
55
+ t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
56
56
  end
57
57
 
58
58
  desc "Run all specs in spec directory with RCov"
59
59
  Spec::Rake::SpecTask.new(:rcov) do |t|
60
60
  t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
61
- t.spec_files = FileList['spec/**/*_spec.rb']
61
+ t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
62
62
  t.rcov = true
63
63
  t.rcov_opts = lambda do
64
64
  IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
@@ -71,8 +71,8 @@ end
71
71
 
72
72
  desc 'Install the package as a gem.'
73
73
  task :install_gem => [:clean, :package] do
74
- gem = Dir['pkg/*.gem'].first
75
- sh "sudo gem install --local #{gem}"
74
+ gem_filename = Dir['pkg/*.gem'].first
75
+ sh "sudo gem install --local #{gem_filename}"
76
76
  end
77
77
 
78
78
  desc "Delete generated RDoc"
@@ -99,6 +99,41 @@ task :spec_deps do
99
99
  end
100
100
  end
101
101
 
102
+ task :prepare do
103
+ system "ln -s ../../../../.. ./spec/integration/rails/vendor/plugins/webrat"
104
+ end
105
+
106
+ namespace :spec do
107
+ desc "Run the integration specs"
108
+ task :integration => ["integration:rails", "integration:merb", "integration:sinatra"]
109
+
110
+ namespace :integration do
111
+ desc "Run the Rails integration specs"
112
+ task :rails do
113
+ Dir.chdir "spec/integration/rails" do
114
+ result = system "rake test:integration"
115
+ raise "Rails integration tests failed" unless result
116
+ end
117
+ end
118
+
119
+ desc "Run the Merb integration specs"
120
+ task :merb do
121
+ Dir.chdir "spec/integration/merb" do
122
+ result = system "rake spec"
123
+ raise "Merb integration tests failed" unless result
124
+ end
125
+ end
126
+
127
+ desc "Run the Sinatra integration specs"
128
+ task :sinatra do
129
+ Dir.chdir "spec/integration/sinatra" do
130
+ result = system "rake test"
131
+ raise "Sinatra tntegration tests failed" unless result
132
+ end
133
+ end
134
+ end
135
+ end
136
+
102
137
  task :default => :spec
103
138
 
104
- task :precommit => ["spec", "spec:jruby"]
139
+ task :precommit => ["spec", "spec:jruby", "spec:integration"]
@@ -17,6 +17,7 @@ module Webrat
17
17
  # config.parse_with_nokogiri = false
18
18
  # end
19
19
  class Configuration
20
+
20
21
  # Should XHTML be parsed with Nokogiri? Defaults to true, except on JRuby. When false, Hpricot and REXML are used
21
22
  attr_writer :parse_with_nokogiri
22
23
 
@@ -26,9 +27,17 @@ module Webrat
26
27
  # Save and open pages with error status codes (500-599) in a browser? Defualts to true.
27
28
  attr_writer :open_error_files
28
29
 
30
+ # Which environment should the selenium tests be run in? Defaults to selenium.
31
+ attr_accessor :selenium_environment
32
+
33
+ # Which port should the selenium tests be run on? Defaults to 3001.
34
+ attr_accessor :selenium_port
35
+
29
36
  def initialize # :nodoc:
30
37
  self.open_error_files = true
31
38
  self.parse_with_nokogiri = !Webrat.on_java?
39
+ self.selenium_environment = :selenium
40
+ self.selenium_port = 3001
32
41
  end
33
42
 
34
43
  def parse_with_nokogiri? #:nodoc:
@@ -39,6 +48,13 @@ module Webrat
39
48
  @open_error_files ? true : false
40
49
  end
41
50
 
51
+ # Allows setting of webrat's mode, valid modes are:
52
+ # :rails, :selenium, :rack, :sinatra, :mechanize, :merb
53
+ def mode=(mode)
54
+ @mode = mode
55
+ require("webrat/#{mode}")
56
+ end
57
+
42
58
  end
43
59
 
44
60
  end
@@ -51,5 +51,19 @@ module Webrat
51
51
  HasContent.new(content)
52
52
  end
53
53
 
54
+ # Asserts that the body of the response contain
55
+ # the supplied string or regexp
56
+ def assert_contain(content)
57
+ hc = HasContent.new(content)
58
+ raise Test::Unit::AssertionFailedError.new(hc.failure_message) unless hc.matches?(response_body)
59
+ end
60
+
61
+ # Asserts that the body of the response
62
+ # does not contain the supplied string or regepx
63
+ def assert_not_contain(content)
64
+ hc = HasContent.new(content)
65
+ raise Test::Unit::AssertionFailedError.new(hc.negative_failure_message) if hc.matches?(response_body)
66
+ end
67
+
54
68
  end
55
69
  end
@@ -33,5 +33,20 @@ module Webrat
33
33
  end
34
34
  alias_method :match_selector, :have_selector
35
35
 
36
+
37
+ # Asserts that the body of the response contains
38
+ # the supplied selector
39
+ def assert_have_selector(expected)
40
+ hs = HaveSelector.new(expected)
41
+ raise Test::Unit::AssertionFailedError.new(hs.failure_message) unless hs.matches?(response_body)
42
+ end
43
+
44
+ # Asserts that the body of the response
45
+ # does not contain the supplied string or regepx
46
+ def assert_have_no_selector(expected)
47
+ hs = HaveSelector.new(expected)
48
+ raise Test::Unit::AssertionFailedError.new(hs.negative_failure_message) if hs.matches?(response_body)
49
+ end
50
+
36
51
  end
37
52
  end
@@ -52,6 +52,20 @@ module Webrat
52
52
  end
53
53
 
54
54
  alias_method :match_tag, :have_tag
55
+
56
+ # Asserts that the body of the response contains
57
+ # the supplied tag with the associated selectors
58
+ def assert_have_tag(name, attributes = {})
59
+ ht = HaveTag.new([name, attributes])
60
+ raise Test::Unit::AssertionFailedError.new(ht.failure_message) unless ht.matches?(response_body)
61
+ end
62
+
63
+ # Asserts that the body of the response
64
+ # does not contain the supplied string or regepx
65
+ def assert_have_no_tag(name, attributes = {})
66
+ ht = HaveTag.new([name, attributes])
67
+ raise Test::Unit::AssertionFailedError.new(ht.negative_failure_message) if ht.matches?(response_body)
68
+ end
55
69
 
56
70
  end
57
71
  end
@@ -79,5 +79,15 @@ module Webrat
79
79
  end
80
80
  alias_method :match_xpath, :have_xpath
81
81
 
82
+ def assert_have_xpath(expected, &block)
83
+ hs = HaveXpath.new(expected, &block)
84
+ raise Test::Unit::AssertionFailedError.new(hs.failure_message) unless hs.matches?(response_body)
85
+ end
86
+
87
+ def assert_have_no_xpath(expected, &block)
88
+ hs = HaveXpath.new(expected, &block)
89
+ raise Test::Unit::AssertionFailedError.new(hs.negative_failure_message) if hs.matches?(response_body)
90
+ end
91
+
82
92
  end
83
93
  end
@@ -47,6 +47,7 @@ module Webrat
47
47
  :select_option,
48
48
  :set_hidden_field, :submit_form,
49
49
  :request_page, :current_dom,
50
+ :response_body,
50
51
  :selects_date, :selects_time, :selects_datetime,
51
52
  :select_date, :select_time, :select_datetime,
52
53
  :field_by_xpath,
@@ -8,7 +8,7 @@ module Webrat
8
8
  # A page load or form submission returned an unsuccessful response code (500-599)
9
9
  class PageLoadError < WebratError
10
10
  end
11
-
11
+
12
12
  def self.session_class
13
13
  case Webrat.configuration.mode
14
14
  when :rails
@@ -24,32 +24,41 @@ module Webrat
24
24
  when :mechanize
25
25
  MechanizeSession
26
26
  else
27
- raise WebratError.new("Unknown Webrat mode: #{Webrat.configuration.mode.inspect}")
27
+ raise WebratError.new(<<-STR)
28
+ Unknown Webrat mode: #{Webrat.configuration.mode.inspect}
29
+
30
+ Please ensure you have a Webrat configuration block that specifies a mode
31
+ in your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber).
32
+ For example:
33
+
34
+ Webrat.configure do |config|
35
+ config.mode = :rails
36
+ end
37
+ STR
28
38
  end
29
39
  end
30
-
40
+
31
41
  class Session
32
42
  extend Forwardable
33
43
  include Logging
34
44
  include SaveAndOpenPage
35
-
36
45
  attr_reader :current_url
37
46
  attr_reader :elements
38
-
47
+
39
48
  def initialize(context = nil) #:nodoc:
40
49
  @http_method = :get
41
50
  @data = {}
42
51
  @default_headers = {}
43
52
  @custom_headers = {}
44
53
  @context = context
45
-
54
+
46
55
  reset
47
56
  end
48
-
57
+
49
58
  def current_dom #:nodoc:
50
59
  current_scope.dom
51
60
  end
52
-
61
+
53
62
  # For backwards compatibility -- removing in 1.0
54
63
  def current_page #:nodoc:
55
64
  page = OpenStruct.new
@@ -58,7 +67,7 @@ module Webrat
58
67
  page.data = @data
59
68
  page
60
69
  end
61
-
70
+
62
71
  def doc_root #:nodoc:
63
72
  nil
64
73
  end
@@ -70,7 +79,7 @@ module Webrat
70
79
  def http_accept(mime_type)
71
80
  header('Accept', Webrat::MIME.mime_type(mime_type))
72
81
  end
73
-
82
+
74
83
  def basic_auth(user, pass)
75
84
  encoded_login = ["#{user}:#{pass}"].pack("m*")
76
85
  header('HTTP_AUTHORIZATION', "Basic #{encoded_login}")
@@ -93,28 +102,38 @@ module Webrat
93
102
 
94
103
  save_and_open_page if exception_caught? && Webrat.configuration.open_error_files?
95
104
  raise PageLoadError.new("Page load was not successful (Code: #{response_code.inspect}):\n#{formatted_error}") unless success_code?
96
-
105
+
97
106
  reset
98
-
107
+
99
108
  @current_url = url
100
109
  @http_method = http_method
101
110
  @data = data
102
-
111
+
112
+ request_page(response_location, :get, data) if internal_redirect?
113
+
103
114
  return response
104
115
  end
105
-
116
+
106
117
  def success_code? #:nodoc:
107
118
  (200..499).include?(response_code)
108
119
  end
109
-
120
+
121
+ def redirect? #:nodoc:
122
+ response_code / 100 == 3
123
+ end
124
+
125
+ def internal_redirect? #:nodoc:
126
+ redirect? && current_host == response_location_host
127
+ end
128
+
110
129
  def exception_caught? #:nodoc:
111
130
  response_body =~ /Exception caught/
112
131
  end
113
-
132
+
114
133
  def current_scope #:nodoc:
115
134
  scopes.last || page_scope
116
135
  end
117
-
136
+
118
137
  # Reloads the last page requested. Note that this will resubmit forms
119
138
  # and their data.
120
139
  def reloads
@@ -122,10 +141,10 @@ module Webrat
122
141
  end
123
142
 
124
143
  webrat_deprecate :reload, :reloads
125
-
126
-
144
+
145
+
127
146
  # Works like click_link, but only looks for the link text within a given selector
128
- #
147
+ #
129
148
  # Example:
130
149
  # click_link_within "#user_12", "Vote"
131
150
  def click_link_within(selector, link_text)
@@ -135,14 +154,14 @@ module Webrat
135
154
  end
136
155
 
137
156
  webrat_deprecate :clicks_link_within, :click_link_within
138
-
157
+
139
158
  def within(selector)
140
159
  scopes.push(Scope.from_scope(self, current_scope, selector))
141
160
  ret = yield(current_scope)
142
161
  scopes.pop
143
162
  return ret
144
163
  end
145
-
164
+
146
165
  # Issues a GET request for a page, follows any redirects, and verifies the final page
147
166
  # load was successful.
148
167
  #
@@ -151,7 +170,7 @@ module Webrat
151
170
  def visit(url = nil, http_method = :get, data = {})
152
171
  request_page(url, http_method, data)
153
172
  end
154
-
173
+
155
174
  webrat_deprecate :visits, :visit
156
175
 
157
176
  # Subclasses can override this to show error messages without html
@@ -166,25 +185,25 @@ module Webrat
166
185
  def page_scope #:nodoc:
167
186
  @_page_scope ||= Scope.from_page(self, response, response_body)
168
187
  end
169
-
188
+
170
189
  def dom
171
190
  page_scope.dom
172
191
  end
173
-
192
+
174
193
  def xml_content_type?
175
194
  false
176
195
  end
177
-
196
+
178
197
  def simulate
179
198
  return if Webrat.configuration.mode == :selenium
180
199
  yield
181
200
  end
182
-
201
+
183
202
  def automate
184
203
  return unless Webrat.configuration.mode == :selenium
185
204
  yield
186
205
  end
187
-
206
+
188
207
  def_delegators :current_scope, :fill_in, :fills_in
189
208
  def_delegators :current_scope, :set_hidden_field
190
209
  def_delegators :current_scope, :submit_form
@@ -199,15 +218,25 @@ module Webrat
199
218
  def_delegators :current_scope, :click_area, :clicks_area
200
219
  def_delegators :current_scope, :click_link, :clicks_link
201
220
  def_delegators :current_scope, :click_button, :clicks_button
202
- def_delegators :current_scope, :should_see
203
- def_delegators :current_scope, :should_not_see
204
221
  def_delegators :current_scope, :field_labeled
205
222
  def_delegators :current_scope, :field_by_xpath
206
223
  def_delegators :current_scope, :field_with_id
207
224
  def_delegators :current_scope, :select_option
208
-
225
+
209
226
  private
210
-
227
+
228
+ def response_location
229
+ response.headers["Location"]
230
+ end
231
+
232
+ def current_host
233
+ URI.parse(current_url).host || "www.example.com"
234
+ end
235
+
236
+ def response_location_host
237
+ URI.parse(response_location).host || "www.example.com"
238
+ end
239
+
211
240
  def reset
212
241
  @elements = {}
213
242
  @_scopes = nil
@@ -6,6 +6,10 @@ module Webrat #:nodoc:
6
6
  attr_accessor :response
7
7
  alias :page :response
8
8
 
9
+ def request_page(url, http_method, data) #:nodoc:
10
+ super(absolute_url(url), http_method, data)
11
+ end
12
+
9
13
  def get(url, data, headers_argument_not_used = nil)
10
14
  @response = mechanize.get(url, data)
11
15
  end
@@ -36,8 +40,35 @@ module Webrat #:nodoc:
36
40
  end
37
41
 
38
42
  def_delegators :mechanize, :basic_auth
43
+
44
+ def absolute_url(url) #:nodoc:
45
+ current_host, current_path = split_current_url
46
+ if url =~ Regexp.new('^https?://')
47
+ url
48
+ elsif url =~ Regexp.new('^/')
49
+ current_host + url
50
+ elsif url =~ Regexp.new('^\.')
51
+ current_host + absolute_path(current_path, url)
52
+ else
53
+ url
54
+ end
55
+ end
56
+
57
+ private
58
+ def split_current_url
59
+ current_url =~ Regexp.new('^(https?://[^/]+)(/.*)?')
60
+ [Regexp.last_match(1), Regexp.last_match(2)]
61
+ end
39
62
 
63
+ def absolute_path(current_path, url)
64
+ levels_up = url.split('/').find_all { |x| x == '..' }.size
65
+ ancestor = if current_path.nil?
66
+ ""
67
+ else
68
+ current_path.split("/")[0..(-1 - levels_up)].join("/")
69
+ end
70
+ descendent = url.split("/")[levels_up..-1]
71
+ "#{ancestor}/#{descendent}"
72
+ end
40
73
  end
41
74
  end
42
-
43
- Webrat.configuration.mode = :mechanize
data/lib/webrat/merb.rb CHANGED
@@ -42,11 +42,6 @@ module Webrat
42
42
  :params => (data && data.any?) ? data : nil,
43
43
  :headers => headers,
44
44
  :method => method)
45
- follow_redirect
46
- end
47
-
48
- def follow_redirect
49
- self.get(@response.headers['Location'], nil, @response.headers) if @response.status == 302
50
45
  end
51
46
 
52
47
  end
@@ -59,10 +54,6 @@ module Merb #:nodoc:
59
54
  @_webrat_session ||= Webrat::MerbSession.new
60
55
  @_webrat_session.response = @_webrat_session.request(uri, env)
61
56
  end
62
-
63
- def follow_redirect
64
- @_webrat_session.follow_redirect
65
- end
66
57
  end
67
58
  end
68
59
  end
@@ -72,6 +63,3 @@ class Merb::Test::RspecStory #:nodoc:
72
63
  @browser ||= Webrat::MerbSession.new
73
64
  end
74
65
  end
75
-
76
- Webrat.configuration.mode = :merb
77
-
data/lib/webrat/rack.rb CHANGED
@@ -22,5 +22,3 @@ module Webrat
22
22
  end
23
23
  end
24
24
  end
25
-
26
- Webrat.configuration.mode = :rack
data/lib/webrat/rails.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require "webrat"
2
+
3
+ require "action_controller"
2
4
  require "action_controller/integration"
3
5
 
4
6
  module Webrat
@@ -7,51 +9,50 @@ module Webrat
7
9
  def doc_root
8
10
  File.expand_path(File.join(RAILS_ROOT, 'public'))
9
11
  end
10
-
12
+
11
13
  def saved_page_dir
12
14
  File.expand_path(File.join(RAILS_ROOT, "tmp"))
13
15
  end
14
-
16
+
15
17
  def get(url, data, headers = nil)
16
18
  do_request(:get, url, data, headers)
17
19
  end
18
-
20
+
19
21
  def post(url, data, headers = nil)
20
22
  do_request(:post, url, data, headers)
21
23
  end
22
-
24
+
23
25
  def put(url, data, headers = nil)
24
26
  do_request(:put, url, data, headers)
25
27
  end
26
-
28
+
27
29
  def delete(url, data, headers = nil)
28
30
  do_request(:delete, url, data, headers)
29
31
  end
30
-
32
+
31
33
  def response_body
32
34
  response.body
33
35
  end
34
-
36
+
35
37
  def response_code
36
38
  response.code.to_i
37
39
  end
38
-
40
+
39
41
  def xml_content_type?
40
42
  response.headers["Content-Type"].to_s =~ /xml/
41
43
  end
42
-
44
+
43
45
  protected
44
-
46
+
45
47
  def integration_session
46
48
  @context
47
49
  end
48
-
50
+
49
51
  def do_request(http_method, url, data, headers) #:nodoc:
50
52
  update_protocol(url)
51
- url = normalize_url(url)
52
- integration_session.request_via_redirect(http_method, url, data, headers)
53
+ integration_session.send(http_method, normalize_url(url), data, headers)
53
54
  end
54
-
55
+
55
56
  # remove protocol, host and anchor
56
57
  def normalize_url(href) #:nodoc:
57
58
  uri = URI.parse(href)
@@ -61,7 +62,7 @@ module Webrat
61
62
  end
62
63
  normalized_url
63
64
  end
64
-
65
+
65
66
  def update_protocol(href) #:nodoc:
66
67
  if href =~ /^https:/
67
68
  integration_session.https!(true)
@@ -69,28 +70,17 @@ module Webrat
69
70
  integration_session.https!(false)
70
71
  end
71
72
  end
72
-
73
+
73
74
  def response #:nodoc:
74
75
  integration_session.response
75
76
  end
76
-
77
+
77
78
  end
78
79
  end
79
80
 
80
81
  module ActionController #:nodoc:
81
- module Integration #:nodoc:
82
- Session.class_eval do
83
- unless instance_methods.include?("put_via_redirect")
84
- require "webrat/rails/redirect_actions"
85
- include Webrat::RedirectActions
86
- end
87
- end
88
- end
89
-
90
82
  IntegrationTest.class_eval do
91
83
  include Webrat::Methods
92
84
  include Webrat::Matchers
93
85
  end
94
86
  end
95
-
96
- Webrat.configuration.mode = :rails
@@ -0,0 +1,108 @@
1
+ module Webrat
2
+ module Selenium
3
+ module Matchers
4
+
5
+ class HaveXpath
6
+ def initialize(expected)
7
+ @expected = expected
8
+ end
9
+
10
+ def matches?(response)
11
+ response.session.wait_for do
12
+ response.selenium.is_element_present("xpath=#{@expected}")
13
+ end
14
+ end
15
+
16
+ # ==== Returns
17
+ # String:: The failure message.
18
+ def failure_message
19
+ "expected following text to match xpath #{@expected}:\n#{@document}"
20
+ end
21
+
22
+ # ==== Returns
23
+ # String:: The failure message to be displayed in negative matches.
24
+ def negative_failure_message
25
+ "expected following text to not match xpath #{@expected}:\n#{@document}"
26
+ end
27
+ end
28
+
29
+ def have_xpath(xpath)
30
+ HaveXpath.new(xpath)
31
+ end
32
+
33
+ class HaveSelector
34
+ def initialize(expected)
35
+ @expected = expected
36
+ end
37
+
38
+ def matches?(response)
39
+ response.session.wait_for do
40
+ response.selenium.is_element_present("css=#{@expected}")
41
+ end
42
+ end
43
+
44
+ # ==== Returns
45
+ # String:: The failure message.
46
+ def failure_message
47
+ "expected following text to match selector #{@expected}:\n#{@document}"
48
+ end
49
+
50
+ # ==== Returns
51
+ # String:: The failure message to be displayed in negative matches.
52
+ def negative_failure_message
53
+ "expected following text to not match selector #{@expected}:\n#{@document}"
54
+ end
55
+ end
56
+
57
+ def have_selector(content)
58
+ HaveSelector.new(content)
59
+ end
60
+
61
+ class HasContent #:nodoc:
62
+ def initialize(content)
63
+ @content = content
64
+ end
65
+
66
+ def matches?(response)
67
+ if @content.is_a?(Regexp)
68
+ text_finder = "regexp:#{@content.source}"
69
+ else
70
+ text_finder = @content
71
+ end
72
+
73
+ response.session.wait_for do
74
+ response.selenium.is_text_present(text_finder)
75
+ end
76
+ end
77
+
78
+ # ==== Returns
79
+ # String:: The failure message.
80
+ def failure_message
81
+ "expected the following element's content to #{content_message}:\n#{@element}"
82
+ end
83
+
84
+ # ==== Returns
85
+ # String:: The failure message to be displayed in negative matches.
86
+ def negative_failure_message
87
+ "expected the following element's content to not #{content_message}:\n#{@element}"
88
+ end
89
+
90
+ def content_message
91
+ case @content
92
+ when String
93
+ "include \"#{@content}\""
94
+ when Regexp
95
+ "match #{@content.inspect}"
96
+ end
97
+ end
98
+ end
99
+
100
+ # Matches the contents of an HTML document with
101
+ # whatever string is supplied
102
+ def contain(content)
103
+ HasContent.new(content)
104
+ end
105
+
106
+ end
107
+ end
108
+ end
@@ -4,8 +4,6 @@ require "selenium/client"
4
4
  require "webrat/selenium/selenium_session"
5
5
  require "webrat/selenium/matchers"
6
6
 
7
- Webrat.configuration.mode = :selenium
8
-
9
7
  module Webrat
10
8
 
11
9
  def self.with_selenium_server #:nodoc:
@@ -28,8 +26,8 @@ module Webrat
28
26
 
29
27
  def self.start_app_server #:nodoc:
30
28
  pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid")
31
- system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=3001 --environment=selenium --pid #{pid_file} &")
32
- TCPSocket.wait_for_service :host => "0.0.0.0", :port => 3001
29
+ system("mongrel_rails start -d --chdir=#{RAILS_ROOT} --port=#{Webrat.configuration.selenium_port} --environment=#{Webrat.configuration.selenium_environment} --pid #{pid_file} &")
30
+ TCPSocket.wait_for_service :host => "0.0.0.0", :port => Webrat.configuration.selenium_port.to_i
33
31
  end
34
32
 
35
33
  def self.stop_app_server #:nodoc:
@@ -40,14 +38,10 @@ module Webrat
40
38
  # To use Webrat's Selenium support, you'll need the selenium-client gem installed.
41
39
  # Activate it with (for example, in your <tt>env.rb</tt>):
42
40
  #
43
- # require "webrat/selenium"
44
- #
45
- # Then, if you're using Cucumber, configure it to use a
46
- # <tt>Webrat::Selenium::Rails::World</tt> as the scenario context by adding
47
- # the following to <tt>env.rb</tt>:
48
- #
49
- # World do
50
- # Webrat::Selenium::Rails::World.new
41
+ # require "webrat"
42
+ #
43
+ # Webrat.configure do |config|
44
+ # config.mode = :selenium
51
45
  # end
52
46
  #
53
47
  # == Dropping down to the selenium-client API
@@ -74,34 +68,26 @@ module Webrat
74
68
  # your Webrat::Selenium tests ignoring the concurrency issues that can plague in-browser
75
69
  # testing, so long as you're using the Webrat API.
76
70
  module Selenium
77
-
78
- module Rails #:nodoc:
79
- class World < ::ActionController::IntegrationTest
80
- include Webrat::Selenium::Matchers
81
-
82
- def initialize #:nodoc:
83
- @_result = Test::Unit::TestResult.new
84
- end
85
-
86
- def response
87
- webrat_session.response
88
- end
89
-
90
- def wait_for(*args, &block)
91
- webrat_session.wait_for(*args, &block)
92
- end
71
+ module Methods
72
+ def response
73
+ webrat_session.response
74
+ end
75
+
76
+ def wait_for(*args, &block)
77
+ webrat_session.wait_for(*args, &block)
78
+ end
93
79
 
94
- def save_and_open_screengrab
95
- webrat_session.save_and_open_screengrab
96
- end
80
+ def save_and_open_screengrab
81
+ webrat_session.save_and_open_screengrab
97
82
  end
98
83
  end
99
84
  end
100
-
101
85
  end
102
86
 
103
87
  module ActionController #:nodoc:
104
88
  IntegrationTest.class_eval do
105
89
  include Webrat::Methods
90
+ include Webrat::Selenium::Methods
91
+ include Webrat::Selenium::Matchers
106
92
  end
107
93
  end
@@ -2,20 +2,28 @@ require 'webrat/rack'
2
2
  require 'sinatra'
3
3
  require 'sinatra/test/methods'
4
4
 
5
+ class Sinatra::Application
6
+ # Override this to prevent Sinatra from barfing on the options passed from RSpec
7
+ def self.load_default_options_from_command_line!
8
+ end
9
+ end
10
+
11
+ disable :run
12
+ disable :reload
13
+
5
14
  module Webrat
6
15
  class SinatraSession < RackSession #:nodoc:
7
16
  include Sinatra::Test::Methods
8
17
 
18
+ attr_reader :request, :response
19
+
9
20
  %w(get head post put delete).each do |verb|
10
21
  define_method(verb) do |*args| # (path, data, headers = nil)
11
22
  path, data, headers = *args
12
- params = data.merge({:env => headers || {}})
23
+ data = data.inject({}) {|data, (key,value)| data[key] = Rack::Utils.unescape(value); data }
24
+ params = data.merge(:env => headers || {})
13
25
  self.__send__("#{verb}_it", path, params)
14
- follow! while @response.redirect?
15
26
  end
16
27
  end
17
-
18
28
  end
19
29
  end
20
-
21
- Webrat.configuration.mode = :sinatra
data/lib/webrat.rb CHANGED
@@ -7,7 +7,7 @@ module Webrat
7
7
  class WebratError < StandardError
8
8
  end
9
9
 
10
- VERSION = '0.3.2.1'
10
+ VERSION = '0.3.2.2'
11
11
 
12
12
  def self.require_xml
13
13
  gem "nokogiri", ">= 1.0.6"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aslakhellesoy-webrat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2.1
4
+ version: 0.3.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Helmkamp
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-20 00:00:00 -08:00
12
+ date: 2008-12-29 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -19,7 +19,7 @@ dependencies:
19
19
  requirements:
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.0.6
22
+ version: 1.1.0
23
23
  version:
24
24
  description: Webrat. Ruby Acceptance Testing for Web applications
25
25
  email: bryan@brynary.com
@@ -88,8 +88,6 @@ files:
88
88
  - lib/webrat/mechanize.rb
89
89
  - lib/webrat/merb.rb
90
90
  - lib/webrat/rack.rb
91
- - lib/webrat/rails
92
- - lib/webrat/rails/redirect_actions.rb
93
91
  - lib/webrat/rails.rb
94
92
  - lib/webrat/rspec-rails.rb
95
93
  - lib/webrat/selenium
@@ -100,6 +98,7 @@ files:
100
98
  - lib/webrat/selenium/location_strategy_javascript/webratlink.js
101
99
  - lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js
102
100
  - lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js
101
+ - lib/webrat/selenium/matchers.rb
103
102
  - lib/webrat/selenium/selenium_extensions.js
104
103
  - lib/webrat/selenium/selenium_session.rb
105
104
  - lib/webrat/selenium.rb
@@ -1,18 +0,0 @@
1
- # For Rails before http://dev.rubyonrails.org/ticket/10497 was committed
2
- module Webrat
3
- module RedirectActions #:nodoc:
4
-
5
- def put_via_redirect(path, parameters = {}, headers = {})
6
- put path, parameters, headers
7
- follow_redirect! while redirect?
8
- status
9
- end
10
-
11
- def delete_via_redirect(path, parameters = {}, headers = {})
12
- delete path, parameters, headers
13
- follow_redirect! while redirect?
14
- status
15
- end
16
-
17
- end
18
- end