webrat 0.2.0 → 0.3.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 (60) hide show
  1. data/History.txt +76 -14
  2. data/README.txt +40 -36
  3. data/Rakefile +80 -18
  4. data/TODO.txt +9 -3
  5. data/init.rb +1 -1
  6. data/lib/webrat.rb +30 -5
  7. data/lib/webrat/core.rb +12 -0
  8. data/lib/webrat/core/area.rb +44 -0
  9. data/lib/webrat/core/field.rb +332 -0
  10. data/lib/webrat/core/flunk.rb +7 -0
  11. data/lib/webrat/core/form.rb +130 -0
  12. data/lib/webrat/core/label.rb +18 -0
  13. data/lib/webrat/core/link.rb +101 -0
  14. data/lib/webrat/core/locators.rb +92 -0
  15. data/lib/webrat/core/logging.rb +25 -0
  16. data/lib/webrat/core/matchers.rb +4 -0
  17. data/lib/webrat/core/matchers/have_content.rb +94 -0
  18. data/lib/webrat/core/matchers/have_selector.rb +39 -0
  19. data/lib/webrat/core/matchers/have_tag.rb +58 -0
  20. data/lib/webrat/core/matchers/have_xpath.rb +85 -0
  21. data/lib/webrat/core/methods.rb +44 -0
  22. data/lib/webrat/core/mime.rb +29 -0
  23. data/lib/webrat/core/nokogiri.rb +42 -0
  24. data/lib/webrat/core/scope.rb +208 -0
  25. data/lib/webrat/core/select_option.rb +29 -0
  26. data/lib/webrat/core/session.rb +188 -0
  27. data/lib/webrat/core_extensions/blank.rb +58 -0
  28. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  29. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  30. data/lib/webrat/core_extensions/hash_with_indifferent_access.rb +131 -0
  31. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  32. data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  33. data/lib/webrat/mechanize.rb +28 -0
  34. data/lib/webrat/merb.rb +75 -0
  35. data/lib/webrat/rack.rb +24 -0
  36. data/lib/webrat/rails.rb +102 -0
  37. data/lib/webrat/rails/redirect_actions.rb +18 -0
  38. data/lib/webrat/selenium.rb +3 -0
  39. data/lib/webrat/selenium/location_strategy_javascript/button.js +12 -0
  40. data/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  41. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  42. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +9 -0
  43. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  44. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  45. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  46. data/lib/webrat/selenium/selenium_session.rb +137 -0
  47. data/lib/webrat/sinatra.rb +19 -0
  48. metadata +66 -52
  49. data/Manifest.txt +0 -20
  50. data/lib/webrat/rails_extensions.rb +0 -27
  51. data/lib/webrat/session.rb +0 -523
  52. data/test/checks_test.rb +0 -121
  53. data/test/chooses_test.rb +0 -74
  54. data/test/clicks_button_test.rb +0 -308
  55. data/test/clicks_link_test.rb +0 -193
  56. data/test/fills_in_test.rb +0 -139
  57. data/test/helper.rb +0 -21
  58. data/test/reloads_test.rb +0 -26
  59. data/test/selects_test.rb +0 -93
  60. data/test/visits_test.rb +0 -31
@@ -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 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,28 @@
1
+ require "mechanize"
2
+
3
+ module Webrat
4
+ class MechanizeSession < Session #:nodoc:
5
+
6
+ def initialize(mechanize = WWW::Mechanize.new)
7
+ super()
8
+ @mechanize = mechanize
9
+ end
10
+
11
+ def get(url, data)
12
+ @mechanize_page = @mechanize.get(url, data)
13
+ end
14
+
15
+ def post(url, data)
16
+ @mechanize_page = @mechanize.post(url, data)
17
+ end
18
+
19
+ def response_body
20
+ @mechanize_page.content
21
+ end
22
+
23
+ def response_code
24
+ @mechanize_page.code.to_i
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,75 @@
1
+ require "webrat/core"
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
+ @session ||= Webrat::MerbSession.new
60
+ @session.response = @session.request(uri, env)
61
+ end
62
+
63
+ def follow_redirect
64
+ @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
+
@@ -0,0 +1,24 @@
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
@@ -0,0 +1,102 @@
1
+ require "webrat"
2
+
3
+ module Webrat
4
+ class RailsSession < Session #:nodoc:
5
+
6
+ def initialize(integration_session)
7
+ super()
8
+ @integration_session = integration_session
9
+ end
10
+
11
+ def doc_root
12
+ File.expand_path(File.join(RAILS_ROOT, 'public'))
13
+ end
14
+
15
+ def saved_page_dir
16
+ File.expand_path(File.join(RAILS_ROOT, "tmp"))
17
+ end
18
+
19
+ def get(url, data, headers = nil)
20
+ do_request(:get, url, data, headers)
21
+ end
22
+
23
+ def post(url, data, headers = nil)
24
+ do_request(:post, url, data, headers)
25
+ end
26
+
27
+ def put(url, data, headers = nil)
28
+ do_request(:put, url, data, headers)
29
+ end
30
+
31
+ def delete(url, data, headers = nil)
32
+ do_request(:delete, url, data, headers)
33
+ end
34
+
35
+ def response_body
36
+ response.body
37
+ end
38
+
39
+ def response_code
40
+ response.code.to_i
41
+ end
42
+
43
+ protected
44
+
45
+ def do_request(http_method, url, data, headers) #:nodoc:
46
+ update_protocol(url)
47
+ @integration_session.request_via_redirect(http_method, remove_protocol(url), data, headers)
48
+ 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
55
+ end
56
+ end
57
+
58
+ def update_protocol(href) #:nodoc:
59
+ if href =~ /^https:/
60
+ @integration_session.https!(true)
61
+ elsif href =~ /^http:/
62
+ @integration_session.https!(false)
63
+ end
64
+ end
65
+
66
+ def response #:nodoc:
67
+ @integration_session.response
68
+ end
69
+
70
+ end
71
+ end
72
+
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
101
+ end
102
+ end