capybara-mechanize 0.3.0 → 0.4.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.mdown +0 -1
- data/lib/capybara/mechanize/browser.rb +50 -136
- data/lib/capybara/mechanize/driver.rb +3 -5
- data/lib/capybara/mechanize/form.rb +65 -0
- data/lib/capybara/mechanize/node.rb +10 -0
- data/lib/capybara/mechanize/version.rb +1 -1
- data/lib/capybara/spec/extended_test_app.rb +15 -6
- data/spec/driver/mechanize_driver_spec.rb +129 -65
- data/spec/driver/remote_mechanize_driver_spec.rb +22 -41
- data/spec/session/mechanize_spec.rb +67 -23
- data/spec/session/remote_mechanize_spec.rb +71 -35
- data/spec/spec_helper.rb +15 -34
- data/spec/support/disable_external_tests.rb +20 -0
- data/spec/support/extended_test_app_setup.rb +30 -0
- metadata +30 -11
- data/spec/relative_urls_spec.rb +0 -68
data/README.mdown
CHANGED
@@ -49,7 +49,6 @@ Then you are ready to run the test like so
|
|
49
49
|
|
50
50
|
Todo
|
51
51
|
----
|
52
|
-
* Make the last 12 failing remote session spec pass, see remote_mechanize_spec and uncomment one line there to see them fail
|
53
52
|
* Test this driver with non-rack/non-ruby projects
|
54
53
|
|
55
54
|
Note on Patches/Pull Requests
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'capybara/rack_test/driver'
|
2
2
|
require 'mechanize'
|
3
|
+
require 'capybara/mechanize/node'
|
4
|
+
require 'capybara/mechanize/form'
|
3
5
|
|
4
6
|
class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
|
5
7
|
extend Forwardable
|
@@ -28,104 +30,22 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
|
|
28
30
|
last_request_remote? ? remote_response : super
|
29
31
|
end
|
30
32
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
def follow_redirect!
|
39
|
-
unless last_response.redirect?
|
40
|
-
raise "Last response was not a redirect. Cannot follow_redirect!"
|
41
|
-
end
|
42
|
-
|
43
|
-
get(last_location_header)
|
44
|
-
end
|
45
|
-
|
46
|
-
def process(method, path, *options)
|
47
|
-
reset_cache!
|
48
|
-
send(method, path, *options)
|
49
|
-
follow_redirects!
|
50
|
-
end
|
51
|
-
|
52
|
-
def process_without_redirect(method, path, attributes, headers)
|
53
|
-
path = @last_path if path.nil? || path.empty?
|
54
|
-
|
55
|
-
if remote?(path)
|
56
|
-
process_remote_request(method, path, attributes, headers)
|
57
|
-
else
|
58
|
-
register_local_request
|
59
|
-
|
60
|
-
path = determine_path(path)
|
61
|
-
|
62
|
-
reset_cache!
|
63
|
-
send("racktest_#{method}", path, attributes, env.merge(headers))
|
64
|
-
end
|
65
|
-
|
66
|
-
@last_path = path
|
67
|
-
end
|
68
|
-
|
69
|
-
# TODO path Capybara to move this into its own method
|
70
|
-
def determine_path(path)
|
71
|
-
new_uri = URI.parse(path)
|
72
|
-
current_uri = URI.parse(current_url)
|
73
|
-
|
74
|
-
if new_uri.host
|
75
|
-
@current_host = new_uri.scheme + '://' + new_uri.host
|
76
|
-
end
|
77
|
-
|
78
|
-
if new_uri.relative?
|
79
|
-
path = request_path + path if path.start_with?('?')
|
33
|
+
# For each of these http methods, we want to intercept the method call.
|
34
|
+
# Then we determine if the call is remote or local.
|
35
|
+
# Remote: Handle it with our process_remote_request method.
|
36
|
+
# Local: Register the local request and call super to let RackTest get it.
|
37
|
+
[:get, :post, :put, :delete].each do |method|
|
38
|
+
define_method(method) do |path, params = {}, env = {}, &block|
|
39
|
+
path = @last_path if path.nil? || path.empty?
|
80
40
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
path = (folders[0, folders.size - 1] << path).join('/')
|
87
|
-
end
|
41
|
+
if remote?(path)
|
42
|
+
process_remote_request(method, path, params, env, &block)
|
43
|
+
else
|
44
|
+
register_local_request
|
45
|
+
super(path, params, env, &block)
|
88
46
|
end
|
89
|
-
path = current_host + path
|
90
|
-
end
|
91
|
-
path
|
92
|
-
end
|
93
|
-
|
94
|
-
alias :racktest_get :get
|
95
|
-
def get(path, attributes = {}, headers = {})
|
96
|
-
process_without_redirect(:get, path, attributes, headers)
|
97
|
-
end
|
98
47
|
|
99
|
-
|
100
|
-
def post(path, attributes = {}, headers = {})
|
101
|
-
process_without_redirect(:post, path, post_data(attributes), headers)
|
102
|
-
end
|
103
|
-
|
104
|
-
alias :racktest_put :put
|
105
|
-
def put(path, attributes = {}, headers = {})
|
106
|
-
process_without_redirect(:put, path, attributes, headers)
|
107
|
-
end
|
108
|
-
|
109
|
-
alias :racktest_delete :delete
|
110
|
-
def delete(path, attributes = {}, headers = {})
|
111
|
-
process_without_redirect(:delete, path, attributes, headers)
|
112
|
-
end
|
113
|
-
|
114
|
-
def post_data(params)
|
115
|
-
params.inject({}) do |memo, param|
|
116
|
-
case param
|
117
|
-
when Hash
|
118
|
-
param.each {|attribute, value| memo[attribute] = value }
|
119
|
-
memo
|
120
|
-
when Array
|
121
|
-
case param.last
|
122
|
-
when Hash
|
123
|
-
param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
|
124
|
-
else
|
125
|
-
memo[param.first] = param.last
|
126
|
-
end
|
127
|
-
memo
|
128
|
-
end
|
48
|
+
@last_path = path
|
129
49
|
end
|
130
50
|
end
|
131
51
|
|
@@ -143,14 +63,14 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
|
|
143
63
|
end
|
144
64
|
end
|
145
65
|
|
66
|
+
def find(selector)
|
67
|
+
dom.xpath(selector).map { |node| Capybara::Mechanize::Node.new(self, node) }
|
68
|
+
end
|
69
|
+
|
146
70
|
attr_reader :agent
|
147
71
|
|
148
72
|
private
|
149
73
|
|
150
|
-
def last_location_header
|
151
|
-
last_request_remote? ? remote_response.page.response['Location'] : last_response['Location']
|
152
|
-
end
|
153
|
-
|
154
74
|
def last_request_remote?
|
155
75
|
!!@last_request_remote
|
156
76
|
end
|
@@ -160,19 +80,38 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
|
|
160
80
|
@last_request_remote = false
|
161
81
|
end
|
162
82
|
|
83
|
+
def remote_request_path
|
84
|
+
@last_remote_uri.nil? ? nil : @last_remote_uri.path
|
85
|
+
end
|
86
|
+
|
87
|
+
def request_path
|
88
|
+
last_request_remote? ? remote_request_path : super
|
89
|
+
end
|
90
|
+
|
163
91
|
def process_remote_request(method, url, attributes, headers)
|
164
92
|
if remote?(url)
|
165
93
|
uri = URI.parse(url)
|
166
|
-
uri = resolve_relative_url(url) if uri.host.nil?
|
167
94
|
@last_remote_uri = uri
|
168
95
|
url = uri.to_s
|
169
96
|
|
170
97
|
reset_cache!
|
171
98
|
begin
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
99
|
+
if method == :post
|
100
|
+
if attributes.is_a? Mechanize::Form
|
101
|
+
submit_mechanize_form(url, attributes, headers)
|
102
|
+
else
|
103
|
+
@agent.send(method, url, attributes, headers)
|
104
|
+
end
|
105
|
+
elsif method == :get
|
106
|
+
if attributes.is_a? Mechanize::Form
|
107
|
+
submit_mechanize_form(url, attributes, headers)
|
108
|
+
else
|
109
|
+
referer = headers['HTTP_REFERER']
|
110
|
+
@agent.send(method, url, attributes, referer, headers)
|
111
|
+
end
|
112
|
+
else
|
113
|
+
@agent.send(method, url, attributes, headers)
|
114
|
+
end
|
176
115
|
rescue => e
|
177
116
|
raise "Received the following error for a #{method.to_s.upcase} request to #{url}: '#{e.message}'"
|
178
117
|
end
|
@@ -180,40 +119,11 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
|
|
180
119
|
end
|
181
120
|
end
|
182
121
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
# eg: app_host = localhost/mysite/ url = /home result = http://localhost/mysite/home
|
187
|
-
# eg: app_host = localhost/mysite/ url = /user/login result = http://localhost/mysite/user/login
|
188
|
-
# eg: app_host = localhost/mysite/ url = /mysite/login result = http://localhost/mysite/login
|
189
|
-
# **** notice that 'mysite' is not repeated! *****
|
190
|
-
def resolve_relative_url(url)
|
191
|
-
if @last_remote_uri
|
192
|
-
base_uri = @last_remote_uri
|
193
|
-
path_prefix = ''
|
194
|
-
else
|
195
|
-
host = Capybara.app_host || Capybara.default_host
|
196
|
-
# do this in text so we don't get the host interpretted as the scheme.
|
197
|
-
host = "http://#{host}" unless host =~ %r{^https?://.*}
|
198
|
-
base_uri = URI.parse(host)
|
199
|
-
base_uri.path = '/' if base_uri.path.nil? || base_uri.path.empty?
|
200
|
-
if base_uri.path.length > 1
|
201
|
-
path_prefix = base_uri.path
|
202
|
-
path_prefix += '/' unless path_prefix.end_with?('/') || url.start_with?('/')
|
203
|
-
|
204
|
-
# if the prefix is already in the path, don't let it be there twice.
|
205
|
-
if url.start_with?(path_prefix)
|
206
|
-
path_prefix = ''
|
207
|
-
end
|
208
|
-
else
|
209
|
-
path_prefix = ''
|
210
|
-
end
|
211
|
-
end
|
212
|
-
uri = URI.parse(path_prefix + url)
|
213
|
-
result_uri = base_uri.merge uri
|
122
|
+
def submit_mechanize_form(url, form, headers)
|
123
|
+
form.action = url
|
124
|
+
@agent.submit(form, nil, headers)
|
214
125
|
end
|
215
126
|
|
216
|
-
|
217
127
|
def remote_response
|
218
128
|
ResponseProxy.new(@agent.current_page) if @agent.current_page
|
219
129
|
end
|
@@ -244,6 +154,10 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
|
|
244
154
|
headers
|
245
155
|
end
|
246
156
|
|
157
|
+
def [](key)
|
158
|
+
headers[key]
|
159
|
+
end
|
160
|
+
|
247
161
|
def status
|
248
162
|
page.code.to_i
|
249
163
|
end
|
@@ -2,12 +2,10 @@ require 'capybara/mechanize/browser'
|
|
2
2
|
|
3
3
|
class Capybara::Mechanize::Driver < Capybara::RackTest::Driver
|
4
4
|
|
5
|
-
def initialize(app
|
6
|
-
|
7
|
-
raise ArgumentError, "You have to set at least Capybara.app_host or Capybara.app"
|
8
|
-
end
|
5
|
+
def initialize(app, options = {})
|
6
|
+
raise ArgumentError, "mechanize requires a rack application, but none was given" unless app
|
9
7
|
|
10
|
-
|
8
|
+
super
|
11
9
|
end
|
12
10
|
|
13
11
|
def remote?(url)
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class Capybara::Mechanize::Form < Capybara::RackTest::Form
|
2
|
+
|
3
|
+
def params(button)
|
4
|
+
if !use_mechanize?
|
5
|
+
return super
|
6
|
+
end
|
7
|
+
|
8
|
+
node = {}
|
9
|
+
# Create a fake form
|
10
|
+
class << node
|
11
|
+
def search(*args); []; end
|
12
|
+
end
|
13
|
+
node['method'] = method.to_s.upcase
|
14
|
+
|
15
|
+
if self.multipart?
|
16
|
+
node['enctype'] = 'multipart/form-data'
|
17
|
+
else
|
18
|
+
node['enctype'] = 'application/x-www-form-urlencoded'
|
19
|
+
end
|
20
|
+
|
21
|
+
@m_form = Mechanize::Form.new(node, nil, form_referer)
|
22
|
+
|
23
|
+
super
|
24
|
+
|
25
|
+
@m_form
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def merge_param!(params, key, value)
|
31
|
+
if !use_mechanize?
|
32
|
+
return super
|
33
|
+
end
|
34
|
+
|
35
|
+
if value.is_a? NilUploadedFile
|
36
|
+
# Adding a nil value here will result in the form element existing with the empty string as its value.
|
37
|
+
# Instead don't add the form element at all.
|
38
|
+
return params
|
39
|
+
end
|
40
|
+
|
41
|
+
if value.is_a? Rack::Test::UploadedFile
|
42
|
+
@m_form.enctype = 'multipart/form-data'
|
43
|
+
|
44
|
+
ul = Mechanize::Form::FileUpload.new({'name' => key.to_s}, value.original_filename)
|
45
|
+
ul.mime_type = value.content_type
|
46
|
+
ul.file_data = (value.rewind; value.read)
|
47
|
+
|
48
|
+
@m_form.file_uploads << ul
|
49
|
+
|
50
|
+
return params
|
51
|
+
end
|
52
|
+
|
53
|
+
@m_form.fields << Mechanize::Form::Field.new({'name' => key.to_s}, value)
|
54
|
+
|
55
|
+
params
|
56
|
+
end
|
57
|
+
|
58
|
+
def use_mechanize?
|
59
|
+
driver.remote?(native['action'].to_s)
|
60
|
+
end
|
61
|
+
|
62
|
+
def form_referer
|
63
|
+
Mechanize::Page.new URI(driver.current_url)
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Capybara::Mechanize::Node < Capybara::RackTest::Node
|
2
|
+
def click
|
3
|
+
if tag_name == 'a'
|
4
|
+
super
|
5
|
+
elsif (tag_name == 'input' and %w(submit image).include?(type)) or
|
6
|
+
((tag_name == 'button') and type.nil? or type == "submit")
|
7
|
+
Capybara::Mechanize::Form.new(driver, form).submit(self)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -2,9 +2,10 @@ require 'capybara/spec/test_app'
|
|
2
2
|
|
3
3
|
class ExtendedTestApp < TestApp#< Sinatra::Base
|
4
4
|
set :environment, :production # so we don't get debug info that makes our test pass!
|
5
|
+
disable :protection
|
5
6
|
|
6
7
|
get %r{/redirect_to/(.*)} do
|
7
|
-
redirect params[:captures]
|
8
|
+
redirect params[:captures].first
|
8
9
|
end
|
9
10
|
|
10
11
|
get '/form_with_relative_action_to_host' do
|
@@ -35,10 +36,6 @@ class ExtendedTestApp < TestApp#< Sinatra::Base
|
|
35
36
|
current_request_info
|
36
37
|
end
|
37
38
|
|
38
|
-
get '/host' do
|
39
|
-
"Current host is #{request.scheme}://#{request.host}:#{request.port}"
|
40
|
-
end
|
41
|
-
|
42
39
|
get '/subsite/relative_link_to_host' do
|
43
40
|
%{<a href="/subsite/request_info2/host">host</a>}
|
44
41
|
end
|
@@ -54,11 +51,23 @@ class ExtendedTestApp < TestApp#< Sinatra::Base
|
|
54
51
|
get '/redirect_with_http_param' do
|
55
52
|
redirect '/redirect_target?foo=http'
|
56
53
|
end
|
57
|
-
|
54
|
+
|
58
55
|
get '/redirect_target' do
|
59
56
|
%{correct redirect}
|
60
57
|
end
|
61
58
|
|
59
|
+
get %r{/form_posts_to/(.*)} do
|
60
|
+
%{
|
61
|
+
<form action="#{params[:captures].first}" method="post">
|
62
|
+
<input type="submit" value="submit" />
|
63
|
+
</form>
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
post '/get_referer' do
|
68
|
+
request.referer.nil? ? "No referer" : "Got referer: #{request.referer}"
|
69
|
+
end
|
70
|
+
|
62
71
|
private
|
63
72
|
|
64
73
|
def current_request_info
|
@@ -1,151 +1,215 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
4
|
-
|
5
|
-
|
3
|
+
describe Capybara::Mechanize::Driver, 'local' do
|
4
|
+
let(:driver) { Capybara::Mechanize::Driver.new(ExtendedTestApp) }
|
5
|
+
|
6
|
+
describe ':headers option' do
|
7
|
+
it 'should always set headers' do
|
8
|
+
driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
|
9
|
+
driver.visit('/get_header')
|
10
|
+
driver.html.should include('foobar')
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should keep headers on link clicks' do
|
14
|
+
driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
|
15
|
+
driver.visit('/header_links')
|
16
|
+
driver.find('.//a').first.click
|
17
|
+
driver.html.should include('foobar')
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should keep headers on form submit' do
|
21
|
+
driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
|
22
|
+
driver.visit('/header_links')
|
23
|
+
driver.find('.//input').first.click
|
24
|
+
driver.html.should include('foobar')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should keep headers on redirects' do
|
28
|
+
driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
|
29
|
+
driver.visit('/get_header_via_redirect')
|
30
|
+
driver.html.should include('foobar')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe ':follow_redirects option' do
|
35
|
+
it "defaults to following redirects" do
|
36
|
+
driver = Capybara::RackTest::Driver.new(TestApp)
|
37
|
+
|
38
|
+
driver.visit('/redirect')
|
39
|
+
driver.response.header['Location'].should be_nil
|
40
|
+
driver.browser.current_url.should match %r{/landed$}
|
41
|
+
end
|
42
|
+
|
43
|
+
it "is possible to not follow redirects" do
|
44
|
+
driver = Capybara::RackTest::Driver.new(TestApp, :follow_redirects => false)
|
45
|
+
|
46
|
+
driver.visit('/redirect')
|
47
|
+
driver.response.header['Location'].should match %r{/redirect_again$}
|
48
|
+
driver.browser.current_url.should match %r{/redirect$}
|
49
|
+
end
|
6
50
|
end
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
Capybara::
|
11
|
-
|
51
|
+
|
52
|
+
describe ':redirect_limit option' do
|
53
|
+
context "with default redirect limit" do
|
54
|
+
let(:driver) { Capybara::RackTest::Driver.new(TestApp) }
|
55
|
+
|
56
|
+
it "should follow 5 redirects" do
|
57
|
+
driver.visit("/redirect/5/times")
|
58
|
+
driver.html.should include('redirection complete')
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should not follow more than 6 redirects" do
|
62
|
+
expect do
|
63
|
+
driver.visit("/redirect/6/times")
|
64
|
+
end.to raise_error(Capybara::InfiniteRedirectError)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "with 21 redirect limit" do
|
69
|
+
let(:driver) { Capybara::RackTest::Driver.new(TestApp, :redirect_limit => 21) }
|
70
|
+
|
71
|
+
it "should follow 21 redirects" do
|
72
|
+
driver.visit("/redirect/21/times")
|
73
|
+
driver.html.should include('redirection complete')
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should not follow more than 21 redirects" do
|
77
|
+
expect do
|
78
|
+
driver.visit("/redirect/22/times")
|
79
|
+
end.to raise_error(Capybara::InfiniteRedirectError)
|
80
|
+
end
|
81
|
+
end
|
12
82
|
end
|
13
|
-
|
14
|
-
it_should_behave_like "driver"
|
15
|
-
it_should_behave_like "driver with header support"
|
16
|
-
it_should_behave_like "driver with status code support"
|
17
|
-
it_should_behave_like "driver with cookies support"
|
18
|
-
it_should_behave_like "driver with infinite redirect detection"
|
19
83
|
|
20
84
|
it "should default to local mode for relative paths" do
|
21
|
-
|
85
|
+
driver.should_not be_remote('/')
|
22
86
|
end
|
23
|
-
|
87
|
+
|
24
88
|
it "should default to local mode for the default host" do
|
25
|
-
|
89
|
+
driver.should_not be_remote('http://www.example.com')
|
26
90
|
end
|
27
91
|
|
28
92
|
context "with an app_host" do
|
29
|
-
|
93
|
+
|
30
94
|
before do
|
31
95
|
Capybara.app_host = 'http://www.remote.com'
|
32
96
|
end
|
33
|
-
|
97
|
+
|
34
98
|
after do
|
35
99
|
Capybara.app_host = nil
|
36
100
|
end
|
37
101
|
|
38
102
|
it "should treat urls as remote" do
|
39
|
-
|
103
|
+
driver.should be_remote('http://www.remote.com')
|
40
104
|
end
|
41
105
|
end
|
42
106
|
|
43
107
|
context "with a default url, no app host" do
|
44
|
-
before
|
108
|
+
before do
|
45
109
|
Capybara.default_host = 'www.local.com'
|
46
110
|
end
|
47
|
-
|
111
|
+
|
48
112
|
it "should allow local hosts to be set" do
|
49
113
|
Capybara::Mechanize.local_hosts = ['subdomain.local.com']
|
50
|
-
|
114
|
+
driver.should_not be_remote('http://subdomain.local.com')
|
51
115
|
end
|
52
|
-
|
116
|
+
|
53
117
|
it "should treat urls with the same host names as local" do
|
54
|
-
|
118
|
+
driver.should_not be_remote('http://www.local.com')
|
55
119
|
end
|
56
|
-
|
120
|
+
|
57
121
|
it "should treat other urls as remote" do
|
58
|
-
|
122
|
+
driver.should be_remote('http://www.remote.com')
|
59
123
|
end
|
60
|
-
|
124
|
+
|
61
125
|
it "should treat relative paths as remote if the previous request was remote" do
|
62
|
-
|
63
|
-
|
126
|
+
driver.visit(REMOTE_TEST_URL)
|
127
|
+
driver.should be_remote('/some_relative_link')
|
64
128
|
end
|
65
129
|
|
66
130
|
it "should treat relative paths as local if the previous request was local" do
|
67
|
-
|
68
|
-
|
131
|
+
driver.visit('http://www.local.com')
|
132
|
+
driver.should_not be_remote('/some_relative_link')
|
69
133
|
end
|
70
134
|
|
71
135
|
it "should receive the right host" do
|
72
|
-
|
136
|
+
driver.visit('http://www.local.com/host')
|
73
137
|
should_be_a_local_get
|
74
138
|
end
|
75
139
|
|
76
140
|
it "should consider relative paths to be local when the previous request was local" do
|
77
|
-
|
78
|
-
|
141
|
+
driver.visit('http://www.local.com/host')
|
142
|
+
driver.visit('/host')
|
79
143
|
|
80
144
|
should_be_a_local_get
|
81
|
-
|
145
|
+
driver.should_not be_remote('/first_local')
|
82
146
|
end
|
83
|
-
|
147
|
+
|
84
148
|
it "should consider relative paths to be remote when the previous request was remote" do
|
85
|
-
|
86
|
-
|
149
|
+
driver.visit("#{REMOTE_TEST_URL}/host")
|
150
|
+
driver.get('/host')
|
87
151
|
|
88
152
|
should_be_a_remote_get
|
89
|
-
|
153
|
+
driver.should be_remote('/second_remote')
|
90
154
|
end
|
91
|
-
|
155
|
+
|
92
156
|
it "should always switch to the right context" do
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
157
|
+
driver.visit('http://www.local.com/host')
|
158
|
+
driver.get('/host')
|
159
|
+
driver.get("#{REMOTE_TEST_URL}/host")
|
160
|
+
driver.get('/host')
|
161
|
+
driver.get('http://www.local.com/host')
|
98
162
|
|
99
163
|
should_be_a_local_get
|
100
|
-
|
164
|
+
driver.should_not be_remote('/second_local')
|
101
165
|
end
|
102
166
|
|
103
167
|
it "should follow redirects from local to remote" do
|
104
|
-
|
168
|
+
driver.visit("http://www.local.com/redirect_to/#{REMOTE_TEST_URL}/host")
|
105
169
|
should_be_a_remote_get
|
106
170
|
end
|
107
|
-
|
171
|
+
|
108
172
|
it "should follow redirects from remote to local" do
|
109
|
-
|
173
|
+
driver.visit("#{REMOTE_TEST_URL}/redirect_to/http://www.local.com/host")
|
110
174
|
should_be_a_local_get
|
111
175
|
end
|
112
|
-
|
113
|
-
after
|
176
|
+
|
177
|
+
after do
|
114
178
|
Capybara.default_host = nil
|
115
179
|
end
|
116
|
-
|
180
|
+
|
117
181
|
it "should raise a useful error for sites that return a 404, because it is probably a misconfiguration" do
|
118
|
-
|
119
|
-
|
120
|
-
}.
|
182
|
+
expect {
|
183
|
+
driver.visit("http://iamreallysurethatthisdoesntexist.com/canttouchthis")
|
184
|
+
}.to raise_error(%r{Received the following error for a GET request to http://iamreallysurethatthisdoesntexist.com/canttouchthis:})
|
121
185
|
end
|
122
186
|
end
|
123
187
|
|
124
188
|
it "should include the right host when remote" do
|
125
|
-
|
189
|
+
driver.visit("#{REMOTE_TEST_URL}/host")
|
126
190
|
should_be_a_remote_get
|
127
191
|
end
|
128
192
|
|
129
193
|
describe '#reset!' do
|
130
|
-
before
|
194
|
+
before do
|
131
195
|
Capybara.default_host = 'http://www.local.com'
|
132
196
|
end
|
133
197
|
|
134
198
|
it 'should reset remote host' do
|
135
|
-
|
199
|
+
driver.visit("#{REMOTE_TEST_URL}/host")
|
136
200
|
should_be_a_remote_get
|
137
|
-
|
138
|
-
|
201
|
+
driver.reset!
|
202
|
+
driver.visit("/host")
|
139
203
|
should_be_a_local_get
|
140
204
|
end
|
141
205
|
end
|
142
206
|
|
143
207
|
def should_be_a_remote_get
|
144
|
-
|
208
|
+
driver.current_url.should include(REMOTE_TEST_URL)
|
145
209
|
end
|
146
|
-
|
210
|
+
|
147
211
|
def should_be_a_local_get
|
148
|
-
|
212
|
+
driver.current_url.should include("www.local.com")
|
149
213
|
end
|
150
|
-
|
214
|
+
#
|
151
215
|
end
|
@@ -1,65 +1,46 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Capybara::Mechanize::Driver do
|
4
|
-
before
|
3
|
+
describe Capybara::Mechanize::Driver, 'remote' do
|
4
|
+
before do
|
5
5
|
Capybara.app_host = REMOTE_TEST_URL
|
6
6
|
end
|
7
|
-
|
8
|
-
after
|
7
|
+
|
8
|
+
after do
|
9
9
|
Capybara.app_host = nil
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
|
12
|
+
let(:driver) { Capybara::Mechanize::Driver.new(ExtendedTestApp) }
|
13
|
+
|
16
14
|
context "in remote mode" do
|
17
|
-
it "should not throw an error when no rack app is given" do
|
18
|
-
running do
|
19
|
-
Capybara::Mechanize::Driver.new
|
20
|
-
end.should_not raise_error(ArgumentError)
|
21
|
-
end
|
22
|
-
|
23
15
|
it "should pass arguments through to a get request" do
|
24
|
-
|
25
|
-
|
16
|
+
driver.visit("#{REMOTE_TEST_URL}/form/get", {:form => "success"})
|
17
|
+
driver.html.should include('success')
|
26
18
|
end
|
27
19
|
|
28
20
|
it "should pass arguments through to a post request" do
|
29
|
-
|
30
|
-
|
21
|
+
driver.post("#{REMOTE_TEST_URL}/form", {:form => "success"})
|
22
|
+
driver.html.should include('success')
|
31
23
|
end
|
32
24
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
@driver.body.should include('key: value')
|
25
|
+
describe "redirect" do
|
26
|
+
it "should handle redirects with http-params" do
|
27
|
+
driver.visit "#{REMOTE_TEST_URL}/redirect_with_http_param"
|
28
|
+
driver.html.should include('correct redirect')
|
38
29
|
end
|
39
|
-
|
40
30
|
end
|
41
31
|
|
42
|
-
context "
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
@driver.body.should include('key: value')
|
32
|
+
context "for a post request" do
|
33
|
+
it 'transforms nested map in post data' do
|
34
|
+
driver.post("#{REMOTE_TEST_URL}/form", {:form => {:key => 'value'}})
|
35
|
+
driver.html.should include(':key=>"value"')
|
47
36
|
end
|
48
|
-
|
49
37
|
end
|
50
38
|
|
51
|
-
|
52
|
-
it
|
53
|
-
|
54
|
-
|
39
|
+
context 'process remote request' do
|
40
|
+
it 'transforms nested map in post data' do
|
41
|
+
driver.submit(:post, "#{REMOTE_TEST_URL}/form", {:form => {:key => 'value'}})
|
42
|
+
driver.html.should include(':key=>"value"')
|
55
43
|
end
|
56
44
|
end
|
57
|
-
|
58
|
-
it_should_behave_like "driver"
|
59
|
-
it_should_behave_like "driver with header support"
|
60
|
-
it_should_behave_like "driver with status code support"
|
61
|
-
it_should_behave_like "driver with cookies support"
|
62
|
-
it_should_behave_like "driver with infinite redirect detection"
|
63
45
|
end
|
64
|
-
|
65
46
|
end
|
@@ -1,59 +1,103 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
module TestSessions
|
4
|
+
Mechanize = Capybara::Session.new(:mechanize, TestApp)
|
5
|
+
end
|
6
|
+
|
7
|
+
Capybara::SpecHelper.run_specs TestSessions::Mechanize, "Mechanize", :skip => [
|
8
|
+
:js,
|
9
|
+
:screenshot,
|
10
|
+
:frames,
|
11
|
+
:windows,
|
12
|
+
:server
|
13
|
+
]
|
14
|
+
|
3
15
|
describe Capybara::Session do
|
4
16
|
context 'with mechanize driver' do
|
17
|
+
let(:session) { Capybara::Session.new(:mechanize, ExtendedTestApp) }
|
18
|
+
|
5
19
|
before do
|
6
|
-
@session = Capybara::Session.new(:mechanize, TestApp)
|
7
|
-
@session.driver.options[:respect_data_method] = true
|
8
20
|
Capybara.default_host = 'http://www.local.com'
|
9
21
|
end
|
10
22
|
|
11
23
|
describe '#driver' do
|
12
24
|
it "should be a mechanize driver" do
|
13
|
-
|
25
|
+
session.driver.should be_an_instance_of(Capybara::Mechanize::Driver)
|
14
26
|
end
|
15
27
|
end
|
16
28
|
|
17
29
|
describe '#mode' do
|
18
30
|
it "should remember the mode" do
|
19
|
-
|
31
|
+
session.mode.should == :mechanize
|
20
32
|
end
|
21
33
|
end
|
22
34
|
|
23
35
|
describe '#click_link' do
|
24
|
-
it "should use data-method if
|
25
|
-
|
26
|
-
|
27
|
-
|
36
|
+
it "should use data-method if option is true" do
|
37
|
+
session.driver.options[:respect_data_method] = true
|
38
|
+
session.visit "/with_html"
|
39
|
+
session.click_link "A link with data-method"
|
40
|
+
session.html.should include('The requested object was deleted')
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not use data-method if option is false" do
|
44
|
+
session.driver.options[:respect_data_method] = false
|
45
|
+
session.visit "/with_html"
|
46
|
+
session.click_link "A link with data-method"
|
47
|
+
session.html.should include('Not deleted')
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should use data-method if available even if it's capitalized" do
|
51
|
+
session.driver.options[:respect_data_method] = true
|
52
|
+
session.visit "/with_html"
|
53
|
+
session.click_link "A link with capitalized data-method"
|
54
|
+
session.html.should include('The requested object was deleted')
|
55
|
+
end
|
56
|
+
|
57
|
+
after do
|
58
|
+
session.driver.options[:respect_data_method] = false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#attach_file" do
|
63
|
+
context "with multipart form" do
|
64
|
+
it "should submit an empty form-data section if no file is submitted" do
|
65
|
+
session.visit("/form")
|
66
|
+
session.click_button("Upload Empty")
|
67
|
+
session.html.should include('Successfully ignored empty file field.')
|
68
|
+
end
|
28
69
|
end
|
29
70
|
end
|
30
71
|
|
31
72
|
it "should use the last remote url when following relative links" do
|
32
|
-
|
33
|
-
|
34
|
-
|
73
|
+
session.visit("#{REMOTE_TEST_URL}/relative_link_to_host")
|
74
|
+
session.click_link "host"
|
75
|
+
session.body.should include("Current host is #{REMOTE_TEST_URL}/request_info/host, method get")
|
35
76
|
end
|
36
77
|
|
37
78
|
it "should use the last remote url when submitting a form with a relative action" do
|
38
|
-
|
39
|
-
|
40
|
-
|
79
|
+
session.visit("#{REMOTE_TEST_URL}/form_with_relative_action_to_host")
|
80
|
+
session.click_button "submit"
|
81
|
+
session.body.should include("Current host is #{REMOTE_TEST_URL}/request_info/host, method post")
|
41
82
|
end
|
42
83
|
|
43
84
|
it "should use the last url when submitting a form with no action" do
|
44
|
-
|
45
|
-
|
46
|
-
|
85
|
+
session.visit("#{REMOTE_TEST_URL}/request_info/form_with_no_action")
|
86
|
+
session.click_button "submit"
|
87
|
+
session.body.should include("Current host is #{REMOTE_TEST_URL}/request_info/form_with_no_action, method post")
|
47
88
|
end
|
48
89
|
|
49
90
|
it "should send correct user agent" do
|
50
|
-
|
51
|
-
|
91
|
+
session.visit("#{REMOTE_TEST_URL}/request_info/user_agent")
|
92
|
+
session.body.should include("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.853.0 Safari/535.2")
|
52
93
|
end
|
53
94
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
95
|
+
context 'form referer when switching from local to remote' do
|
96
|
+
it 'sends the referer' do
|
97
|
+
session.visit "/form_posts_to/#{REMOTE_TEST_URL}/get_referer"
|
98
|
+
session.click_button 'submit'
|
99
|
+
session.body.should include 'Got referer'
|
100
|
+
end
|
101
|
+
end
|
58
102
|
end
|
59
103
|
end
|
@@ -1,66 +1,102 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
module TestSessions
|
4
|
+
Mechanize = Capybara::Session.new(:mechanize, TestApp)
|
5
|
+
end
|
6
|
+
|
7
|
+
shared_context "remote tests" do
|
8
|
+
before do
|
9
|
+
Capybara.app_host = REMOTE_TEST_URL
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
Capybara.app_host = nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
session_describe = Capybara::SpecHelper.run_specs TestSessions::Mechanize, "Mechanize", :skip => [
|
18
|
+
:js,
|
19
|
+
:screenshot,
|
20
|
+
:frames,
|
21
|
+
:windows,
|
22
|
+
:server
|
23
|
+
]
|
24
|
+
|
25
|
+
session_describe.include_context("remote tests")
|
26
|
+
|
27
|
+
disabler = DisableExternalTests.new
|
28
|
+
disabler.tests_to_disable = [
|
29
|
+
['#visit', 'when Capybara.always_include_port is true', 'should fetch a response from the driver with an absolute url without a port'],
|
30
|
+
['#reset_session!', 'raises any errors caught inside the server']
|
31
|
+
]
|
32
|
+
disabler.disable(session_describe)
|
33
|
+
|
3
34
|
describe Capybara::Session do
|
4
35
|
context 'with remote mechanize driver' do
|
5
|
-
|
6
|
-
Capybara.app_host = REMOTE_TEST_URL
|
7
|
-
end
|
36
|
+
include_context 'remote tests'
|
8
37
|
|
9
|
-
|
10
|
-
Capybara.app_host = nil
|
11
|
-
end
|
12
|
-
|
13
|
-
|
14
|
-
before do
|
15
|
-
@session = Capybara::Session.new(:mechanize)
|
16
|
-
@session.driver.options[:respect_data_method] = true
|
17
|
-
end
|
38
|
+
let(:session) { Capybara::Session.new(:mechanize, ExtendedTestApp) }
|
18
39
|
|
19
40
|
describe '#driver' do
|
20
41
|
it "should be a mechanize driver" do
|
21
|
-
|
42
|
+
session.driver.should be_an_instance_of(Capybara::Mechanize::Driver)
|
22
43
|
end
|
23
44
|
end
|
24
45
|
|
25
46
|
describe '#mode' do
|
26
47
|
it "should remember the mode" do
|
27
|
-
|
48
|
+
session.mode.should == :mechanize
|
28
49
|
end
|
29
50
|
end
|
30
51
|
|
31
52
|
describe '#click_link' do
|
32
|
-
it "should use data-method if
|
33
|
-
|
34
|
-
|
35
|
-
|
53
|
+
it "should use data-method if option is true" do
|
54
|
+
session.driver.options[:respect_data_method] = true
|
55
|
+
session.visit "/with_html"
|
56
|
+
session.click_link "A link with data-method"
|
57
|
+
session.html.should include('The requested object was deleted')
|
36
58
|
end
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
59
|
|
41
|
-
|
42
|
-
|
60
|
+
it "should not use data-method if option is false" do
|
61
|
+
session.driver.options[:respect_data_method] = false
|
62
|
+
session.visit "/with_html"
|
63
|
+
session.click_link "A link with data-method"
|
64
|
+
session.html.should include('Not deleted')
|
65
|
+
end
|
43
66
|
|
44
|
-
|
45
|
-
|
46
|
-
|
67
|
+
it "should use data-method if available even if it's capitalized" do
|
68
|
+
session.driver.options[:respect_data_method] = true
|
69
|
+
session.visit "/with_html"
|
70
|
+
session.click_link "A link with capitalized data-method"
|
71
|
+
session.html.should include('The requested object was deleted')
|
72
|
+
end
|
47
73
|
|
74
|
+
after do
|
75
|
+
session.driver.options[:respect_data_method] = false
|
76
|
+
end
|
77
|
+
end
|
48
78
|
|
49
|
-
|
50
|
-
|
51
|
-
|
79
|
+
describe "#attach_file" do
|
80
|
+
context "with multipart form" do
|
81
|
+
it "should submit an empty form-data section if no file is submitted" do
|
82
|
+
session.visit("/form")
|
83
|
+
session.click_button("Upload Empty")
|
84
|
+
session.html.should include('Successfully ignored empty file field.')
|
85
|
+
end
|
52
86
|
end
|
87
|
+
end
|
53
88
|
|
89
|
+
context "remote app in a sub-path" do
|
54
90
|
it "follows relative link correctly" do
|
55
|
-
|
56
|
-
|
57
|
-
|
91
|
+
session.visit "/subsite/relative_link_to_host"
|
92
|
+
session.click_link "host"
|
93
|
+
session.body.should include('request_info2/host')
|
58
94
|
end
|
59
95
|
|
60
96
|
it "follows local link correctly" do
|
61
|
-
|
62
|
-
|
63
|
-
|
97
|
+
session.visit "/subsite/local_link_to_host"
|
98
|
+
session.click_link "host"
|
99
|
+
session.body.should include('request_info2/host')
|
64
100
|
end
|
65
101
|
end
|
66
102
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,47 +1,28 @@
|
|
1
|
-
require '
|
2
|
-
require 'capybara'
|
3
|
-
require 'capybara/dsl'
|
1
|
+
require 'capybara/spec/spec_helper'
|
4
2
|
require 'capybara/mechanize'
|
5
3
|
require 'capybara/spec/extended_test_app'
|
6
4
|
|
7
|
-
|
5
|
+
PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')).freeze
|
8
6
|
|
9
|
-
|
10
|
-
require 'capybara/spec/driver'
|
11
|
-
require 'capybara/spec/session'
|
7
|
+
$LOAD_PATH << File.join(PROJECT_ROOT, 'lib')
|
12
8
|
|
13
|
-
|
9
|
+
Dir[File.join(PROJECT_ROOT, 'spec', 'support', '**', '*.rb')].each { |file| require(file) }
|
14
10
|
|
15
|
-
|
16
|
-
|
11
|
+
RSpec.configure do |config|
|
12
|
+
# Spruce up the focus!
|
13
|
+
config.filter_run :focus => true
|
14
|
+
config.run_all_when_everything_filtered = true
|
15
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
17
16
|
|
18
|
-
|
19
|
-
|
17
|
+
# Used with DisableExternalTests
|
18
|
+
config.filter_run_excluding :external_test_disabled
|
20
19
|
|
21
|
-
RSpec.configure do |config|
|
22
20
|
config.after do
|
23
|
-
Capybara.default_selector = :xpath
|
24
21
|
Capybara::Mechanize.local_hosts = nil
|
25
22
|
end
|
26
|
-
# config.filter_run :focus => true
|
27
|
-
end
|
28
|
-
|
29
|
-
REMOTE_TEST_URL = "http://localhost:#{rack_server.port}"
|
30
23
|
|
31
|
-
|
32
|
-
|
33
|
-
# for testing private methods, courtesy of
|
34
|
-
# http://kailuowang.blogspot.com.au/2010/08/testing-private-methods-in-rspec.html
|
35
|
-
def describe_internally *args, &block
|
36
|
-
example = describe *args, &block
|
37
|
-
klass = args[0]
|
38
|
-
if klass.is_a? Class
|
39
|
-
saved_private_instance_methods = klass.private_instance_methods
|
40
|
-
example.before do
|
41
|
-
klass.class_eval { public *saved_private_instance_methods }
|
42
|
-
end
|
43
|
-
example.after do
|
44
|
-
klass.class_eval { private *saved_private_instance_methods }
|
45
|
-
end
|
46
|
-
end
|
24
|
+
Capybara::SpecHelper.configure(config)
|
47
25
|
end
|
26
|
+
|
27
|
+
setup = ExtendedTestAppSetup.new.boot
|
28
|
+
REMOTE_TEST_URL = setup.remote_test_url
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class DisableExternalTests
|
2
|
+
attr_accessor :tests_to_disable
|
3
|
+
|
4
|
+
def disable(top_level_example_group)
|
5
|
+
tests_to_disable.each do |to_disable|
|
6
|
+
example_group = top_level_example_group
|
7
|
+
|
8
|
+
example_description = to_disable.pop
|
9
|
+
|
10
|
+
to_disable.each do |description|
|
11
|
+
example_group = example_group.children.find{ |g| g.description == description }
|
12
|
+
end
|
13
|
+
|
14
|
+
example = example_group.examples.find{ |e| e.description == example_description }
|
15
|
+
|
16
|
+
example.metadata[:external_test_disabled] = true
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# This class works around some weirdness with Capybara's test suite and sinatra's behavior.
|
2
|
+
# We need to make sure that sinatra uses TestApp for at least one request before the Capybara session
|
3
|
+
# specs run. Without this we get errors from sinatra trying to handle requests with TestApp.clone
|
4
|
+
class ExtendedTestAppSetup
|
5
|
+
include Capybara::DSL
|
6
|
+
|
7
|
+
attr_reader :remote_test_url
|
8
|
+
|
9
|
+
def boot
|
10
|
+
boot_test_app
|
11
|
+
boot_remote_app
|
12
|
+
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
def boot_test_app
|
17
|
+
Capybara.app = TestApp
|
18
|
+
dummy_server = Capybara::Server.new(TestApp)
|
19
|
+
dummy_server.boot
|
20
|
+
|
21
|
+
# Boot TestApp's Sinatra
|
22
|
+
visit '/'
|
23
|
+
end
|
24
|
+
|
25
|
+
def boot_remote_app
|
26
|
+
remote_server = Capybara::Server.new(ExtendedTestApp)
|
27
|
+
remote_server.boot
|
28
|
+
@remote_test_url = "http://localhost:#{remote_server.port}"
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,38 +1,54 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-mechanize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.4.0.rc1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jeroen van Dijk
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mechanize
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '2.
|
21
|
+
version: '2.5'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.5'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: capybara
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
37
|
+
version: '2.0'
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.0.1
|
33
41
|
type: :runtime
|
34
42
|
prerelease: false
|
35
|
-
version_requirements:
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '2.0'
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: 2.0.1
|
36
52
|
description: RackTest driver for Capybara, but with remote request support thanks
|
37
53
|
to mechanize
|
38
54
|
email: jeroen@jeevidee.nl
|
@@ -43,15 +59,18 @@ files:
|
|
43
59
|
- lib/capybara/mechanize/browser.rb
|
44
60
|
- lib/capybara/mechanize/cucumber.rb
|
45
61
|
- lib/capybara/mechanize/driver.rb
|
62
|
+
- lib/capybara/mechanize/form.rb
|
63
|
+
- lib/capybara/mechanize/node.rb
|
46
64
|
- lib/capybara/mechanize/version.rb
|
47
65
|
- lib/capybara/mechanize.rb
|
48
66
|
- lib/capybara/spec/extended_test_app.rb
|
49
67
|
- spec/driver/mechanize_driver_spec.rb
|
50
68
|
- spec/driver/remote_mechanize_driver_spec.rb
|
51
|
-
- spec/relative_urls_spec.rb
|
52
69
|
- spec/session/mechanize_spec.rb
|
53
70
|
- spec/session/remote_mechanize_spec.rb
|
54
71
|
- spec/spec_helper.rb
|
72
|
+
- spec/support/disable_external_tests.rb
|
73
|
+
- spec/support/extended_test_app_setup.rb
|
55
74
|
- README.mdown
|
56
75
|
homepage: https://github.com/jeroenvandijk/capybara-mechanize
|
57
76
|
licenses: []
|
@@ -74,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
93
|
version: '0'
|
75
94
|
requirements: []
|
76
95
|
rubyforge_project:
|
77
|
-
rubygems_version: 1.8.
|
96
|
+
rubygems_version: 1.8.24
|
78
97
|
signing_key:
|
79
98
|
specification_version: 3
|
80
99
|
summary: RackTest driver for Capybara with remote request support
|
data/spec/relative_urls_spec.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
require "rspec"
|
2
|
-
require 'capybara'
|
3
|
-
require 'capybara/mechanize/browser'
|
4
|
-
require File.expand_path('../spec_helper.rb', __FILE__)
|
5
|
-
|
6
|
-
describe_internally Capybara::Mechanize::Browser do
|
7
|
-
describe "Resolving Relative URLs" do
|
8
|
-
|
9
|
-
before(:all) do
|
10
|
-
@original_app_host = Capybara.app_host
|
11
|
-
@driver = Object.new
|
12
|
-
@browser = Capybara::Mechanize::Browser.new(@driver)
|
13
|
-
end
|
14
|
-
|
15
|
-
after(:all) do
|
16
|
-
Capybara.app_host = @original_app_host
|
17
|
-
@browser.reset_host!
|
18
|
-
end
|
19
|
-
|
20
|
-
context "resolving on 'http://localhost'" do
|
21
|
-
before(:all) do
|
22
|
-
Capybara.app_host ='http://localhost'
|
23
|
-
end
|
24
|
-
|
25
|
-
it "resolves '/'" do
|
26
|
-
@browser.resolve_relative_url('/').to_s.should == 'http://localhost/'
|
27
|
-
end
|
28
|
-
|
29
|
-
it "resolves '/home'" do
|
30
|
-
@browser.resolve_relative_url('/home').to_s.should == 'http://localhost/home'
|
31
|
-
end
|
32
|
-
|
33
|
-
it "resolves 'home'" do
|
34
|
-
@browser.resolve_relative_url('home').to_s.should == 'http://localhost/home'
|
35
|
-
end
|
36
|
-
|
37
|
-
it "resolves 'user/login'" do
|
38
|
-
@browser.resolve_relative_url('user/login').to_s.should == 'http://localhost/user/login'
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context "resolving on 'http://localhost/subsite'" do
|
43
|
-
before() do
|
44
|
-
Capybara.app_host='http://localhost/subsite'
|
45
|
-
end
|
46
|
-
|
47
|
-
it "resolves '/'" do
|
48
|
-
@browser.resolve_relative_url('/').to_s.should == 'http://localhost/subsite/'
|
49
|
-
end
|
50
|
-
|
51
|
-
it "resolves '/home'" do
|
52
|
-
@browser.resolve_relative_url('/home').to_s.should == 'http://localhost/subsite/home'
|
53
|
-
end
|
54
|
-
|
55
|
-
it "resolves 'home'" do
|
56
|
-
@browser.resolve_relative_url('home').to_s.should == 'http://localhost/subsite/home'
|
57
|
-
end
|
58
|
-
|
59
|
-
it "resolves 'user/login'" do
|
60
|
-
@browser.resolve_relative_url('user/login').to_s.should == 'http://localhost/subsite/user/login'
|
61
|
-
end
|
62
|
-
|
63
|
-
it "resolves '/subsite/user/login'" do
|
64
|
-
@browser.resolve_relative_url('/subsite/user/login').to_s.should == 'http://localhost/subsite/user/login'
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|