webrat 0.4.2 → 0.4.3

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.
data/History.txt CHANGED
@@ -1,3 +1,20 @@
1
+ == 0.4.3 / 2009-03-17
2
+
3
+ * Minor enhancements
4
+
5
+ * Support Rails 2.3. Use Rack::Utils to parse params (Matthew Ford)
6
+ * Support for "modular" Sinatra app style (Simon Rozet)
7
+ * Initial Merb and Sinatra compatibility for Selenium mode (Corey Donohoe)
8
+ * When faced with a label with no for attribute, that contains a hidden field
9
+ and another field, as can be the case in Rails 2.3's checkbox view,
10
+ webrat now locates the non-hidden field. (Luke Melia)
11
+ * Add application_framework config for Selenium mode to determine how to
12
+ start and stop the app server (Corey Donohoe)
13
+
14
+ * Bug fixes
15
+
16
+ * Fix following of absolute redirect URL in Sinatra (Simon Rozet)
17
+
1
18
  == 0.4.2 / 2009-02-24
2
19
 
3
20
  * Major enhancements
data/lib/webrat.rb CHANGED
@@ -7,7 +7,7 @@ module Webrat
7
7
  class WebratError < StandardError
8
8
  end
9
9
 
10
- VERSION = '0.4.2'
10
+ VERSION = '0.4.3'
11
11
 
12
12
  def self.require_xml
13
13
  gem "nokogiri", ">= 1.0.6"
@@ -39,6 +39,9 @@ module Webrat
39
39
  webrat_deprecate :selenium_port, :application_port
40
40
  webrat_deprecate :selenium_port=, :application_port=
41
41
 
42
+ # Which underlying app framework we're testing with selenium
43
+ attr_accessor :application_framework
44
+
42
45
  # Which server the application is running on for selenium testing? Defaults to localhost
43
46
  attr_accessor :application_address
44
47
 
@@ -61,6 +64,7 @@ module Webrat
61
64
  self.application_environment = :selenium
62
65
  self.application_port = 3001
63
66
  self.application_address = 'localhost'
67
+ self.application_framework = 'rails'
64
68
  self.selenium_server_port = 4444
65
69
  self.infinite_redirect_limit = 10
66
70
  self.selenium_browser_key = '*firefox'
@@ -91,4 +95,4 @@ module Webrat
91
95
 
92
96
  end
93
97
 
94
- end
98
+ end
@@ -15,6 +15,10 @@ module Webrat
15
15
  def self.xpath_search
16
16
  [".//button", ".//input", ".//textarea", ".//select"]
17
17
  end
18
+
19
+ def self.xpath_search_excluding_hidden
20
+ [".//button", ".//input[ @type != 'hidden']", ".//textarea", ".//select"]
21
+ end
18
22
 
19
23
  def self.field_classes
20
24
  @field_classes || []
@@ -80,7 +84,7 @@ module Webrat
80
84
 
81
85
  case Webrat.configuration.mode
82
86
  when :rails
83
- rails_request_parser.parse_query_parameters("#{name}=#{escaped_value}")
87
+ parse_rails_request_params("#{name}=#{escaped_value}")
84
88
  when :merb
85
89
  ::Merb::Parse.query("#{name}=#{escaped_value}")
86
90
  else
@@ -98,12 +102,15 @@ module Webrat
98
102
 
99
103
  protected
100
104
 
101
- def rails_request_parser
105
+ def parse_rails_request_params(params)
102
106
  if defined?(ActionController::AbstractRequest)
103
- ActionController::AbstractRequest
104
- else
107
+ ActionController::AbstractRequest.parse_query_parameters(params)
108
+ elsif defined?(ActionController::UrlEncodedPairParser)
105
109
  # For Rails > 2.2
106
- ActionController::UrlEncodedPairParser
110
+ ActionController::UrlEncodedPairParser.parse_query_parameters(params)
111
+ else
112
+ # For Rails > 2.3
113
+ Rack::Utils.parse_nested_query(params)
107
114
  end
108
115
  end
109
116
 
@@ -21,7 +21,7 @@ module Webrat
21
21
 
22
22
  def field_element
