webrat 0.3.4 → 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.
Files changed (63) hide show
  1. data/History.txt +140 -30
  2. data/README.rdoc +85 -0
  3. data/Rakefile +72 -22
  4. data/install.rb +1 -1
  5. data/lib/webrat.rb +12 -17
  6. data/lib/webrat/core.rb +9 -7
  7. data/lib/webrat/core/configuration.rb +87 -0
  8. data/lib/webrat/core/{area.rb → elements/area.rb} +7 -20
  9. data/lib/webrat/core/elements/element.rb +33 -0
  10. data/lib/webrat/core/elements/field.rb +394 -0
  11. data/lib/webrat/core/elements/form.rb +103 -0
  12. data/lib/webrat/core/elements/label.rb +31 -0
  13. data/lib/webrat/core/{link.rb → elements/link.rb} +15 -26
  14. data/lib/webrat/core/elements/select_option.rb +35 -0
  15. data/lib/webrat/core/locators.rb +13 -85
  16. data/lib/webrat/core/locators/area_locator.rb +38 -0
  17. data/lib/webrat/core/locators/button_locator.rb +54 -0
  18. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  19. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  20. data/lib/webrat/core/locators/field_locator.rb +25 -0
  21. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  22. data/lib/webrat/core/locators/form_locator.rb +19 -0
  23. data/lib/webrat/core/locators/label_locator.rb +34 -0
  24. data/lib/webrat/core/locators/link_locator.rb +66 -0
  25. data/lib/webrat/core/locators/locator.rb +20 -0
  26. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  27. data/lib/webrat/core/logging.rb +5 -9
  28. data/lib/webrat/core/matchers/have_content.rb +19 -44
  29. data/lib/webrat/core/matchers/have_selector.rb +15 -2
  30. data/lib/webrat/core/matchers/have_tag.rb +15 -2
  31. data/lib/webrat/core/matchers/have_xpath.rb +21 -28
  32. data/lib/webrat/core/methods.rb +32 -15
  33. data/lib/webrat/core/mime.rb +3 -3
  34. data/lib/webrat/core/save_and_open_page.rb +50 -0
  35. data/lib/webrat/core/scope.rb +183 -41
  36. data/lib/webrat/core/session.rb +125 -63
  37. data/lib/webrat/core/xml.rb +115 -0
  38. data/lib/webrat/core/xml/hpricot.rb +19 -0
  39. data/lib/webrat/core/xml/nokogiri.rb +76 -0
  40. data/lib/webrat/core/xml/rexml.rb +24 -0
  41. data/lib/webrat/core_extensions/deprecate.rb +1 -1
  42. data/lib/webrat/mechanize.rb +58 -12
  43. data/lib/webrat/merb.rb +7 -73
  44. data/lib/webrat/merb_session.rb +65 -0
  45. data/lib/webrat/rack.rb +1 -1
  46. data/lib/webrat/rails.rb +56 -55
  47. data/lib/webrat/rspec-rails.rb +13 -0
  48. data/lib/webrat/selenium.rb +92 -1
  49. data/lib/webrat/selenium/matchers.rb +146 -0
  50. data/lib/webrat/selenium/selenium_session.rb +179 -80
  51. data/lib/webrat/sinatra.rb +14 -4
  52. data/vendor/selenium-server.jar +0 -0
  53. metadata +36 -17
  54. data/README.txt +0 -90
  55. data/TODO.txt +0 -10
  56. data/init.rb +0 -3
  57. data/lib/webrat/core/field.rb +0 -332
  58. data/lib/webrat/core/flunk.rb +0 -7
  59. data/lib/webrat/core/form.rb +0 -130
  60. data/lib/webrat/core/label.rb +0 -18
  61. data/lib/webrat/core/nokogiri.rb +0 -44
  62. data/lib/webrat/core/select_option.rb +0 -29
  63. data/lib/webrat/rails/redirect_actions.rb +0 -18
