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.
- data/History.txt +76 -14
- data/README.txt +40 -36
- data/Rakefile +80 -18
- data/TODO.txt +9 -3
- data/init.rb +1 -1
- data/lib/webrat.rb +30 -5
- data/lib/webrat/core.rb +12 -0
- data/lib/webrat/core/area.rb +44 -0
- data/lib/webrat/core/field.rb +332 -0
- data/lib/webrat/core/flunk.rb +7 -0
- data/lib/webrat/core/form.rb +130 -0
- data/lib/webrat/core/label.rb +18 -0
- data/lib/webrat/core/link.rb +101 -0
- data/lib/webrat/core/locators.rb +92 -0
- data/lib/webrat/core/logging.rb +25 -0
- data/lib/webrat/core/matchers.rb +4 -0
- data/lib/webrat/core/matchers/have_content.rb +94 -0
- data/lib/webrat/core/matchers/have_selector.rb +39 -0
- data/lib/webrat/core/matchers/have_tag.rb +58 -0
- data/lib/webrat/core/matchers/have_xpath.rb +85 -0
- data/lib/webrat/core/methods.rb +44 -0
- data/lib/webrat/core/mime.rb +29 -0
- data/lib/webrat/core/nokogiri.rb +42 -0
- data/lib/webrat/core/scope.rb +208 -0
- data/lib/webrat/core/select_option.rb +29 -0
- data/lib/webrat/core/session.rb +188 -0
- data/lib/webrat/core_extensions/blank.rb +58 -0
- data/lib/webrat/core_extensions/deprecate.rb +8 -0
- data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
- data/lib/webrat/core_extensions/hash_with_indifferent_access.rb +131 -0
- data/lib/webrat/core_extensions/meta_class.rb +6 -0
- data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
- data/lib/webrat/mechanize.rb +28 -0
- data/lib/webrat/merb.rb +75 -0
- data/lib/webrat/rack.rb +24 -0
- data/lib/webrat/rails.rb +102 -0
- data/lib/webrat/rails/redirect_actions.rb +18 -0
- data/lib/webrat/selenium.rb +3 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +12 -0
- data/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
- data/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +9 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
- data/lib/webrat/selenium/selenium_extensions.js +6 -0
- data/lib/webrat/selenium/selenium_session.rb +137 -0
- data/lib/webrat/sinatra.rb +19 -0
- metadata +66 -52
- data/Manifest.txt +0 -20
- data/lib/webrat/rails_extensions.rb +0 -27
- data/lib/webrat/session.rb +0 -523
- data/test/checks_test.rb +0 -121
- data/test/chooses_test.rb +0 -74
- data/test/clicks_button_test.rb +0 -308
- data/test/clicks_link_test.rb +0 -193
- data/test/fills_in_test.rb +0 -139
- data/test/helper.rb +0 -21
- data/test/reloads_test.rb +0 -26
- data/test/selects_test.rb +0 -93
- 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,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,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
|
data/lib/webrat/merb.rb
ADDED
@@ -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
|
+
|
data/lib/webrat/rack.rb
ADDED
@@ -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
|
data/lib/webrat/rails.rb
ADDED
@@ -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
|