jwilger-webrat 0.4.3.4 → 0.4.4.2

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 (62) hide show
  1. data/History.txt +34 -0
  2. data/Rakefile +16 -3
  3. data/lib/webrat/core/configuration.rb +9 -16
  4. data/lib/webrat/core/elements/area.rb +7 -7
  5. data/lib/webrat/core/elements/element.rb +11 -11
  6. data/lib/webrat/core/elements/field.rb +50 -50
  7. data/lib/webrat/core/elements/form.rb +17 -17
  8. data/lib/webrat/core/elements/label.rb +6 -6
  9. data/lib/webrat/core/elements/link.rb +13 -11
  10. data/lib/webrat/core/elements/select_option.rb +9 -9
  11. data/lib/webrat/core/locators/area_locator.rb +10 -10
  12. data/lib/webrat/core/locators/button_locator.rb +13 -13
  13. data/lib/webrat/core/locators/field_by_id_locator.rb +8 -8
  14. data/lib/webrat/core/locators/field_labeled_locator.rb +11 -11
  15. data/lib/webrat/core/locators/field_locator.rb +7 -7
  16. data/lib/webrat/core/locators/field_named_locator.rb +10 -10
  17. data/lib/webrat/core/locators/form_locator.rb +6 -6
  18. data/lib/webrat/core/locators/label_locator.rb +9 -9
  19. data/lib/webrat/core/locators/link_locator.rb +12 -12
  20. data/lib/webrat/core/locators/locator.rb +5 -5
  21. data/lib/webrat/core/locators/select_option_locator.rb +11 -11
  22. data/lib/webrat/core/locators.rb +2 -2
  23. data/lib/webrat/core/logging.rb +7 -4
  24. data/lib/webrat/core/matchers/have_content.rb +12 -12
  25. data/lib/webrat/core/matchers/have_selector.rb +9 -9
  26. data/lib/webrat/core/matchers/have_tag.rb +4 -4
  27. data/lib/webrat/core/matchers/have_xpath.rb +24 -24
  28. data/lib/webrat/core/methods.rb +14 -10
  29. data/lib/webrat/core/mime.rb +3 -3
  30. data/lib/webrat/core/save_and_open_page.rb +9 -9
  31. data/lib/webrat/core/scope.rb +54 -52
  32. data/lib/webrat/core/session.rb +20 -13
  33. data/lib/webrat/core/xml/hpricot.rb +3 -3
  34. data/lib/webrat/core/xml/nokogiri.rb +11 -11
  35. data/lib/webrat/core/xml/rexml.rb +3 -3
  36. data/lib/webrat/core/xml.rb +16 -16
  37. data/lib/webrat/core_extensions/blank.rb +1 -1
  38. data/lib/webrat/core_extensions/deprecate.rb +1 -1
  39. data/lib/webrat/core_extensions/detect_mapped.rb +4 -4
  40. data/lib/webrat/core_extensions/meta_class.rb +1 -1
  41. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  42. data/lib/webrat/mechanize.rb +9 -9
  43. data/lib/webrat/merb.rb +1 -1
  44. data/lib/webrat/merb_session.rb +10 -10
  45. data/lib/webrat/rack_test.rb +32 -0
  46. data/lib/webrat/rails.rb +2 -2
  47. data/lib/webrat/rspec-rails.rb +2 -2
  48. data/lib/webrat/selenium/application_server.rb +75 -0
  49. data/lib/webrat/selenium/matchers/have_content.rb +4 -4
  50. data/lib/webrat/selenium/matchers/have_selector.rb +4 -4
  51. data/lib/webrat/selenium/matchers/have_tag.rb +16 -16
  52. data/lib/webrat/selenium/matchers/have_xpath.rb +4 -4
  53. data/lib/webrat/selenium/matchers.rb +1 -1
  54. data/lib/webrat/selenium/merb_application_server.rb +50 -0
  55. data/lib/webrat/selenium/rails_application_server.rb +44 -0
  56. data/lib/webrat/selenium/selenium_rc_server.rb +90 -0
  57. data/lib/webrat/selenium/selenium_session.rb +22 -31
  58. data/lib/webrat/selenium/silence_stream.rb +14 -0
  59. data/lib/webrat/selenium/sinatra_application_server.rb +37 -0
  60. data/lib/webrat/selenium.rb +5 -81
  61. data/lib/webrat.rb +8 -11
  62. metadata +10 -2