23
23
  if for_id.blank?
24
- Webrat::XML.xpath_at(@element, *Field.xpath_search)
24
+ Webrat::XML.xpath_at(@element, *Field.xpath_search_excluding_hidden)
25
25
  else
26
26
  Webrat::XML.css_search(@session.current_dom, "#" + for_id).first
27
27
  end
@@ -25,15 +25,55 @@ module Webrat
25
25
  ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", Webrat.configuration.selenium_server_port, 5).stop unless Webrat.configuration.selenium_server_address
26
26
  end
27
27
 
28
- def self.start_app_server #:nodoc:
29
- pid_file = prepare_pid_file("#{RAILS_ROOT}/tmp/pids", "mongrel_selenium.pid")
30
- system("mongrel_rails start -d --chdir='#{RAILS_ROOT}' --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.application_environment} --pid #{pid_file} &")
28
+ def self.pid_file
29
+ if File.exists?('config.ru')
30
+ prepare_pid_file(Dir.pwd, 'rack.pid')
31
+ else
32
+ prepare_pid_file("#{RAILS_ROOT}/tmp/pids", "mongrel_selenium.pid")
33
+ end
34
+ end
35
+ # Start the appserver for the underlying framework to test
36
+ #
37
+ # Sinatra: requires a config.ru in the root of your sinatra app to use this
38
+ # Merb: Attempts to use bin/merb and falls back to the system merb
39
+ # Rails: Calls mongrel_rails to startup the appserver
40
+ def self.start_app_server
41
+ case Webrat.configuration.application_framework
42
+ when :sinatra
43
+ fork do
44
+ File.open('rack.pid', 'w') { |fp| fp.write Process.pid }
45
+ exec 'rackup', File.expand_path(Dir.pwd + '/config.ru'), '-p', Webrat.configuration.application_port.to_s
46
+ end
47
+ when :merb
48
+ cmd = 'merb'
49
+ if File.exist?('bin/merb')
50
+ cmd = 'bin/merb'
51
+ end
52
+ system("#{cmd} -d -p #{Webrat.configuration.application_port} -e #{Webrat.configuration.application_environment}")
53
+ else # rails
54
+ system("mongrel_rails start -d --chdir='#{RAILS_ROOT}' --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.application_environment} --pid #{pid_file} &")
55
+ end
31
56
  TCPSocket.wait_for_service :host => Webrat.configuration.application_address, :port => Webrat.configuration.application_port.to_i
32
57
  end
33
58
 
34
- def self.stop_app_server #:nodoc:
35
- pid_file = File.expand_path(RAILS_ROOT + "/tmp/pids/mongrel_selenium.pid")
36
- system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}"
59
+ # Stop the appserver for the underlying framework under test
60
+ #
61
+ # Sinatra: Reads and kills the pid from the pid file created on startup
62
+ # Merb: Reads and kills the pid from the pid file created on startup
63
+ # Rails: Calls mongrel_rails stop to kill the appserver
64
+ def self.stop_app_server
65
+ case Webrat.configuration.application_framework
66
+ when :sinatra
67
+ pid = File.read('rack.pid')
68
+ system("kill -9 #{pid}")
69
+ FileUtils.rm_f 'rack.pid'
70
+ when :merb
71
+ pid = File.read("log/merb.#{Webrat.configuration.application_port}.pid")
72
+ system("kill -9 #{pid}")
73
+ FileUtils.rm_f "log/merb.#{Webrat.configuration.application_port}.pid"
74
+ else # rails
75
+ system "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}"
76
+ end
37
77
  end
38
78
 
39
79
  def self.prepare_pid_file(file_path, pid_file_name)
@@ -60,11 +100,25 @@ module Webrat
60
100
  # selenium.dragdrop("id=photo_123", "+350, 0")
61
101
  # end
62
102
  #
63
- # == Auto-starting of the mongrel and java server
103
+ # == Choosing the underlying framework to test
104
+ #
105
+ # Webrat assumes you're using rails by default but it can also work with sinatra
106
+ # and merb. To take advantage of this you can use the configuration block to
107
+ # set the application_framework variable.
108
+ # require "webrat"
109
+ #
110
+ # Webrat.configure do |config|
111
+ # config.mode = :selenium
112
+ # config.application_port = 4567
113
+ # config.application_framework = :sinatra # could also be :merb
114
+ # end
115
+ #
116
+ # == Auto-starting of the appserver and java server
64
117
  #