@@ -0,0 +1,24 @@
1
+ module Webrat
2
+
3
+ def self.rexml_document(stringlike)
4
+ stringlike = stringlike.body.to_s if stringlike.respond_to?(:body)
5
+
6
+ case stringlike
7
+ when REXML::Document
8
+ stringlike.root
9
+ when REXML::Node, Array
10
+ stringlike
11
+ else
12
+ begin
13
+ REXML::Document.new(stringlike.to_s).root
14
+ rescue REXML::ParseException => e
15
+ if e.message.include?("second root element")
16
+ REXML::Document.new("<fake-root-element>#{stringlike}</fake-root-element>").root
17
+ else
18
+ raise e
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ end
@@ -1,5 +1,5 @@
1
1
  class Module #:nodoc:
2
- def deprecate(old_method_name, new_method_name)
2
+ def webrat_deprecate(old_method_name, new_method_name)
3
3
  define_method old_method_name do |*args|
4
4
  warn "#{old_method_name} is deprecated. Use #{new_method_name} instead."
5
5
  __send__(new_method_name, *args)
@@ -1,28 +1,74 @@
1
1
  require "mechanize"
2
2
 
3
- module Webrat
3
+ module Webrat #:nodoc:
4
4
  class MechanizeSession < Session #:nodoc:
5
5
 
6
- def initialize(mechanize = WWW::Mechanize.new)
7
- super()
8
- @mechanize = mechanize
6
+ attr_accessor :response
7
+ alias :page :response
8
+
9
+ def request_page(url, http_method, data) #:nodoc:
10
+ super(absolute_url(url), http_method, data)
9
11
  end
10
12
 
11
- def get(url, data)
12
- @mechanize_page = @mechanize.get(url, data)
13
+ def get(url, data, headers_argument_not_used = nil)
14
+ @response = mechanize.get(url, data)
13
15
  end
14
16
 
15
- def post(url, data)
16
- @mechanize_page = @mechanize.post(url, data)
17
+ def post(url, data, headers_argument_not_used = nil)
18
+ post_data = data.inject({}) do |memo, param|
19
+ case param.last
20
+ when Hash
21
+ param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
22
+ else
23
+ memo[param.first] = param.last
24
+ end
25
+ memo
26
+ end
27
+ @response = mechanize.post(url, post_data)
17
28
  end
18
-
29
+
19
30
  def response_body
20
- @mechanize_page.content
31
+ @response.content
21
32
  end
22
33
 
23
34
  def response_code
24
- @mechanize_page.code.to_i
35
+ @response.code.to_i
36
+ end
37
+
38
+ def mechanize
39
+ @mechanize = WWW::Mechanize.new
25
40
  end
41
+
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
26
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
27
73
  end
28
- end
74
+ end
@@ -1,75 +1,9 @@
1
- require "webrat/core"
1
+ require "webrat"
2
2
 
