capybara-mechanize 0.2.3 → 0.2.4
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/README.mdown +19 -2
- data/lib/capybara/driver/{mechanize.rb → mechanize_driver.rb} +54 -10
- data/lib/capybara/mechanize.rb +11 -1
- data/lib/capybara/spec/extended_test_app.rb +15 -1
- data/spec/driver/mechanize_driver_spec.rb +50 -12
- data/spec/driver/remote_mechanize_driver_spec.rb +7 -1
- data/spec/session/mechanize_spec.rb +13 -0
- data/spec/session/remote_mechanize_spec.rb +5 -7
- data/spec/spec_helper.rb +10 -4
- metadata +11 -28
- data/spec/spec.opts +0 -1
data/README.mdown
CHANGED
@@ -37,10 +37,27 @@ When you want to use this driver to test a remote application. You have to set t
|
|
37
37
|
|
38
38
|
Note that I haven't tested this case for my self yet. The Capybara tests pass for this situation though so it should work! Please provide me with feedback if it doesn't.
|
39
39
|
|
40
|
+
## Running tests
|
41
|
+
|
42
|
+
Until this library is merged with capybara there needs to be local app and you need to add the following to your host file:
|
43
|
+
|
44
|
+
127.0.0.1 capybara-testapp.heroku.com
|
45
|
+
|
46
|
+
Run bundler
|
47
|
+
|
48
|
+
bundle install
|
49
|
+
|
50
|
+
Run the app with the following line:
|
51
|
+
|
52
|
+
bundle exec ruby -rrubygems lib/capybara/spec/extended_test_app.rb
|
53
|
+
|
54
|
+
Then you are ready to run the test like so
|
55
|
+
|
56
|
+
rake spec
|
57
|
+
|
40
58
|
Todo
|
41
59
|
----
|
42
|
-
* Make the
|
43
|
-
* Add specs for local to remote redirect (functionality is there though and works in our case)
|
60
|
+
* Make the last 12 failing remote session spec pass, see remote_mechanize_spec and uncomment one line there to see them fail
|
44
61
|
* Test this driver with non-rack/non-ruby projects
|
45
62
|
|
46
63
|
Note on Patches/Pull Requests
|
@@ -6,13 +6,19 @@ class Capybara::Driver::Mechanize < Capybara::Driver::RackTest
|
|
6
6
|
def_delegator :agent, :scheme_handlers
|
7
7
|
def_delegator :agent, :scheme_handlers=
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
super
|
9
|
+
def initialize(app = nil)
|
11
10
|
@agent = ::Mechanize.new
|
12
11
|
@agent.redirect_ok = false
|
12
|
+
|
13
|
+
if app
|
14
|
+
# Delegate the RackApp to the RackTest driver
|
15
|
+
super(app)
|
16
|
+
elsif !Capybara.app_host
|
17
|
+
raise ArgumentError, "You have to set at least Capybara.app_host or Capybara.app"
|
18
|
+
end
|
13
19
|
end
|
14
20
|
|
15
|
-
def
|
21
|
+
def reset!
|
16
22
|
@agent.cookie_jar.clear!
|
17
23
|
super
|
18
24
|
end
|
@@ -30,7 +36,7 @@ class Capybara::Driver::Mechanize < Capybara::Driver::RackTest
|
|
30
36
|
unless response.redirect?
|
31
37
|
raise "Last response was not a redirect. Cannot follow_redirect!"
|
32
38
|
end
|
33
|
-
|
39
|
+
|
34
40
|
location = if last_request_remote?
|
35
41
|
remote_response.page.response['Location']
|
36
42
|
else
|
@@ -43,7 +49,8 @@ class Capybara::Driver::Mechanize < Capybara::Driver::RackTest
|
|
43
49
|
def get(url, params = {}, headers = {})
|
44
50
|
if remote?(url)
|
45
51
|
process_remote_request(:get, url)
|
46
|
-
else
|
52
|
+
else
|
53
|
+
register_local_request
|
47
54
|
super
|
48
55
|
end
|
49
56
|
end
|
@@ -51,7 +58,26 @@ class Capybara::Driver::Mechanize < Capybara::Driver::RackTest
|
|
51
58
|
def post(url, params = {}, headers = {})
|
52
59
|
if remote?(url)
|
53
60
|
process_remote_request(:post, url, params, headers)
|
54
|
-
else
|
61
|
+
else
|
62
|
+
register_local_request
|
63
|
+
super
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def put(url, params = {}, headers = {})
|
68
|
+
if remote?(url)
|
69
|
+
process_remote_request(:put, url)
|
70
|
+
else
|
71
|
+
register_local_request
|
72
|
+
super
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def delete(url, params = {}, headers = {})
|
77
|
+
if remote?(url)
|
78
|
+
process_remote_request(:delete, url, params, headers)
|
79
|
+
else
|
80
|
+
register_local_request
|
55
81
|
super
|
56
82
|
end
|
57
83
|
end
|
@@ -63,7 +89,12 @@ class Capybara::Driver::Mechanize < Capybara::Driver::RackTest
|
|
63
89
|
false
|
64
90
|
else
|
65
91
|
host = URI.parse(url).host
|
66
|
-
|
92
|
+
|
93
|
+
if host.nil? && last_request_remote?
|
94
|
+
true
|
95
|
+
else
|
96
|
+
!(host.nil? || host.include?(Capybara.default_host))
|
97
|
+
end
|
67
98
|
end
|
68
99
|
end
|
69
100
|
|
@@ -74,15 +105,28 @@ class Capybara::Driver::Mechanize < Capybara::Driver::RackTest
|
|
74
105
|
def last_request_remote?
|
75
106
|
!!@last_request_remote
|
76
107
|
end
|
108
|
+
|
109
|
+
def register_local_request
|
110
|
+
@last_remote_host = nil
|
111
|
+
@last_request_remote = false
|
112
|
+
end
|
77
113
|
|
78
114
|
def process_remote_request(method, url, *options)
|
79
115
|
if remote?(url)
|
80
|
-
|
116
|
+
remote_uri = URI.parse(url)
|
117
|
+
|
118
|
+
if remote_uri.host.nil?
|
119
|
+
remote_host = @last_remote_host || Capybara.app_host || Capybara.default_host
|
120
|
+
url = File.join(remote_host, url)
|
121
|
+
url = "http://#{url}" unless url.include?("http")
|
122
|
+
else
|
123
|
+
@last_remote_host = "#{remote_uri.host}:#{remote_uri.port}"
|
124
|
+
end
|
125
|
+
|
81
126
|
reset_cache
|
82
127
|
@agent.send *( [method, url] + options)
|
128
|
+
|
83
129
|
@last_request_remote = true
|
84
|
-
else
|
85
|
-
@last_request_remote = false
|
86
130
|
end
|
87
131
|
end
|
88
132
|
|
data/lib/capybara/mechanize.rb
CHANGED
@@ -8,7 +8,21 @@ class ExtendedTestApp < TestApp#< Sinatra::Base
|
|
8
8
|
end
|
9
9
|
|
10
10
|
get '/host' do
|
11
|
-
"current host is #{request.host}"
|
11
|
+
"current host is #{request.host}:#{request.port}, method get"
|
12
|
+
end
|
13
|
+
|
14
|
+
get '/form_with_relative_action_to_host' do
|
15
|
+
%{<form action="/host" method="post">
|
16
|
+
<input type="submit" value="submit" />
|
17
|
+
</form>}
|
18
|
+
end
|
19
|
+
|
20
|
+
get '/relative_link_to_host' do
|
21
|
+
%{<a href="/host">host</a>}
|
22
|
+
end
|
23
|
+
|
24
|
+
post '/host' do
|
25
|
+
"current host is #{request.host}:#{request.port}, method post"
|
12
26
|
end
|
13
27
|
end
|
14
28
|
|
@@ -5,10 +5,10 @@ describe "Capybara::Driver::Mechanize, in local model" do
|
|
5
5
|
@driver = Capybara::Driver::Mechanize.new(ExtendedTestApp)
|
6
6
|
end
|
7
7
|
|
8
|
-
it "should throw an error when no rack app is given" do
|
8
|
+
it "should throw an error when no rack app is given without an app host" do
|
9
9
|
running do
|
10
|
-
Capybara::Driver::Mechanize.new
|
11
|
-
end.should raise_error(ArgumentError)
|
10
|
+
Capybara::Driver::Mechanize.new
|
11
|
+
end.should raise_error(ArgumentError, "You have to set at least Capybara.app_host or Capybara.app")
|
12
12
|
end
|
13
13
|
|
14
14
|
it_should_behave_like "driver"
|
@@ -32,31 +32,62 @@ describe "Capybara::Driver::Mechanize, in local model" do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should treat urls as remote" do
|
35
|
-
@driver.
|
35
|
+
@driver.should be_remote('http://www.remote.com')
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
context "with a default url, no app host" do
|
40
40
|
before :each do
|
41
|
-
Capybara.default_host = 'local.com'
|
41
|
+
Capybara.default_host = 'www.local.com'
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should treat urls with the same host names as local" do
|
45
|
-
@driver.
|
45
|
+
@driver.should_not be_remote('http://www.local.com')
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should treat other urls as remote" do
|
49
|
-
@driver.
|
49
|
+
@driver.should be_remote('http://www.remote.com')
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should treat relative paths as remote if the previous request was remote" do
|
53
|
+
@driver.visit('http://www.remote.com')
|
54
|
+
@driver.should be_remote('/some_relative_link')
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should treat relative paths as local if the previous request was local" do
|
58
|
+
@driver.visit('http://www.local.com')
|
59
|
+
@driver.should_not be_remote('/some_relative_link')
|
50
60
|
end
|
51
61
|
|
52
62
|
it "should receive the right host" do
|
53
63
|
@driver.visit('http://www.local.com/host')
|
54
|
-
@driver.body.should
|
64
|
+
@driver.body.should == "current host is www.local.com:80, method get"
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should always switch to the right context" do
|
68
|
+
@driver.visit('http://www.local.com/host')
|
69
|
+
should_be_a_local_get
|
70
|
+
|
71
|
+
@driver.visit('/host')
|
72
|
+
should_be_a_local_get
|
73
|
+
@driver.should_not be_remote('/first_local')
|
74
|
+
|
75
|
+
@driver.visit("#{REMOTE_TEST_URL}/host")
|
76
|
+
should_be_a_remote_get
|
77
|
+
@driver.should be_remote('/first_remote')
|
78
|
+
|
79
|
+
@driver.visit('/host')
|
80
|
+
should_be_a_remote_get
|
81
|
+
@driver.should be_remote('/second_remote')
|
82
|
+
|
83
|
+
@driver.visit('http://www.local.com/host')
|
84
|
+
should_be_a_local_get
|
85
|
+
@driver.should_not be_remote('/second_local')
|
55
86
|
end
|
56
87
|
|
57
88
|
it "should follow redirects from local to remote" do
|
58
89
|
@driver.visit("http://www.local.com/redirect_to/#{REMOTE_TEST_URL}/host")
|
59
|
-
|
90
|
+
should_be_a_remote_get
|
60
91
|
end
|
61
92
|
|
62
93
|
after :each do
|
@@ -66,13 +97,20 @@ describe "Capybara::Driver::Mechanize, in local model" do
|
|
66
97
|
|
67
98
|
it "should include the right host when remote" do
|
68
99
|
@driver.visit("#{REMOTE_TEST_URL}/host")
|
69
|
-
|
100
|
+
should_be_a_remote_get
|
70
101
|
end
|
71
102
|
|
72
|
-
|
73
103
|
it "should follow redirects from remote to local" do
|
74
104
|
@driver.visit("#{REMOTE_TEST_URL}/redirect_to/http://www.local.com/host")
|
75
|
-
|
105
|
+
should_be_a_local_get
|
106
|
+
end
|
107
|
+
|
108
|
+
def should_be_a_remote_get
|
109
|
+
@driver.body.should == "current host is #{REMOTE_TEST_HOST}, method get"
|
110
|
+
end
|
111
|
+
|
112
|
+
def should_be_a_local_get
|
113
|
+
@driver.body.should == "current host is www.local.com:80, method get"
|
76
114
|
end
|
77
115
|
|
78
116
|
end
|
@@ -10,10 +10,16 @@ describe Capybara::Driver::Mechanize do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
before do
|
13
|
-
@driver = Capybara::Driver::Mechanize.new
|
13
|
+
@driver = Capybara::Driver::Mechanize.new
|
14
14
|
end
|
15
15
|
|
16
16
|
context "in remote mode" do
|
17
|
+
it "should not throw an error when no rack app is given" do
|
18
|
+
running do
|
19
|
+
Capybara::Driver::Mechanize.new
|
20
|
+
end.should_not raise_error(ArgumentError)
|
21
|
+
end
|
22
|
+
|
17
23
|
it_should_behave_like "driver"
|
18
24
|
it_should_behave_like "driver with header support"
|
19
25
|
it_should_behave_like "driver with status code support"
|
@@ -4,6 +4,7 @@ describe Capybara::Session do
|
|
4
4
|
context 'with mechanize driver' do
|
5
5
|
before do
|
6
6
|
@session = Capybara::Session.new(:mechanize, TestApp)
|
7
|
+
Capybara.default_host = "www.local.com"
|
7
8
|
end
|
8
9
|
|
9
10
|
describe '#driver' do
|
@@ -25,6 +26,18 @@ describe Capybara::Session do
|
|
25
26
|
@session.body.should == 'The requested object was deleted'
|
26
27
|
end
|
27
28
|
end
|
29
|
+
|
30
|
+
it "should use the last remote url when following relative links" do
|
31
|
+
@session.visit("#{REMOTE_TEST_URL}/relative_link_to_host")
|
32
|
+
@session.click_link "host"
|
33
|
+
@session.body.should == "current host is #{REMOTE_TEST_HOST}, method get"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should use the last remote url when submitting a form with a relative action" do
|
37
|
+
@session.visit("#{REMOTE_TEST_URL}/form_with_relative_action_to_host")
|
38
|
+
@session.click_button "submit"
|
39
|
+
@session.body.should == "current host is #{REMOTE_TEST_HOST}, method post"
|
40
|
+
end
|
28
41
|
|
29
42
|
it_should_behave_like "session"
|
30
43
|
it_should_behave_like "session without javascript support"
|
@@ -12,7 +12,7 @@ describe Capybara::Session do
|
|
12
12
|
|
13
13
|
|
14
14
|
before do
|
15
|
-
@session = Capybara::Session.new(:mechanize
|
15
|
+
@session = Capybara::Session.new(:mechanize)
|
16
16
|
end
|
17
17
|
|
18
18
|
describe '#driver' do
|
@@ -29,15 +29,13 @@ describe Capybara::Session do
|
|
29
29
|
|
30
30
|
describe '#click_link' do
|
31
31
|
it "should use data-method if available" do
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
@session.body.should == 'The requested object was deleted'
|
36
|
-
end
|
32
|
+
@session.visit "/with_html"
|
33
|
+
@session.click_link "A link with data-method"
|
34
|
+
@session.body.should == 'The requested object was deleted'
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
40
|
-
# Pending: Still
|
38
|
+
# Pending: Still 90 (and before the update of capybara to 0.4.0 16) failing tests here (result is 702 examples, 90 failures, instead of 381 examples)
|
41
39
|
# it_should_behave_like "session"
|
42
40
|
|
43
41
|
it_should_behave_like "session without javascript support"
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
+
require 'bundler/setup'
|
1
2
|
require 'capybara'
|
2
3
|
require 'capybara/mechanize'
|
3
4
|
|
4
5
|
require 'sinatra'
|
5
|
-
require 'spec'
|
6
6
|
|
7
7
|
require 'capybara/spec/extended_test_app'
|
8
8
|
|
@@ -14,10 +14,16 @@ alias :running :lambda
|
|
14
14
|
|
15
15
|
Capybara.default_wait_time = 0 # less timeout so tests run faster
|
16
16
|
|
17
|
-
|
17
|
+
RSpec.configure do |config|
|
18
18
|
config.after do
|
19
19
|
Capybara.default_selector = :xpath
|
20
20
|
end
|
21
|
+
# config.filter_run :focus => true
|
21
22
|
end
|
22
|
-
|
23
|
-
|
23
|
+
|
24
|
+
# Until this library is merged with capybara there needs to be a local app and you need to add
|
25
|
+
# 127.0.0.1 capybara-testapp.heroku.com to your host file
|
26
|
+
# Run the app with the following line:
|
27
|
+
# ruby -rrubygems lib/capybara/spec/extended_test_app.rb
|
28
|
+
REMOTE_TEST_HOST = "capybara-testapp.heroku.com:8070"
|
29
|
+
REMOTE_TEST_URL = "http://#{REMOTE_TEST_HOST}"
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-mechanize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 4
|
10
|
+
version: 0.2.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jeroen van Dijk
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-09-27 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
hash: 23
|
30
30
|
segments:
|
@@ -40,32 +40,16 @@ dependencies:
|
|
40
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
45
|
+
hash: 15
|
46
46
|
segments:
|
47
47
|
- 0
|
48
|
-
-
|
49
|
-
-
|
50
|
-
version: 0.
|
48
|
+
- 4
|
49
|
+
- 0
|
50
|
+
version: 0.4.0
|
51
51
|
type: :runtime
|
52
52
|
version_requirements: *id002
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: rspec
|
55
|
-
prerelease: false
|
56
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - "="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
hash: 27
|
62
|
-
segments:
|
63
|
-
- 1
|
64
|
-
- 3
|
65
|
-
- 0
|
66
|
-
version: 1.3.0
|
67
|
-
type: :development
|
68
|
-
version_requirements: *id003
|
69
53
|
description: RackTest driver for Capybara, but with remote request support thanks to mechanize
|
70
54
|
email: jeroen@jeevidee.nl
|
71
55
|
executables: []
|
@@ -75,7 +59,7 @@ extensions: []
|
|
75
59
|
extra_rdoc_files: []
|
76
60
|
|
77
61
|
files:
|
78
|
-
- lib/capybara/driver/
|
62
|
+
- lib/capybara/driver/mechanize_driver.rb
|
79
63
|
- lib/capybara/mechanize/cucumber.rb
|
80
64
|
- lib/capybara/mechanize.rb
|
81
65
|
- lib/capybara/spec/extended_test_app.rb
|
@@ -83,7 +67,6 @@ files:
|
|
83
67
|
- spec/driver/remote_mechanize_driver_spec.rb
|
84
68
|
- spec/session/mechanize_spec.rb
|
85
69
|
- spec/session/remote_mechanize_spec.rb
|
86
|
-
- spec/spec.opts
|
87
70
|
- spec/spec_helper.rb
|
88
71
|
- README.mdown
|
89
72
|
has_rdoc: true
|
data/spec/spec.opts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--color --backtrace
|