webrat 0.7.0 → 0.7.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 (40) hide show
  1. data/Gemfile +0 -6
  2. data/History.txt +17 -0
  3. data/Rakefile +7 -9
  4. data/lib/webrat.rb +1 -1
  5. data/lib/webrat/adapters/mechanize.rb +22 -6
  6. data/lib/webrat/adapters/rack.rb +4 -0
  7. data/lib/webrat/adapters/rails.rb +4 -0
  8. data/lib/webrat/core/configuration.rb +16 -1
  9. data/lib/webrat/core/elements/field.rb +40 -89
  10. data/lib/webrat/core/elements/form.rb +55 -31
  11. data/lib/webrat/core/locators/form_locator.rb +1 -1
  12. data/lib/webrat/core/matchers/have_xpath.rb +4 -2
  13. data/lib/webrat/core/methods.rb +1 -1
  14. data/lib/webrat/core/mime.rb +2 -2
  15. data/lib/webrat/core/scope.rb +1 -0
  16. data/lib/webrat/core/session.rb +4 -3
  17. data/lib/webrat/core_extensions/{nil_to_param.rb → nil_to_query_string.rb} +1 -1
  18. data/lib/webrat/selenium/location_strategy_javascript/label.js +9 -3
  19. data/lib/webrat/selenium/selenium_rc_server.rb +4 -1
  20. data/lib/webrat/selenium/selenium_session.rb +9 -4
  21. data/spec/fakes/test_adapter.rb +1 -1
  22. data/spec/integration/mechanize/sample_app.rb +16 -1
  23. data/spec/integration/mechanize/spec/mechanize_spec.rb +9 -1
  24. data/spec/integration/rack/app.rb +2 -2
  25. data/spec/integration/rack/test/helper.rb +0 -1
  26. data/spec/integration/rack/test/webrat_rack_test.rb +3 -2
  27. data/spec/integration/sinatra/classic_app.rb +0 -1
  28. data/spec/integration/sinatra/modular_app.rb +0 -1
  29. data/spec/integration/sinatra/test/classic_app_test.rb +1 -0
  30. data/spec/integration/sinatra/test/test_helper.rb +0 -1
  31. data/spec/private/core/field_spec.rb +1 -1
  32. data/spec/private/core/form_spec.rb +51 -0
  33. data/spec/private/core/session_spec.rb +5 -18
  34. data/spec/private/mechanize/mechanize_adapter_spec.rb +24 -1
  35. data/spec/private/rails/attaches_file_spec.rb +33 -0
  36. data/spec/public/matchers/have_xpath_spec.rb +6 -0
  37. data/spec/public/submit_form_spec.rb +52 -1
  38. data/spec/spec_helper.rb +0 -1
  39. data/webrat.gemspec +6 -4
  40. metadata +38 -18
data/Gemfile CHANGED
@@ -1,9 +1,3 @@
1
- clear_sources
2
- source 'http://gemcutter.org'
3
-
4
- disable_system_gems
5
-
6
- gem "git", "1.2.5"
7
1
  gem "rake", "0.8.7"
8
2
  gem "rspec", "1.2.9"
9
3
  gem "diff-lcs", "1.1.2"