3
- require "cgi"
4
- gem "extlib"
5
- require "extlib"
6
- require "merb-core"
7
-
8
- HashWithIndifferentAccess = Mash
9
-
10
- module Webrat
11
- class MerbSession < Session #:nodoc:
12
- include Merb::Test::MakeRequest
13
-
14
- attr_accessor :response
15
-
16
- def get(url, data, headers = nil)
17
- do_request(url, data, headers, "GET")
18
- end
19
-
20
- def post(url, data, headers = nil)
21
- do_request(url, data, headers, "POST")
22
- end
23
-
24
- def put(url, data, headers = nil)
25
- do_request(url, data, headers, "PUT")
26
- end
27
-
28
- def delete(url, data, headers = nil)
29
- do_request(url, data, headers, "DELETE")
30
- end
31
-
32
- def response_body
33
- @response.body.to_s
34
- end
35
-
36
- def response_code
37
- @response.status
38
- end
39
-
40
- def do_request(url, data, headers, method)
41
- @response = request(url,
42
- :params => (data && data.any?) ? data : nil,
43
- :headers => headers,
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
- end
51
-
52
- end
53
- end
54
-
55
- module Merb
56
- module Test
57
- module RequestHelper #:nodoc:
58
- def request(uri, env = {})
59
- @_webrat_session ||= Webrat::MerbSession.new
60
- @_webrat_session.response = @_webrat_session.request(uri, env)
61
- end
62
-
63
- def follow_redirect
64
- @_webrat_session.follow_redirect
65
- end
66
- end
67
- end
68
- end
69
-
70
- class Merb::Test::RspecStory #:nodoc:
71
- def browser
72
- @browser ||= Webrat::MerbSession.new
73
- end
74
- end
3
+ # This is a temporary hack to support backwards compatibility
4
+ # with Merb 1.0.8 until it's updated to use the new Webrat.configure
5
+ # syntax
75
6
 
7
+ Webrat.configure do |config|
8
+ config.mode = :merb
9
+ end
@@ -0,0 +1,65 @@
1
+ require "webrat"
2
+
3
+ require "cgi"
4
+ gem "extlib"
5
+ require "extlib"
6
+ require "merb-core"
7
+
8
+ HashWithIndifferentAccess = Mash
9
+
10
+ module Webrat
11
+ class MerbSession < Session #:nodoc:
12
+ include Merb::Test::MakeRequest
13
+
14
+ attr_accessor :response
15
+
16
+ def get(url, data, headers = nil)
17
+ do_request(url, data, headers, "GET")
18
+ end
19
+
20
+ def post(url, data, headers = nil)
21
+ do_request(url, data, headers, "POST")
22
+ end
23
+
24
+ def put(url, data, headers = nil)
25
+ do_request(url, data, headers, "PUT")
26
+ end
27
+
28
+ def delete(url, data, headers = nil)
29
+ do_request(url, data, headers, "DELETE")
30
+ end
31
+
32
+ def response_body
33
+ @response.body.to_s
34
+ end
35
+
36
+ def response_code
37
+ @response.status
38
+ end
39
+
40
+ def do_request(url, data, headers, method)
41
+ @response = request(url,
42
+ :params => (data && data.any?) ? data : nil,
43
+ :headers => headers,
44
+ :method => method)
45
+ end
46
+
47
+ end
48
+ end
49
+
50
+ module Merb #:nodoc:
51
+ module Test #:nodoc:
52
+ module RequestHelper #:nodoc:
53
+ def request(uri, env = {})
54
+ @_webrat_session ||= Webrat::MerbSession.new
55
+ @_webrat_session.response = @_webrat_session.request(uri, env)
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ class Merb::Test::RspecStory #:nodoc:
62
+ def browser
63
+ @browser ||= Webrat::MerbSession.new
64
+ end
65
+ end
@@ -21,4 +21,4 @@ module Webrat
21
21
  @response.status
22
22
  end
23
23
  end
24
- end
24
+ end
@@ -1,102 +1,103 @@
1
1
  require "webrat"
2
2
 
3
+ require "action_controller"
4
+ require "action_controller/integration"
5
+ require "action_controller/record_identifier"
6
+
3
7
  module Webrat
4
8
  class RailsSession < Session #:nodoc:
9
+ include ActionController::RecordIdentifier
5
10
 
6
- def initialize(integration_session)
7
- super()
8
- @integration_session = integration_session
11
+ # The Rails version of within supports passing in a model and Webrat
12
+ # will apply a scope based on Rails' dom_id for that model.
13
+ #
14
+ # Example:
15
+ # within User.last do
16
+ # click_link "Delete"
17
+ # end
18
+ def within(selector_or_object, &block)
19
+ if selector_or_object.is_a?(String)
20
+ super
21
+ else
22
+ super('#' + dom_id(selector_or_object), &block)
23
+ end
9
24
  end
10
-
25
+
11
26
  def doc_root
12
27
  File.expand_path(File.join(RAILS_ROOT, 'public'))
13
28
  end
14
-
29
+
15
30
  def saved_page_dir
16
31
  File.expand_path(File.join(RAILS_ROOT, "tmp"))
17
32
  end
18
-
33
+
19
34
  def get(url, data, headers = nil)
20
35
  do_request(:get, url, data, headers)
21
36
  end
22
-
37
+
23
38
  def post(url, data, headers = nil)
24
39
  do_request(:post, url, data, headers)
25
40
  end
26
-
41
+
27
42
  def put(url, data, headers = nil)
28
43
  do_request(:put, url, data, headers)
29
44
  end
30
-
45
+
31
46
  def delete(url, data, headers = nil)
32
47
  do_request(:delete, url, data, headers)
33
48
  end
34
-
49
+
35
50
  def response_body
36
51
  response.body
37
52
  end
38
-
53
+
39
54
  def response_code
40
55
  response.code.to_i
41
56
  end
42
-
57
+
58
+ def xml_content_type?
59
+ response.headers["Content-Type"].to_s =~ /xml/
60
+ end
61
+
43
62
  protected
44
-
63
+
64
+ def integration_session
65
+ @context
66
+ end
67
+
45
68
  def do_request(http_method, url, data, headers) #:nodoc:
46
69
  update_protocol(url)
47
- @integration_session.request_via_redirect(http_method, remove_protocol(url), data, headers)
70
+ integration_session.send(http_method, normalize_url(url), data, headers)
48
71
  end
49
-
50
- def remove_protocol(href) #:nodoc:
51
- if href =~ %r{^https?://www.example.com(/.*)}
52
- $LAST_MATCH_INFO.captures.first
53
- else
54
- href
72
+
73
+ # remove protocol, host and anchor
74
+ def normalize_url(href) #:nodoc:
75
+ uri = URI.parse(href)
76
+ normalized_url = uri.path
77
+ if uri.query
78
+ normalized_url += "?" + uri.query
55
79
  end
80
+ normalized_url
56
81
  end
57
-
82
+
58
83
  def update_protocol(href) #:nodoc:
59
84
  if href =~ /^https:/
60
- @integration_session.https!(true)
85
+ integration_session.https!(true)
61
86
  elsif href =~ /^http:/
62
- @integration_session.https!(false)
87
+ integration_session.https!(false)
63
88
  end
64
89
  end
65
-
90
+
66
91
  def response #:nodoc:
67
- @integration_session.response
92
+ integration_session.response
68
93
  end
69
-
94
+
70
95
  end
71
96
  end
72
97
 
73
- module ActionController
74
- module Integration
75
- class Session #:nodoc:
76
-
77
- unless instance_methods.include?("put_via_redirect")
78
- require "webrat/rails/redirect_actions"
79
- include Webrat::RedirectActions
80
- end
81
-
82
- def respond_to?(name)
83
- super || webrat_session.respond_to?(name)
84
- end
85
-
86
- def method_missing(name, *args, &block)
87
- if webrat_session.respond_to?(name)
88
- webrat_session.send(name, *args, &block)
89
- else
90
- super
91
- end
92
- end
93
-
94
- protected
95
-
96
- def webrat_session
97
- @webrat_session ||= Webrat::RailsSession.new(self)
98
- end
99
-
100
- end
98
+ module ActionController #:nodoc:
99
+ IntegrationTest.class_eval do
100
+ include Webrat::Methods
101
+ include Webrat::Matchers
101
102
  end
102
- end
103
+ end
@@ -0,0 +1,13 @@
1
+ # Supports using the matchers in controller, helper, and view specs if you're
2
+ # using rspec-rails. Just add a require statement to spec/spec_helper.rb or env.rb:
3
+ #
4
+ # require 'webrat/rspec-rails'
5
+ #
6
+ require "webrat/core/matchers"
7
+
8
+ Spec::Runner.configure do |config|
9
+ # rspec should support :type => [:controller, :helper, :view] - but until it does ...
10
+ config.include(Webrat::Matchers, :type => :controller)
11
+ config.include(Webrat::Matchers, :type => :helper)
12
+ config.include(Webrat::Matchers, :type => :view)
13
+ end