@@ -0,0 +1,27 @@
1
+ class TCPSocket
2
+
3
+ def self.wait_for_service_with_timeout(options)
4
+ start_time = Time.now
5
+
6
+ until listening_service?(options)
7
+ verbose_wait
8
+
9
+ if options[:timeout] && (Time.now > start_time + options[:timeout])
10
+ raise SocketError.new("Socket did not open within #{options[:timeout]} seconds")
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.wait_for_service_termination_with_timeout(options)
16
+ start_time = Time.now
17
+
18
+ while listening_service?(options)
19
+ verbose_wait
20
+
21
+ if options[:timeout] && (Time.now > start_time + options[:timeout])
22
+ raise SocketError.new("Socket did not terminate within #{options[:timeout]} seconds")
23
+ end
24
+ end
25
+ end
26
+
27
+ end
@@ -2,14 +2,14 @@ require "mechanize"
2
2
 
3
3
  module Webrat #:nodoc:
4
4
  class MechanizeSession < Session #:nodoc:
5
-
5
+
6
6
  attr_accessor :response
7
7
  alias :page :response
8
-
8
+
9
9
  def request_page(url, http_method, data) #:nodoc:
10
10
  super(absolute_url(url), http_method, data)
11
11
  end
12
-
12
+
13
13
  def get(url, data, headers_argument_not_used = nil)
14
14
  @response = mechanize.get(url, data)
15
15
  end
@@ -26,7 +26,7 @@ module Webrat #:nodoc:
26
26
  end
27
27
  @response = mechanize.post(url, post_data)
28
28
  end
29
-
29
+
30
30
  def response_body
31
31
  @response.content
32
32
  end
@@ -34,13 +34,13 @@ module Webrat #:nodoc:
34
34
  def response_code
35
35
  @response.code.to_i
36
36
  end
37
-
37
+
38
38
  def mechanize
39
- @mechanize = WWW::Mechanize.new
39
+ @mechanize ||= WWW::Mechanize.new
40
40
  end
41
41
 
42
42
  def_delegators :mechanize, :basic_auth
43
-
43
+
44
44
  def absolute_url(url) #:nodoc:
45
45
  current_host, current_path = split_current_url
46
46
  if url =~ Regexp.new('^https?://')
@@ -53,13 +53,13 @@ module Webrat #:nodoc:
53
53
  url
54
54
  end
55
55
  end
56
-
56
+
57
57
  private
58
58
  def split_current_url
59
59
  current_url =~ Regexp.new('^(https?://[^/]+)(/.*)?')
60
60
  [Regexp.last_match(1), Regexp.last_match(2)]
61
61
  end
62
-
62
+
63
63
  def absolute_path(current_path, url)
64
64
  levels_up = url.split('/').find_all { |x| x == '..' }.size
65
65
  ancestor = if current_path.nil?
data/lib/webrat/merb.rb CHANGED
@@ -6,4 +6,4 @@ require "webrat"
6
6
 
7
7
  Webrat.configure do |config|
8
8
  config.mode = :merb
9
- end
9
+ end
@@ -10,36 +10,36 @@ require "merb-core"
10
10
  module Webrat
11
11
  class MerbSession < Session #:nodoc:
12
12
  include Merb::Test::MakeRequest
13
-
13
+
14
14
  attr_accessor :response
15
-
15
+
16
16
  def get(url, data, headers = nil)
17
17
  do_request(url, data, headers, "GET")
18
18
  end
19
-
19
+
20
20
  def post(url, data, headers = nil)
21
21
  do_request(url, data, headers, "POST")
22
22
  end
23
-
23
+
24
24
  def put(url, data, headers = nil)
25
25
  do_request(url, data, headers, "PUT")
26
26
  end