65
118
  # Webrat will automatically start the Selenium Java server process and an instance
66
119
  # of Mongrel when a test is run. The Mongrel will run in the "selenium" environment
67
- # instead of "test", so ensure you've got that defined, and will run on port 3001.
120
+ # instead of "test", so ensure you've got that defined, and will run on port
121
+ # Webrat.configuration.application_port.
68
122
  #
69
123
  # == Waiting
70
124
  #
@@ -89,11 +143,12 @@ module Webrat
89
143
  end
90
144
  end
91
145
  end
92
-
93
- module ActionController #:nodoc:
94
- IntegrationTest.class_eval do
95
- include Webrat::Methods
96
- include Webrat::Selenium::Methods
97
- include Webrat::Selenium::Matchers
146
+ if defined?(ActionController::IntegrationTest)
147
+ module ActionController #:nodoc:
148
+ IntegrationTest.class_eval do
149
+ include Webrat::Methods
150
+ include Webrat::Selenium::Methods
151
+ include Webrat::Selenium::Matchers
152
+ end
98
153
  end
99
154
  end
@@ -179,11 +179,21 @@ module Webrat
179
179
  end
180
180
 
181
181
  protected
182
+ def silence_stream(stream)
183
+ old_stream = stream.dup
184
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
185
+ stream.sync = true
186
+ yield
187
+ ensure
188
+ stream.reopen(old_stream)
189
+ end
182
190
 
183
191
  def setup #:nodoc:
184
192
  silence_stream(STDOUT) do
185
- Webrat.start_selenium_server
186
- Webrat.start_app_server
193
+ silence_stream(STDERR) do
194
+ Webrat.start_selenium_server
195
+ Webrat.start_app_server
196
+ end
187
197
  end
188
198
 
189
199
  create_browser
@@ -234,4 +244,4 @@ module Webrat
234
244
  end
235
245
  end
236
246
  end
237
- end
247
+ end
@@ -1,30 +1,44 @@
1
- require 'webrat/rack'
2
- require 'sinatra'
3
- require 'sinatra/test'
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
1
+ require "webrat/rack"
2
+ require "sinatra/test"
13
3
 
14
4
  module Webrat
15
- class SinatraSession < RackSession #:nodoc:
5
+ class SinatraSession < RackSession
16
6
  include Sinatra::Test
17
7
 
18
8
  attr_reader :request, :response
19
9
 
10
+ def initialize(context = nil)
11
+ super(context)
12
+
13
+ app = context.respond_to?(:app) ? context.app : Sinatra::Application
14
+ @browser = Sinatra::TestHarness.new(app)
15
+ end
16
+
20
17
  %w(get head post put delete).each do |verb|
21
- alias_method "orig_#{verb}", verb
22
- define_method(verb) do |*args| # (path, data, headers = nil)
23
- path, data, headers = *args
24
- data = data.inject({}) {|data, (key,value)| data[key] = Rack::Utils.unescape(value); data }
25
- params = data.merge(:env => headers || {})
26
- self.__send__("orig_#{verb}", path, params)
27
- end
18
+ class_eval <<-RUBY
19
+ def #{verb}(path, data, headers = {})
20
+ params = data.inject({}) do |data, (key,value)|
21
+ data[key] = Rack::Utils.unescape(value)
22
+ data
23
+ end
24
+ headers["HTTP_HOST"] = "www.example.com"
25
+ @browser.#{verb}(path, params, headers)
26
+ end
27
+ RUBY
28
28
  end
29
+
30
+ def response_body
31
+ @browser.body
32
+ end
33
+
34
+ def response_code
35
+ @browser.status
36
+ end
37
+
38
+ private
39
+
40
+ def response
41
+ @browser.response
42
+ end
29
43
  end
30
44
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webrat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
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: 2009-02-24 00:00:00 -05:00
12
+ date: 2009-03-17 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency