brynary-webrat 0.3.2.2 → 0.4.0

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.
@@ -5,19 +5,31 @@
5
5
  * Removed init.rb auto-require of webrat/rails
6
6
  * Removed auto-require of webrat/rails when requiring webrat when RAILS_ENV is
7
7
  defined
8
-
9
- In your env.rb file, ensure you have:
10
-
11
- require "webrat/rails"
12
-
8
+
9
+ In your env.rb or test_helper.rb file, ensure you have something like:
10
+
11
+ require "webrat"
12
+
13
+ Webrat.configure do |config|
14
+ config.mode = :rails
15
+ end
16
+
13
17
  * Major enhancements
14
18
 
19
+ * Added Selenium grid configuration and support. (Amos King && Cornel Borcean)
15
20
  * Added select_time, select_date, and select_datetime to API. [#36] (Ben Mabey)
16
21
  * Use Hpricot and REXML when not parsing with Nokogiri (on JRuby, for example)
17
22
 
18
23
  * Minor enhancements
19
24
 
25
+ * Support passing an ActiveRecord model to #within when in Rails mode [#68] (Luke Melia)
26
+ * Make assert_* matchers in rails mode increment the assertions count [#123] (Amos King)
27
+ * Added assert_* matchers to selenium matchers [#110] (Amos King)
28
+ * Added assert_contain, assert_not_contain [#86] (Mike Gaffney, Amos King)
29
+ * Add configuration options for the Selenium environment and port (Kieran Pilkington)
30
+ * Maximize the browser window after initializing Selenium (Luke Melia)
20
31
  * Better inspect output for Webrat elements
32
+ * Sets the Webrat mode with Configuration#mode= in the config block [#85] (Mike Gaffney)
21
33
  * Detect if the document is XML or HTML using the Content-Type when in Rails mode
22
34
  * Expose #selenium method for direct access to Selenium client
23
35
  * Check nokogiri gem version before requiring nokogiri
@@ -51,9 +63,17 @@
51
63
  * Raise Webrat::PageLoadError when a failure occurs so that application exceptions
52
64
  can be more accurately tested (Ryan Briones)
53
65
  * Helpful error message for missing option in select box. [#40] (Ben Mabey)
66
+ * Extracted save_and_open page to make it usable in Selenium mode (Luke Melia)
67
+ * Added save_and_open_screengrab for Selenium mode (Luke Melia)
54
68
 
55
69
  * Bug fixes
56
70
 
71
+ * field_labeled should disregard labels without matching fields (Kyle Hargraves)
72
+ * Fixed bug where Scope was creating a new DOM rather than re-using the existing DOM.
73
+ [#105] (Zach Dennis)
74
+ * Support Rails > v2.2 by using ActionController::RequestParser for param parsing [#107]
75
+ (Marcello Nuccio)
76
+ * Raise a Webrat::NotFoundError if the scope passed to #within doesn't exist [#90]
57
77
  * Match against link _text_ which decodes character references.
58
78
  Useful for multibyte languages like Japanese (moronatural@gmail.com)
59
79
  * Fix params hash generation for Mechanize when Merb is not defined [#62]
@@ -65,16 +85,39 @@
65
85
  * Fixed bug where Webrat would lose complex parameters (like foo[bar[baz]][])
66
86
  in Merb due to not correctly merging Mashes. (Drew Colthorp)
67
87
  * Extend Rails' ActionController::IntegrationTest instead of
68
- ActionController::Integration::Session (Fixes using Webrat's #select method and
88
+ ActionController::Integration::Session (Fixes using Webrat's #select method and
69
89
  avoids usage of method_missing)
70
-
90
+ * Ensure that Webrat::MechanizeSession.request_page always uses an absolute
91
+ URL. (Graham Ashton)
92
+ * Strip anchor tags from URIs before passing to Rails integration session
93
+ (Noah Davis)
94
+ * Treat text and regexp when matching Selenium buttons (Ross Kaffenberger)
95
+ * Allow SeleniumSession's click_button to be called without an argument without
96
+ blowing up (Luke Melia)
97
+
98
+ == 0.3.4 / 2008-12-29
99
+
100
+ * 1 Minor enhancement
101
+
102
+ * Fix compatibility with Nokogiri 1.1.0 on JRuby
103
+
104
+ * 1 Bug fix
105
+
106
+ * Correct version for Nokogiri dependency in gem
107
+
108
+ == 0.3.3 / 2008-12-28
109
+
110
+ * 1 Minor enhancement
111
+
112
+ * Fix compatibility with Nokogiri 1.1.0 on MRI
113
+
71
114
  == 0.3.2 / 2008-11-08
72
115
 
73
116
  * 1 Minor enhancement
74
117
 
75
118
  * Fixes behavior or have_tag when a block is passed. It passes the matched node(s)
76
119
  to the block for further specs again. (Carl Lerche)
77
-
120
+
78
121
  == 0.3.1 / 2008-11-07
79
122
 
80
123
  * 1 Minor enhancement
@@ -90,7 +133,7 @@
90
133
  * Added experimental Selenium support (Luke Melia)
91
134
  * Add have_selector, have_xpath, have_tag and contain matchers from Merb
92
135
  * Switch from Hpricot to Nokogiri for XML parsing (thanks, Aaron Patterson)
93
-
136
+
94
137
  * 37 Minor enhancements
95
138
 
96
139
  * Added #within for manipulating the current page within a selector scope
@@ -137,7 +180,7 @@
137
180
  * Switched tests to specs, and from Mocha to RSpec's mocking library
138
181
  * Add support to click_button for IDs (Gwyn Morfey)
139
182
  * Miscellaneous core refactorings (Jan Suchal)
140
-
183
+
141
184
  * 8 Bug fixes
142
185
 
143
186
  * Fix initialization of WWW::Mechanize (Derek Kastner)
@@ -149,7 +192,7 @@
149
192
  * Don't explode if encountering inputs with no type attribute (assume text)
150
193
  * Fix bug where choosing a radio button in a series with a default submitted the
151
194
  incorrect field value (Luke Melia)
152
-
195
+
153
196
  == 0.2.0 / 2008-04-04
154
197
 
155
198
  * 4 Major enhancements
@@ -159,12 +202,12 @@
159
202
  * Add basic support for Rails-generated JavaScript link tags
160
203
  * Add support for checkboxes (Patches from Kyle Hargraves and Jarkko Laine)
161
204
  * Add support for textarea fields (Sacha Schlegel)
162
-
205
+
163
206
  * 8 Minor enhancements
164
-
207
+
165
208
  * Added reloads method to reload the page (Kamal Fariz Mahyuddi)
166
209
  * Prevent making a request if clicking on local anchor link (Kamal Fariz Mahyuddi)
167
- * Added clicks_link_within(selector, link_text), allowing restricting link search
210
+ * Added clicks_link_within(selector, link_text), allowing restricting link search
168
211
  to within a given css selector (Luke Melia)
169
212
  * Allow specifying the input name/label when doing a select (David Chelimsky)
170
213
  * Raise a specific exception if the developer tries to manipulate form elements
@@ -172,7 +215,7 @@
172
215
  * Add support for alternate POST, PUT and DELETE link clicking (Kyle Hargraves)
173
216
  * Change clicks_link to find the shortest matching link (Luke Melia)
174
217
  * Improve matching for labels in potentially ambiguous cases
175
-
218
+
176
219
  * 7 Bug fixes
177
220
 
178
221
  * Fix incorrect serializing of collection inputs, i.e. name contains []
@@ -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"]
@@ -7,7 +7,7 @@ module Webrat
7
7
  class WebratError < StandardError
8
8
  end
9
9
 
10
- VERSION = '0.3.2.2'
10
+ VERSION = '0.4.0'
11
11
 
12
12
  def self.require_xml
13
13
  gem "nokogiri", ">= 1.0.6"
@@ -1,44 +1,87 @@
1
+ require "webrat/core_extensions/deprecate"
2
+
1
3
  module Webrat
2
-
4
+
3
5
  # Configures Webrat. If this is not done, Webrat will be created
4
- # with all of the default settings.
5
- def self.configure(configuration = Webrat::Configuration.new)
6
+ # with all of the default settings.
7
+ def self.configure(configuration = Webrat.configuration)
6
8
  yield configuration if block_given?
7
9
  @@configuration = configuration
8
10
  end
9
-
11
+
10
12
  def self.configuration # :nodoc:
11
13
  @@configuration ||= Webrat::Configuration.new
12
14
  end
13
15
 
14
16
  # Webrat can be configured using the Webrat.configure method. For example:
15
- #
17
+ #
16
18
  # Webrat.configure do |config|
17
19
  # config.parse_with_nokogiri = false
18
20
  # end
19
21
  class Configuration
22
+
20
23
  # Should XHTML be parsed with Nokogiri? Defaults to true, except on JRuby. When false, Hpricot and REXML are used
21
24
  attr_writer :parse_with_nokogiri
22
-
25
+
23
26
  # Webrat's mode, set automatically when requiring webrat/rails, webrat/merb, etc.
24
- attr_accessor :mode # :nodoc:
25
-
27
+ attr_reader :mode # :nodoc:
28
+
26
29
  # Save and open pages with error status codes (500-599) in a browser? Defualts to true.
27
30
  attr_writer :open_error_files
28
-
31
+
32
+ # Which rails environment should the selenium tests be run in? Defaults to selenium.
33
+ attr_accessor :application_environment
34
+ webrat_deprecate :selenium_environment, :application_environment
35
+
36
+ # Which port is the application running on for selenium testing? Defaults to 3001.
37
+ attr_accessor :application_port
38
+ webrat_deprecate :selenium_port, :application_port
39
+
40
+ # Which server the application is running on for selenium testing? Defaults to localhost
41
+ attr_accessor :application_address
42
+
43
+ # Which server Selenium server is running on. Defaults to nil(server starts in webrat process and runs locally)
44
+ attr_accessor :selenium_server_address
45
+
46
+ # Which server Selenium port is running on. Defaults to 4444
47
+ attr_accessor :selenium_server_port
48
+
49
+ # Set the key that Selenium uses to determine the browser running. Default *firefox
50
+ attr_accessor :selenium_browser_key
51
+
29
52
  def initialize # :nodoc:
30
53
  self.open_error_files = true
31
54
  self.parse_with_nokogiri = !Webrat.on_java?
55
+ self.application_environment = :selenium
56
+ self.application_port = 3001
57
+ self.application_address = 'localhost'
58
+ self.selenium_server_port = 4444
59
+ self.selenium_browser_key = '*firefox'
32
60
  end
33
-
61
+
34
62
  def parse_with_nokogiri? #:nodoc:
35
63
  @parse_with_nokogiri ? true : false
36
64
  end
37
-
65
+
38
66
  def open_error_files? #:nodoc:
39
67
  @open_error_files ? true : false
40
68
  end
41
-
69
+
70
+ # Allows setting of webrat's mode, valid modes are:
71
+ # :rails, :selenium, :rack, :sinatra, :mechanize, :merb
72
+ def mode=(mode)
73
+ @mode = mode.to_sym
74
+
75
+ # This is a temporary hack to support backwards compatibility
76
+ # with Merb 1.0.8 until it's updated to use the new Webrat.configure
77
+ # syntax
78
+ if @mode == :merb
79
+ require("webrat/merb_session")
80
+ else
81
+ require("webrat/#{mode}")
82
+ end
83
+ end
84
+
42
85
  end
43
-
86
+
44
87
  end
@@ -79,7 +79,7 @@ module Webrat
79
79
 
80
80
  case Webrat.configuration.mode
81
81
  when :rails
82
- ActionController::AbstractRequest.parse_query_parameters("#{name}=#{escaped_value}")
82
+ rails_request_parser.parse_query_parameters("#{name}=#{escaped_value}")
83
83
  when :merb
84
84
  ::Merb::Parse.query("#{name}=#{escaped_value}")
85
85
  else
@@ -97,6 +97,14 @@ module Webrat
97
97
 
98
98
  protected
99
99
 
100
+ def rails_request_parser
101
+ if defined?(ActionController::RequestParser) # For Rails > 2.2
102
+ ActionController::RequestParser
103
+ else
104
+ ActionController::AbstractRequest
105
+ end
106
+ end
107
+
100
108
  def form
101
109
  Form.load(@session, form_element)
102
110
  end
@@ -7,7 +7,7 @@ module Webrat
7
7
  class FieldLabeledLocator < Locator # :nodoc:
8
8
 
9
9
  def locate
10
- matching_labels.any? && matching_labels.first.field
10
+ matching_labels.any? && matching_labels.detect_mapped { |label| label.field }
11
11
  end
12
12
 
13
13
  def matching_labels
@@ -42,9 +42,15 @@ module Webrat
42
42
 
43
43
  end
44
44
 
45
+ # Locates a form field based on a <tt>label</tt> element in the HTML source.
46
+ # This can be useful in order to verify that a field is pre-filled with the
47
+ # correct value.
48
+ #
49
+ # Example:
50
+ # field_labeled("First name").value.should == "Bryan"
45
51
  def field_labeled(label, *field_types)
46
52
  FieldLabeledLocator.new(@session, dom, label, *field_types).locate!
47
53
  end
48
54
 
49
55
  end
50
- end
56
+ 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
+ assert hc.matches?(response_body), hc.failure_message
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
+ assert !hc.matches?(response_body), hc.negative_failure_message
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
+ assert hs.matches?(response_body), hs.failure_message
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
+ assert !hs.matches?(response_body), hs.negative_failure_message
49
+ end
50
+
36
51
  end
37
52
  end