27
-
27
+
28
28
  def delete(url, data, headers = nil)
29
29
  do_request(url, data, headers, "DELETE")
30
30
  end
31
-
31
+
32
32
  def response_body
33
33
  @response.body.to_s
34
34
  end
35
-
35
+
36
36
  def response_code
37
37
  @response.status
38
38
  end
39
-
39
+
40
40
  def do_request(url, data, headers, method)
41
- @response = request(url,
42
- :params => (data && data.any?) ? data : nil,
41
+ @response = request(url,
42
+ :params => (data && data.any?) ? data : nil,
43
43
  :headers => headers,
44
44
  :method => method)
45
45
  end
@@ -0,0 +1,32 @@
1
+ module Webrat
2
+ class RackTestSession < Session
3
+
4
+ def initialize(rack_test_session) #:nodoc:
5
+ super()
6
+ @rack_test_session = rack_test_session
7
+ end
8
+
9
+ def response_body
10
+ response.body
11
+ end
12
+
13
+ def response_code
14
+ response.status
15
+ end
16
+
17
+ def response
18
+ @rack_test_session.last_response
19
+ end
20
+
21
+ protected
22
+
23
+ def process_request(http_method, url, data = {}, headers = {})
24
+ headers ||= {}
25
+ data ||= {}
26
+
27
+ env = headers.merge(:params => data, :method => http_method.to_s.upcase)
28
+ @rack_test_session.request(url, env)
29
+ end
30
+
31
+ end
32
+ end
data/lib/webrat/rails.rb CHANGED
@@ -7,7 +7,7 @@ require "action_controller/record_identifier"
7
7
  module Webrat
8
8
  class RailsSession < Session #:nodoc:
9
9
  include ActionController::RecordIdentifier
10
-
10
+
11
11
  # The Rails version of within supports passing in a model and Webrat
12
12
  # will apply a scope based on Rails' dom_id for that model.
13
13
  #
@@ -22,7 +22,7 @@ module Webrat
22
22
  super('#' + dom_id(selector_or_object), &block)
23
23
  end
24
24
  end
25
-
25
+
26
26
  def doc_root
27
27
  File.expand_path(File.join(RAILS_ROOT, 'public'))
28
28
  end
@@ -1,6 +1,6 @@
1
1
  # Supports using the matchers in controller, helper, and view specs if you're
2
2
  # using rspec-rails. Just add a require statement to spec/spec_helper.rb or env.rb:
3
- #
3
+ #
4
4
  # require 'webrat/rspec-rails'
5
5
  #
6
6
  require "webrat/core/matchers"
@@ -10,4 +10,4 @@ Spec::Runner.configure do |config|
10
10
  config.include(Webrat::Matchers, :type => :controller)
11
11
  config.include(Webrat::Matchers, :type => :helper)
12
12
  config.include(Webrat::Matchers, :type => :view)
13
- end
13
+ end
@@ -0,0 +1,75 @@
1
+ module Webrat
2
+ module Selenium
3
+
4
+ class ApplicationServer
5
+
6
+ include Webrat::Selenium::SilenceStream
7
+
8
+ def self.boot
9
+ case Webrat.configuration.application_framework
10
+ when :sinatra
11
+ require "webrat/selenium/sinatra_application_server"
12
+ SinatraApplicationServer.new.boot
13
+ when :merb
14
+ require "webrat/selenium/merb_application_server"
15
+ MerbApplicationServer.new.boot
16
+ when :rails
17
+ require "webrat/selenium/rails_application_server"
18
+ RailsApplicationServer.new.boot
19
+ else
20
+ raise WebratError.new(<<-STR)
21
+ Unknown Webrat application_framework: #{Webrat.configuration.application_framework.inspect}
22
+
23
+ Please ensure you have a Webrat configuration block that specifies an application_framework
24
+ in your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber).
25
+
26
+ For example:
27
+
28
+ Webrat.configure do |config|
29
+ # ...
30
+ config.application_framework = :rails
31
+ end
32
+ STR
33
+ end
34
+ end
35
+
36
+ def boot
37
+ start
38
+ wait
39
+ stop_at_exit
40
+ end
41
+
42
+ def stop_at_exit
43
+ at_exit do
44
+ stop
45
+ end
46
+ end
47
+
48
+ def wait
49
+ $stderr.print "==> Waiting for #{Webrat.configuration.application_framework} application server on port #{Webrat.configuration.application_port}... "
50
+ wait_for_socket
51
+ $stderr.print "Ready!\n"
52
+ end
53
+
54
+ def wait_for_socket
55
+ silence_stream(STDOUT) do
56
+ silence_stream(STDERR) do
57
+ TCPSocket.wait_for_service_with_timeout \
58
+ :host => Webrat.configuration.application_address,
59
+ :port => Webrat.configuration.application_port.to_i,
60
+ :timeout => 30 # seconds
61
+ end
62
+ end
63
+ rescue SocketError
64
+ fail
65
+ end
66
+
67
+ def prepare_pid_file(file_path, pid_file_name)
68
+ FileUtils.mkdir_p File.expand_path(file_path)
69
+ File.expand_path("#{file_path}/#{pid_file_name}")
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+ end
@@ -5,14 +5,14 @@ module Webrat
5
5
  def initialize(content)
