aslakhellesoy-webrat 0.3.2.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 (66) hide show
  1. data/History.txt +193 -0
  2. data/MIT-LICENSE.txt +19 -0
  3. data/README.rdoc +81 -0
  4. data/Rakefile +104 -0
  5. data/install.rb +1 -0
  6. data/lib/webrat.rb +34 -0
  7. data/lib/webrat/core.rb +14 -0
  8. data/lib/webrat/core/configuration.rb +44 -0
  9. data/lib/webrat/core/elements/area.rb +31 -0
  10. data/lib/webrat/core/elements/element.rb +33 -0
  11. data/lib/webrat/core/elements/field.rb +386 -0
  12. data/lib/webrat/core/elements/form.rb +103 -0
  13. data/lib/webrat/core/elements/label.rb +31 -0
  14. data/lib/webrat/core/elements/link.rb +90 -0
  15. data/lib/webrat/core/elements/select_option.rb +35 -0
  16. data/lib/webrat/core/locators.rb +20 -0
  17. data/lib/webrat/core/locators/area_locator.rb +38 -0
  18. data/lib/webrat/core/locators/button_locator.rb +54 -0
  19. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  20. data/lib/webrat/core/locators/field_labeled_locator.rb +50 -0
  21. data/lib/webrat/core/locators/field_locator.rb +25 -0
  22. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  23. data/lib/webrat/core/locators/form_locator.rb +19 -0
  24. data/lib/webrat/core/locators/label_locator.rb +34 -0
  25. data/lib/webrat/core/locators/link_locator.rb +66 -0
  26. data/lib/webrat/core/locators/locator.rb +20 -0
  27. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  28. data/lib/webrat/core/logging.rb +21 -0
  29. data/lib/webrat/core/matchers.rb +4 -0
  30. data/lib/webrat/core/matchers/have_content.rb +55 -0
  31. data/lib/webrat/core/matchers/have_selector.rb +37 -0
  32. data/lib/webrat/core/matchers/have_tag.rb +57 -0
  33. data/lib/webrat/core/matchers/have_xpath.rb +83 -0
  34. data/lib/webrat/core/methods.rb +60 -0
  35. data/lib/webrat/core/mime.rb +29 -0
  36. data/lib/webrat/core/save_and_open_page.rb +50 -0
  37. data/lib/webrat/core/scope.rb +330 -0
  38. data/lib/webrat/core/session.rb +218 -0
  39. data/lib/webrat/core/xml.rb +115 -0
  40. data/lib/webrat/core/xml/hpricot.rb +19 -0
  41. data/lib/webrat/core/xml/nokogiri.rb +76 -0
  42. data/lib/webrat/core/xml/rexml.rb +24 -0
  43. data/lib/webrat/core_extensions/blank.rb +58 -0
  44. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  45. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  46. data/lib/webrat/core_extensions/hash_with_indifferent_access.rb +131 -0
  47. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  48. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  49. data/lib/webrat/mechanize.rb +43 -0
  50. data/lib/webrat/merb.rb +77 -0
  51. data/lib/webrat/rack.rb +26 -0
  52. data/lib/webrat/rails.rb +96 -0
  53. data/lib/webrat/rails/redirect_actions.rb +18 -0
  54. data/lib/webrat/rspec-rails.rb +13 -0
  55. data/lib/webrat/selenium.rb +107 -0
  56. data/lib/webrat/selenium/location_strategy_javascript/button.js +12 -0
  57. data/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  58. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  59. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +9 -0
  60. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  61. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  62. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  63. data/lib/webrat/selenium/selenium_session.rb +230 -0
  64. data/lib/webrat/sinatra.rb +21 -0
  65. data/vendor/selenium-server.jar +0 -0
  66. metadata +136 -0