@@ -1,3 +1,20 @@
1
+ == 0.7.1 / 2010-04-26
2
+
3
+ * Minor enhancements
4
+
5
+ * Move verbose selenium output that can clutter build output behind setting
6
+ * Added application_port_for_selenium to webrat configuration. The use case is when you want to test through a web server sitting in front of your application server. (Luke Melia)
7
+ * New webrat configuration option selenium_firefox_profile which is passed to selenium server
8
+ * Allow submit_form to select by CSS too (Damian Janowski)
9
+
10
+ * Bug fixes
11
+
12
+ * Fix that current_url wasn't reflecting redirects in Mechanize [#332] (Emrys Ingersoll)
13
+ * Fix attach_file with nested params [#341] (Álvaro Gil)
14
+ * Fix that a 304 was considered a redirect (Larry Marburger)
15
+ * Fix selection of LABEL elements in Selenium mode under IE [#317] (Damian Janowski, Noah Davis)
16
+ * Fix have_xpath not matching negative expectation in the block [#182] (Luismi Cavallé)
17
+
1
18
  == 0.7.0 / 2010-01-17
2
19
 
3
20
  * Major enhancements
data/Rakefile CHANGED
@@ -1,5 +1,3 @@
1
- require "rubygems"
2
-
3
1
  begin
4
2
  require 'spec/rake/spectask'
5
3
  rescue LoadError
@@ -90,14 +88,14 @@ namespace :spec do
90
88
  namespace :rails do
91
89
  task :selenium do
92
90
  Dir.chdir "spec/integration/rails" do
93
- result = system "rake test_unit:selenium"
91
+ result = system "rake -rubygems test_unit:selenium"
94
92
  raise "Rails integration tests failed" unless result
95
93
  end
96
94
  end
97
95
 
98
96
  task :webrat do
99
97
  Dir.chdir "spec/integration/rails" do
100
- result = system "rake test_unit:rails"
98
+ result = system "rake -rubygems test_unit:rails"
101
99
  raise "Rails integration tests failed" unless result
102
100
  end
103
101
  end
@@ -106,7 +104,7 @@ namespace :spec do
106
104
  desc "Run the Merb integration specs"
107
105
  task :merb do
108
106
  Dir.chdir "spec/integration/merb" do
109
- result = system "rake spec"
107
+ result = system "rake -rubygems spec"
110
108
  raise "Merb integration tests failed" unless result
111
109
  end
112
110
  end
@@ -114,7 +112,7 @@ namespace :spec do
114
112
  desc "Run the Sinatra integration specs"
115
113
  task :sinatra do
116
114
  Dir.chdir "spec/integration/sinatra" do
117
- result = system "rake test"
115
+ result = system "rake -rubygems test"
118
116
  raise "Sinatra integration tests failed" unless result
119
117
  end
120
118
  end
@@ -122,7 +120,7 @@ namespace :spec do
122
120
  desc "Run the Sinatra integration specs"
123
121
  task :rack do
124
122
  Dir.chdir "spec/integration/rack" do
125
- result = system "rake test"
123
+ result = system "rake -rubygems test"
126
124
  raise "Rack integration tests failed" unless result
127
125
  end
128
126
  end
@@ -130,7 +128,7 @@ namespace :spec do
130
128
  desc "Run the Mechanize integration specs"
131
129
  task :mechanize do
132
130
  Dir.chdir "spec/integration/mechanize" do
133
- result = system "rake spec"
131
+ result = system "rake -rubygems spec"
134
132
  raise "Mechanize integration tests failed" unless result
135
133
  end
136
134
  end
@@ -142,4 +140,4 @@ task :whitespace do
142
140
  sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;}
143
141
  end
144
142
 
145
- task :default => :spec
143
+ task :default => :spec
@@ -2,7 +2,7 @@ require "rack"
2
2
  require "nokogiri"
3
3
 
4
4
  module Webrat
5
- VERSION = "0.7.0"
5
+ VERSION = "0.7.1"
6
6
 
7
7
  autoload :MechanizeAdapter, "webrat/adapters/mechanize"
8
8
  autoload :MerbAdapter, "webrat/adapters/merb"
@@ -4,6 +4,8 @@ module Webrat #:nodoc:
4
4
  class MechanizeAdapter #:nodoc:
5
5
  extend Forwardable
6
6
 
7
+ Mechanize = WWW::Mechanize if defined?(WWW::Mechanize)
8
+
7
9
  attr_accessor :response
8
10
  alias :page :response
9
11
 
@@ -20,13 +22,19 @@ module Webrat #:nodoc:
20
22
 
21
23
  def post(url, data, headers_argument_not_used = nil)
22
24
  post_data = data.inject({}) do |memo, param|
23
- case param.last
25
+ case param
24
26
  when Hash
25
- param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
26
- else
27
- memo[param.first] = param.last
27
+ param.each {|attribute, value| memo[attribute] = value }
28
+ memo
29
+ when Array
30
+ case param.last
31
+ when Hash
32
+ param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
33
+ else
34
+ memo[param.first] = param.last
35
+ end
36
+ memo
28
37
  end
29
- memo
30
38
  end
31
39
  @response = mechanize.post(url, post_data)
32
40
  end
@@ -39,8 +47,16 @@ module Webrat #:nodoc:
39
47
  @response.code.to_i
40
48
  end
41
49
 
50
+ def response_headers
51
+ @response.header
52
+ end
53
+
42
54
  def mechanize
43
- @mechanize ||= WWW::Mechanize.new
55
+ @mechanize ||= begin
56
+ mechanize = Mechanize.new
57
+ mechanize.redirect_ok = false
58
+ mechanize
59
+ end
44
60
  end
45
61
 
46
62
  def_delegators :mechanize, :basic_auth
@@ -18,6 +18,10 @@ module Webrat
18
18
  response.status
19
19
  end
20
20
 
21
+ def response_headers
22
+ response.headers
23
+ end
24
+
21
25
  def response
22
26
  @session.last_response
23
27
  end
@@ -35,6 +35,10 @@ module Webrat
35
35
  response.code.to_i
36
36
  end
37
37
 
38
+ def response_headers
39
+ response.headers
40
+ end
41
+
38
42
  def xml_content_type?
39
43
  response.headers["Content-Type"].to_s =~ /xml/
40
44
  end
@@ -40,6 +40,13 @@ module Webrat
40
40
  webrat_deprecate :selenium_port, :application_port
41
41
  webrat_deprecate :selenium_port=, :application_port=
42
42
 
43
+ # Which port should selenium use to access the application. Defaults to application_port
44
+ attr_writer :application_port_for_selenium
45
+
46
+ def application_port_for_selenium
47
+ @application_port_for_selenium || self.application_port
48
+ end
49
+
43
50
  # Which underlying app framework we're testing with selenium
44
51
  attr_accessor :application_framework
45
52
 
@@ -58,10 +65,17 @@ module Webrat
58
65
  # Set the timeout for waiting for the browser process to start
59
66
  attr_accessor :selenium_browser_startup_timeout
60
67
 
68
+ # Set the firefox profile for selenium to use
69
+ attr_accessor :selenium_firefox_profile
70
+
61
71
  # How many redirects to the same URL should be halted as an infinite redirect
62
72
  # loop? Defaults to 10
63
73
  attr_accessor :infinite_redirect_limit
64
74
 
75
+ # Print out the full HTML on wait failure
76
+ # Defaults to false
77
+ attr_accessor :selenium_verbose_output
78
+
65
79
  def initialize # :nodoc:
66
80
  self.open_error_files = true
67
81
  self.application_environment = :test
@@ -72,11 +86,12 @@ module Webrat
72
86
  self.infinite_redirect_limit = 10
73
87
  self.selenium_browser_key = '*firefox'
74
88
  self.selenium_browser_startup_timeout = 5
89
+ self.selenium_verbose_output = false
75
90
 
76
91
  tmp_dir = Pathname.new(Dir.pwd).join("tmp")
77
92
  self.saved_pages_dir = tmp_dir.exist? ? tmp_dir : Dir.pwd
78
93
  end
79
-
94
+
80
95
  def open_error_files? #:nodoc:
81
96
  @open_error_files ? true : false
82
97
  end
@@ -1,6 +1,7 @@
1
1
  require "cgi"
2
+ require "digest/md5"
2
3
  require "webrat/core_extensions/blank"
3
- require "webrat/core_extensions/nil_to_param"
4
+ require "webrat/core_extensions/nil_to_query_string"
4
5
 
5
6
  require "webrat/core/elements/element"
6
7
 
@@ -13,7 +14,7 @@ module Webrat
13
14
  attr_reader :value
14
15
 
15
16
  def self.xpath_search
16
- [".//button", ".//input", ".//textarea", ".//select"]
17
+ ".//button|.//input|.//textarea|.//select"
17
18
  end
18
19
 
19
20
  def self.xpath_search_excluding_hidden
@@ -84,19 +85,17 @@ module Webrat
84
85
  raise DisabledFieldError.new("Cannot interact with disabled form element (#{self})")
85
86
  end
86
87
 
87
- def to_param
88
+ def to_query_string
88
89
  return nil if disabled?
89
90
 
90
- params = case Webrat.configuration.mode
91
- when :rails
92
- parse_rails_request_params("#{name}=#{escaped_value}")
93
- when :merb
94
- ::Merb::Parse.query("#{name}=#{escaped_value}")
95
- else
96
- { name => [*@value].first.to_s }
91
+ query_string = case Webrat.configuration.mode
92
+ when :rails, :merb, :rack, :sinatra
93
+ build_query_string
94
+ when :mechanize
95
+ build_query_string(false)
97
96
  end
98
97
 
99
- unescape_params(params)
98
+ query_string
100
99
  end
101
100
 
102
101
  def set(value)
@@ -109,18 +108,6 @@ module Webrat
109
108
 
110
109
  protected
111
110
 
112
- def parse_rails_request_params(params)
113
- if defined?(ActionController::AbstractRequest)
114
- ActionController::AbstractRequest.parse_query_parameters(params)
115
- elsif defined?(ActionController::UrlEncodedPairParser)
116
- # For Rails > 2.2
117
- ActionController::UrlEncodedPairParser.parse_query_parameters(params)
118
- else
119
- # For Rails > 2.3
120
- Rack::Utils.parse_nested_query(params)
121
- end
122
- end
123
-
124
111
  def form
125
112
  Form.load(@session, form_element)
126
113
  end
@@ -138,25 +125,22 @@ module Webrat
138
125
  @element["name"]
139
126
  end
140
127
 
141
- def escaped_value
142
- CGI.escape(@value.to_s)
143
- end
144
-
145
- # Because we have to escape it before sending it to the above case statement,
146
- # we have to make sure we unescape each value when it gets back so assertions
147
- # involving characters like <, >, and & work as expected
148
- def unescape_params(params)
149
- case params.class.name
150
- when 'Hash', 'Mash'
151
- params.each { |key,value| params[key] = unescape_params(value) }
152
- params
153
- when 'Array'
154
- params.collect { |value| unescape_params(value) }
128
+ def build_query_string(escape_value=true)
129
+ if @value.is_a?(Array)
130
+ @value.collect {|value| "#{name}=#{ escape_value ? escape(value) : value }" }.join("&")
155
131
  else
156
- CGI.unescapeHTML(params)
132
+ "#{name}=#{ escape_value ? escape(value) : value }"
157
133
  end
158
134
  end
159
135
 
136
+ def escape(value)
137
+ CGI.escape(value.to_s)
138
+ end
139
+
140
+ def escaped_value
141
+ CGI.escape(@value.to_s)
142
+ end
143
+
160
144
  def labels
161
145
  @labels ||= label_elements.map do |element|
162
146
  Label.load(@session, element)
@@ -186,22 +170,6 @@ module Webrat
186
170
  def default_value
187
171
  @element["value"]
188
172
  end
189
-
190
- def replace_param_value(params, oval, nval)
191
- output = Hash.new
192
- params.each do |key, value|
193
- case value
194
- when Hash
195
- value = replace_param_value(value, oval, nval)
196
- when Array
197
- value = value.map { |o| o == oval ? nval : oval }
198
- when oval
199
- value = nval
200
- end
201
- output[key] = value
202
- end
203
- output
204
- end
205
173
  end
206
174
 
207
175
  class ButtonField < Field #:nodoc:
@@ -210,7 +178,7 @@ module Webrat
210
178
  [".//button", ".//input[@type = 'submit']", ".//input[@type = 'button']", ".//input[@type = 'image']"]
211
179
  end
212
180
 
213
- def to_param
181
+ def to_query_string
214
182
  return nil if @value.nil?
215
183
  super
216
184
  end
@@ -233,13 +201,13 @@ module Webrat
233
201
  ".//input[@type = 'hidden']"
234
202
  end
235
203
 
236
- def to_param
204
+ def to_query_string
237
205
  if collection_name?
238
206
  super
239
207
  else
240
208
  checkbox_with_same_name = form.field_named(name, CheckboxField)
241
209
 
242
- if checkbox_with_same_name.to_param.blank?
210
+ if checkbox_with_same_name.to_query_string.blank?
243
211
  super
244
212
  else
245
213
  nil
@@ -261,7 +229,7 @@ module Webrat
261
229
  ".//input[@type = 'checkbox']"
262
230
  end
263
231
 
264
- def to_param
232
+ def to_query_string
265
233
  return nil if @value.nil?
266
234
  super
267
235
  end
@@ -306,7 +274,7 @@ module Webrat
306
274
  ".//input[@type = 'radio']"
307
275
  end
308
276
 
309
- def to_param
277
+ def to_query_string
310
278
  return nil if @value.nil?
311
279
  super
312
280
  end
@@ -363,30 +331,32 @@ module Webrat
363
331
  attr_accessor :content_type
364
332
 
365
333
  def set(value, content_type = nil)
334
+ @original_value = @value
335
+ @content_type ||= content_type
366
336
  super(value)
367
- @content_type = content_type
368
337
  end
369
338
 
370
- def to_param
371
- if @value.nil?
372
- super
373
- else
374
- replace_param_value(super, @value, test_uploaded_file)
375
- end
339
+ def digest_value
340
+ @value ? Digest::MD5.hexdigest(self.object_id.to_s) : ""
376
341
  end
377
342
 
378
- protected
343
+ def to_query_string
344
+ @value.nil? ? set("") : set(digest_value)
345
+ super
346
+ end
379
347
 
380
348
  def test_uploaded_file
349
+ return "" if @original_value.blank?
350
+
381
351
  case Webrat.configuration.mode
382
352
  when :rails
383
353
  if content_type
384
- ActionController::TestUploadedFile.new(@value, content_type)
354
+ ActionController::TestUploadedFile.new(@original_value, content_type)
385
355
  else
386
- ActionController::TestUploadedFile.new(@value)
356
+ ActionController::TestUploadedFile.new(@original_value)
387
357
  end
388
358
  when :rack, :merb
389
- Rack::Test::UploadedFile.new(@value, content_type)
359
+ Rack::Test::UploadedFile.new(@original_value, content_type)
390
360
  end
391
361
  end
392
362
 
@@ -450,25 +420,6 @@ module Webrat
450
420
  @value.delete(value)
451
421
  end
452
422
 
453
- # We have to overide how the uri string is formed when dealing with multiples
454
- # Where normally a select field might produce name=value with a multiple,
455
- # we need to form something like name[]=value1&name[]=value2
456
- def to_param
457
- return nil if disabled?
458
-
459
- uri_string = @value.collect {|value| "#{name}=#{CGI.escape(value)}"}.join("&")
460
- params = case Webrat.configuration.mode
461
- when :rails
462
- parse_rails_request_params(uri_string)
463
- when :merb
464
- ::Merb::Parse.query(uri_string)
465
- else
466
- { name => @value }
467
- end
468
-
469
- unescape_params(params)
470
- end
471
-
472
423
  protected
473
424
 
474
425
  # Overwrite SelectField definition because we don't want to select the first option