6
6
  @content = content
7
7
  end
8
-
8
+
9
9
  def matches?(response)
10
10
  if @content.is_a?(Regexp)
11
11
  text_finder = "regexp:#{@content.source}"
12
12
  else
13
13
  text_finder = @content
14
14
  end
15
-
15
+
16
16
  response.session.wait_for do
17
17
  response.selenium.is_text_present(text_finder)
18
18
  end
@@ -47,7 +47,7 @@ module Webrat
47
47
  def contain(content)
48
48
  HasContent.new(content)
49
49
  end
50
-
50
+
51
51
  # Asserts that the body of the response contain
52
52
  # the supplied string or regexp
53
53
  def assert_contain(content)
@@ -63,4 +63,4 @@ module Webrat
63
63
  end
64
64
  end
65
65
  end
66
- end
66
+ end
@@ -5,7 +5,7 @@ module Webrat
5
5
  def initialize(expected)
6
6
  @expected = expected
7
7
  end
8
-
8
+
9
9
  def matches?(response)
10
10
  response.session.wait_for do
11
11
  response.selenium.is_element_present("css=#{@expected}")
@@ -26,11 +26,11 @@ module Webrat
26
26
  "expected following text to not match selector #{@expected}:\n#{@document}"
27
27
  end
28
28
  end
29
-
29
+
30
30
  def have_selector(content)
31
31
  HaveSelector.new(content)
32
32
  end
33
-
33
+
34
34
  # Asserts that the body of the response contains
35
35
  # the supplied selector
36
36
  def assert_have_selector(expected)
@@ -46,4 +46,4 @@ module Webrat
46
46
  end
47
47
  end
48
48
  end
49
- end
49
+ end
@@ -1,72 +1,72 @@
1
1
  module Webrat
2
2
  module Selenium
3
3
  module Matchers
4
-
4
+
5
5
  class HaveTag < HaveSelector #:nodoc:
6
6
  # ==== Returns
7
7
  # String:: The failure message.
8
8
  def failure_message
9
9
  "expected following output to contain a #{tag_inspect} tag:\n#{@document}"
10
10
  end
11
-
11
+
12
12
  # ==== Returns
13
13
  # String:: The failure message to be displayed in negative matches.
14
14
  def negative_failure_message
15
15
  "expected following output to omit a #{tag_inspect}:\n#{@document}"
16
16
  end
17
-
17
+
18
18
  def tag_inspect
19
19
  options = @expected.last.dup
20
20
  content = options.delete(:content)
21
-
21
+
22
22
  html = "<#{@expected.first}"
23
23
  options.each do |k,v|
24
24
  html << " #{k}='#{v}'"
25
25
  end
26
-
26
+
27
27
  if content
28
28
  html << ">#{content}</#{@expected.first}>"
29
29
  else
30
30
  html << "/>"
31
31
  end