@@ -0,0 +1,58 @@
1
+ class Object #:nodoc:
2
+ # An object is blank if it's false, empty, or a whitespace string.
3
+ # For example, "", " ", +nil+, [], and {} are blank.
4
+ #
5
+ # This simplifies
6
+ #
7
+ # if !address.nil? && !address.empty?
8
+ #
9
+ # to
10
+ #
11
+ # if !address.blank?
12
+ def blank?
13
+ respond_to?(:empty?) ? empty? : !self
14
+ end
15
+
16
+ # An object is present if it's not blank.
17
+ def present?
18
+ !blank?
19
+ end
20
+ end
21
+
22
+ class NilClass #:nodoc:
23
+ def blank?
24
+ true
25
+ end
26
+ end
27
+
28
+ class FalseClass #:nodoc:
29
+ def blank?
30
+ true
31
+ end
32
+ end
33
+
34
+ class TrueClass #:nodoc:
35
+ def blank?
36
+ false
37
+ end
38
+ end
39
+
40
+ class Array #:nodoc:
41
+ alias_method :blank?, :empty?
42
+ end
43
+
44
+ class Hash #:nodoc:
45
+ alias_method :blank?, :empty?
46
+ end
47
+
48
+ class String #:nodoc:
49
+ def blank?
50
+ self !~ /\S/
51
+ end
52
+ end
53
+
54
+ class Numeric #:nodoc:
55
+ def blank?
56
+ false
57
+ end
58
+ end
@@ -0,0 +1,8 @@
1
+ class Module #:nodoc:
2
+ def webrat_deprecate(old_method_name, new_method_name)
3
+ define_method old_method_name do |*args|
4
+ warn "#{old_method_name} is deprecated. Use #{new_method_name} instead."
5
+ __send__(new_method_name, *args)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ class Array #:nodoc:
2
+
3
+ def detect_mapped
4
+ each do |element|
5
+ result = yield element
6
+ return result if result
7
+ end
8
+
9
+ return nil
10
+ end
11
+
12
+ end
@@ -0,0 +1,131 @@
1
+ # This class has dubious semantics and we only have it so that
2
+ # people can write params[:key] instead of params['key']
3
+ # and they get the same value for both keys.
4
+ class HashWithIndifferentAccess < Hash #:nodoc:
5
+ def initialize(constructor = {})
6
+ if constructor.is_a?(Hash)
7
+ super()
8
+ update(constructor)
9
+ else
10
+ super(constructor)
11
+ end
12
+ end
13
+
14
+ def default(key = nil)
15
+ if key.is_a?(Symbol) && include?(key = key.to_s)
16
+ self[key]
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ alias_method :regular_writer, :[]= unless method_defined?(:regular_writer)
23
+ alias_method :regular_update, :update unless method_defined?(:regular_update)
24
+
25
+ #
26
+ # Assigns a new value to the hash.
27
+ #
28
+ # Example:
29
+ #
30
+ # hash = HashWithIndifferentAccess.new
31
+ # hash[:key] = "value"
32
+ #
33
+ def []=(key, value)
34
+ regular_writer(convert_key(key), convert_value(value))
35
+ end
36
+
37
+ #
38
+ # Updates the instantized hash with values from the second.
39
+ #
40
+ # Example:
41
+ #
42
+ # >> hash_1 = HashWithIndifferentAccess.new
43
+ # => {}
44
+ #
45
+ # >> hash_1[:key] = "value"
46
+ # => "value"
47
+ #
48
+ # >> hash_2 = HashWithIndifferentAccess.new
49
+ # => {}
50
+ #
51
+ # >> hash_2[:key] = "New Value!"
52
+ # => "New Value!"
53
+ #
54
+ # >> hash_1.update(hash_2)
55
+ # => {"key"=>"New Value!"}
56
+ #
57
+ def update(other_hash)
58
+ other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) }
59
+ self
60
+ end
61
+
62
+ alias_method :merge!, :update
63
+
64
+ # Checks the hash for a key matching the argument passed in
65
+ def key?(key)
66
+ super(convert_key(key))
67
+ end
68
+
69
+ alias_method :include?, :key?
70
+ alias_method :has_key?, :key?
71
+ alias_method :member?, :key?
72
+
73
+ # Fetches the value for the specified key, same as doing hash[key]
74
+ def fetch(key, *extras)
75
+ super(convert_key(key), *extras)
76
+ end
77
+
78
+ # Returns an array of the values at the specified indicies.
79
+ def values_at(*indices)
80
+ indices.collect {|key| self[convert_key(key)]}
81
+ end
82
+
83
+ # Returns an exact copy of the hash.
84
+ def dup
85
+ HashWithIndifferentAccess.new(self)
86
+ end
87
+
88
+ # Merges the instantized and the specified hashes together, giving precedence to the values from the second hash
89
+ # Does not overwrite the existing hash.
90
+ def merge(hash)
91
+ self.dup.update(hash)
92
+ end
93
+
94
+ # Removes a specified key from the hash.
95
+ def delete(key)
96
+ super(convert_key(key))
97
+ end
98
+
99
+ def stringify_keys!; self end
100
+ def symbolize_keys!; self end
101
+ def to_options!; self end
102
+
103
+ # Convert to a Hash with String keys.
104
+ def to_hash
105
+ Hash.new(default).merge(self)
106
+ end
107
+
108
+ protected
109
+ def convert_key(key)
110
+ key.kind_of?(Symbol) ? key.to_s : key
111
+ end
112
+
113
+ def convert_value(value)
114
+ case value
115
+ when Hash
116
+ value.with_indifferent_access
117
+ when Array
118
+ value.collect { |e| e.is_a?(Hash) ? e.with_indifferent_access : e }
119
+ else
120
+ value
121
+ end
122
+ end
123
+ end
124
+
125
+ class Hash #:nodoc:
126
+ def with_indifferent_access
127
+ hash = HashWithIndifferentAccess.new(self)
128
+ hash.default = self.default
129
+ hash
130
+ end
131
+ end
@@ -0,0 +1,6 @@
1
+ class ::Object #:nodoc:
2
+ def meta_class
3
+ class << self; self end
4
+ end
5
+ end
6
+
@@ -0,0 +1,5 @@
1
+ class NilClass #:nodoc:
2
+ def to_param
3
+ nil
4
+ end
5
+ end
@@ -0,0 +1,43 @@
1
+ require "mechanize"
2
+
3
+ module Webrat #:nodoc:
4
+ class MechanizeSession < Session #:nodoc:
5
+
6
+ attr_accessor :response
7
+ alias :page :response
8
+
9
+ def get(url, data, headers_argument_not_used = nil)
10
+ @response = mechanize.get(url, data)
11
+ end
12
+
13
+ def post(url, data, headers_argument_not_used = nil)
14
+ post_data = data.inject({}) do |memo, param|
15
+ case param.last
16
+ when Hash
17
+ param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
18
+ else
19
+ memo[param.first] = param.last
20
+ end
21
+ memo
22
+ end
23
+ @response = mechanize.post(url, post_data)
24
+ end
25
+
26
+ def response_body
27
+ @response.content
28
+ end
29
+
30
+ def response_code
31
+ @response.code.to_i
32
+ end
33
+
34
+ def mechanize
35
+ @mechanize = WWW::Mechanize.new
36
+ end
37
+
38
+ def_delegators :mechanize, :basic_auth
39
+
40
+ end
41
+ end
42
+
43
+ Webrat.configuration.mode = :mechanize
@@ -0,0 +1,77 @@
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
+ 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 #:nodoc:
56
+ module Test #:nodoc:
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
75
+
76
+ Webrat.configuration.mode = :merb
77
+
@@ -0,0 +1,26 @@
1
+ require 'webrat'
2
+
3
+ class CGIMethods #:nodoc:
4
+ def self.parse_query_parameters(params)
5
+ hash = {}
6
+ params.split('&').each do |p|
7
+ pair = p.split('=')
8
+ hash[pair[0]] = pair[1]
9
+ end
10
+ hash
11
+ end
12
+ end
13
+
14
+ module Webrat
15
+ class RackSession < Session #:nodoc:
16
+ def response_body
17
+ @response.body
18
+ end
19
+
20
+ def response_code
21
+ @response.status
22
+ end
23
+ end
24
+ end
25
+
26
+ Webrat.configuration.mode = :rack
@@ -0,0 +1,96 @@
1
+ require "webrat"
2
+ require "action_controller/integration"
3
+
4
+ module Webrat
5
+ class RailsSession < Session #:nodoc:
6
+
7
+ def doc_root
8
+ File.expand_path(File.join(RAILS_ROOT, 'public'))
9
+ end
10
+
11
+ def saved_page_dir
12
+ File.expand_path(File.join(RAILS_ROOT, "tmp"))
13
+ end
14
+
15
+ def get(url, data, headers = nil)
16
+ do_request(:get, url, data, headers)
17
+ end
18
+
19
+ def post(url, data, headers = nil)
20
+ do_request(:post, url, data, headers)
21
+ end
22
+
23
+ def put(url, data, headers = nil)
24
+ do_request(:put, url, data, headers)
25
+ end
26
+
27
+ def delete(url, data, headers = nil)
28
+ do_request(:delete, url, data, headers)
29
+ end
30
+
31
+ def response_body
32
+ response.body
33
+ end
34
+
35
+ def response_code
36
+ response.code.to_i
37
+ end
38
+
39
+ def xml_content_type?
40
+ response.headers["Content-Type"].to_s =~ /xml/
41
+ end
42
+
43
+ protected
44
+
45
+ def integration_session
46
+ @context
47
+ end
48
+
49
+ def do_request(http_method, url, data, headers) #:nodoc:
50
+ update_protocol(url)
51
+ url = normalize_url(url)
52
+ integration_session.request_via_redirect(http_method, url, data, headers)
53
+ end
54
+
55
+ # remove protocol, host and anchor
56
+ def normalize_url(href) #:nodoc:
57
+ uri = URI.parse(href)
58
+ normalized_url = uri.path
59
+ if uri.query
60
+ normalized_url += "?" + uri.query
61
+ end
62
+ normalized_url
63
+ end
64
+
65
+ def update_protocol(href) #:nodoc:
66
+ if href =~ /^https:/
67
+ integration_session.https!(true)
68
+ elsif href =~ /^http:/
69
+ integration_session.https!(false)
70
+ end
71
+ end
72
+
73
+ def response #:nodoc:
74
+ integration_session.response
75
+ end
76
+
77
+ end
78
+ end
79
+
80
+ module ActionController #:nodoc:
81
+ module Integration #:nodoc:
82
+ Session.class_eval do
83
+ unless instance_methods.include?("put_via_redirect")
84
+ require "webrat/rails/redirect_actions"
85
+ include Webrat::RedirectActions
86
+ end
87
+ end
88
+ end
89
+
90
+ IntegrationTest.class_eval do
91
+ include Webrat::Methods
92
+ include Webrat::Matchers
93
+ end
94
+ end
95
+
96
+ Webrat.configuration.mode = :rails