32
-
32
+
33
33
  html
34
34
  end
35
-
35
+
36
36
  def query
37
37
  options = @expected.last.dup
38
38
  selector = @expected.first.to_s
39
-
39
+
40
40
  selector << ":contains('#{options.delete(:content)}')" if options[:content]
41
-
41
+
42
42
  options.each do |key, value|
43
43
  selector << "[#{key}='#{value}']"
44
44
  end
45
-
45
+
46
46
  Nokogiri::CSS.parse(selector).map { |ast| ast.to_xpath }
47
47
  end
48
48
  end
49
-
49
+
50
50
  def have_tag(name, attributes = {}, &block)
51
51
  HaveTag.new([name, attributes], &block)
52
52
  end
53
-
53
+
54
54
  alias_method :match_tag, :have_tag
55
-
55
+
56
56
  # Asserts that the body of the response contains
57
57
  # the supplied tag with the associated selectors
58
58
  def assert_have_tag(name, attributes = {})
59
59
  ht = HaveTag.new([name, attributes])
60
60
  assert ht.matches?(response), ht.failure_message
61
61
  end
62
-
62
+
63
63
  # Asserts that the body of the response
64
64
  # does not contain the supplied string or regepx
65
65
  def assert_have_no_tag(name, attributes = {})
66
66
  ht = HaveTag.new([name, attributes])
67
67
  assert !ht.matches?(response), ht.negative_failure_message
68
68
  end
69
-
69
+
70
70
  end
71
71
  end
72
- end
72
+ end
@@ -5,7 +5,7 @@ module Webrat
5
5
  def initialize(expected)
6
6
  @expected = expected
7
7
  end
8
-
8
+
9
9
  def matches?(response)
10
10
  response.session.wait_for do
11
11
  response.selenium.is_element_present("xpath=#{@expected}")
@@ -26,11 +26,11 @@ module Webrat
26
26
  "expected following text to not match xpath #{@expected}:\n#{@document}"
27
27
  end
28
28
  end
29
-
29
+
30
30
  def have_xpath(xpath)
31
31
  HaveXpath.new(xpath)
32
32
  end
33
-
33
+
34
34
  def assert_have_xpath(expected)
35
35
  hs = HaveXpath.new(expected)
36
36
  assert hs.matches?(response), hs.failure_message
@@ -42,4 +42,4 @@ module Webrat
42
42
  end
43
43
  end
44
44
  end
45
- end
45
+ end
@@ -1,4 +1,4 @@
1
1
  require "webrat/selenium/matchers/have_xpath"
2
2
  require "webrat/selenium/matchers/have_selector"
3
3
  # require "webrat/selenium/matchers/have_tag"
4
- require "webrat/selenium/matchers/have_content"
4
+ require "webrat/selenium/matchers/have_content"
@@ -0,0 +1,50 @@
1
+ module Webrat
2
+ module Selenium
3
+
4
+ class MerbApplicationServer < ApplicationServer
5
+
6
+ def start
7
+ system start_command
8
+ end
9
+
10
+ def stop
11
+ silence_stream(STDERR) do
12
+ silence_stream(STDOUT) do
13
+ pid = File.read(pid_file)
14
+ system("kill -9 #{pid}")
15
+ FileUtils.rm_f pid_file
16
+ end
17
+ end
18
+ end
19
+
20
+ def fail
21
+ $stderr.puts
22
+ $stderr.puts
23
+ $stderr.puts "==> Failed to boot the Merb application server... exiting!"
24
+ $stderr.puts
25
+ $stderr.puts "Verify you can start a Merb server on port #{Webrat.configuration.application_port} with the following command:"
26
+ $stderr.puts
27
+ $stderr.puts " #{start_command}"
28
+ exit
29
+ end
30
+
31
+ def pid_file
32
+ "log/merb.#{Webrat.configuration.application_port}.pid"
33
+ end
34
+
35
+ def start_command
36
+ "#{merb_command} -d -p #{Webrat.configuration.application_port} -e #{Webrat.configuration.application_environment}"
37
+ end
38
+
39
+ def merb_command
40
+ if File.exist?('bin/merb')
41
+ merb_cmd = 'bin/merb'
42
+ else
43
+ merb_cmd = 'merb'
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,44 @@
1
+ module Webrat
2
+ module Selenium
3
+
4
+ class RailsApplicationServer < ApplicationServer
5
+
6
+ def start
7
+ system start_command
8
+ end
9
+
10
+ def stop
11
+ silence_stream(STDERR) do
12
+ silence_stream(STDOUT) do
13
+ system stop_command
14
+ end
15
+ end
16
+ end
17
+
18
+ def fail
19
+ $stderr.puts
20
+ $stderr.puts
21
+ $stderr.puts "==> Failed to boot the Rails application server... exiting!"
22
+ $stderr.puts
23
+ $stderr.puts "Verify you can start a Rails server on port #{Webrat.configuration.application_port} with the following command:"
24
+ $stderr.puts
25
+ $stderr.puts " #{start_command}"
26
+ exit
27
+ end
28
+
29
+ def pid_file
30
+ prepare_pid_file("#{RAILS_ROOT}/tmp/pids", "mongrel_selenium.pid")
31
+ end
32
+
33
+ def start_command
34
+ "mongrel_rails start -d --chdir='#{RAILS_ROOT}' --port=#{Webrat.configuration.application_port} --environment=#{Webrat.configuration.application_environment} --pid #{pid_file} &"
35
+ end
36
+
37
+ def stop_command
38
+ "mongrel_rails stop -c #{RAILS_ROOT} --pid #{pid_file}"
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,90 @@
1
+ module Webrat
2
+ module Selenium
3
+
4
+ class SeleniumRCServer
5
+
6
+ include Webrat::Selenium::SilenceStream
7
+
8
+ def self.boot
9
+ new.boot
10
+ end
11
+
12
+ def boot
13
+ return if selenium_grid?
14
+
15
+ start
16
+ wait
17
+ stop_at_exit
18
+ end
19
+
20
+ def start
21
+ silence_stream(STDERR) do
22
+ silence_stream(STDOUT) do
23
+ remote_control.start :background => true
24
+ end
25
+ end
26
+ end
27
+
28
+ def stop_at_exit
29
+ at_exit do
30
+ stop
31
+ end
32
+ end
33
+
34
+ def remote_control
35
+ return @remote_control if @remote_control
36
+
37
+ @remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0",
38
+ Webrat.configuration.selenium_server_port,
39
+ Webrat.configuration.selenium_browser_startup_timeout)
40
+ @remote_control.jar_file = jar_path
41
+
42
+ return @remote_control
43
+ end
44
+
45
+ def jar_path
46
+ File.expand_path(__FILE__ + "../../../../../vendor/selenium-server.jar")
47
+ end
48
+
49
+ def selenium_grid?
50
+ Webrat.configuration.selenium_server_address
51
+ end
52
+
53
+ def wait
54
+ $stderr.print "==> Waiting for Selenium RC server on port #{Webrat.configuration.selenium_server_port}... "
55
+ wait_for_socket
56
+ $stderr.print "Ready!\n"
57
+ rescue SocketError
58
+ fail
59
+ end
60
+
61
+ def wait_for_socket
62
+ silence_stream(STDERR) do
63
+ silence_stream(STDOUT) do
64
+ TCPSocket.wait_for_service_with_timeout \
65
+ :host => (Webrat.configuration.selenium_server_address || "0.0.0.0"),
66
+ :port => Webrat.configuration.selenium_server_port,
67
+ :timeout => 15 # seconds
68
+ end
69
+ end
70
+ end
71
+
72
+ def fail
73
+ $stderr.puts
74
+ $stderr.puts
75
+ $stderr.puts "==> Failed to boot the Selenium RC server... exiting!"
76
+ exit
77
+ end
78
+
79
+ def stop
80
+ silence_stream(STDERR) do
81
+ silence_stream(STDOUT) do
82
+ ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", Webrat.configuration.selenium_server_port, 5).stop
83
+ end
84
+ end
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+ end