capybara-mechanize 0.3.0.rc3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.mdown CHANGED
@@ -65,4 +65,4 @@ Note on Patches/Pull Requests
65
65
 
66
66
  Copyright
67
67
  ---------
68
- Copyright (c) 2010-2011 Jeroen van Dijk. See LICENSE for details.
68
+ Copyright (c) 2010-2012 Jeroen van Dijk. See LICENSE for details.
@@ -15,7 +15,7 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
15
15
  end
16
16
 
17
17
  def reset_host!
18
- @last_remote_host = nil
18
+ @last_remote_uri = nil
19
19
  @last_request_remote = nil
20
20
  super
21
21
  end
@@ -156,21 +156,16 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
156
156
  end
157
157
 
158
158
  def register_local_request
159
- @last_remote_host = nil
159
+ @last_remote_uri = nil
160
160
  @last_request_remote = false
161
161
  end
162
162
 
163
163
  def process_remote_request(method, url, attributes, headers)
164
164
  if remote?(url)
165
- remote_uri = URI.parse(url)
166
-
167
- if remote_uri.host.nil?
168
- remote_host = @last_remote_host || Capybara.app_host || Capybara.default_host
169
- url = File.join(remote_host, url)
170
- url = "http://#{url}" unless url.include?("http")
171
- else
172
- @last_remote_host = "#{remote_uri.host}:#{remote_uri.port}"
173
- end
165
+ uri = URI.parse(url)
166
+ uri = resolve_relative_url(url) if uri.host.nil?
167
+ @last_remote_uri = uri
168
+ url = uri.to_s
174
169
 
175
170
  reset_cache!
176
171
  begin
@@ -185,6 +180,40 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
185
180
  end
186
181
  end
187
182
 
183
+ # paths are combined "intelligently" as close as they would be by the browser, but still interpreting
184
+ # routes from rails like "/user/login" as relative to a host including a possible subdirectory:
185
+ # eg: app_host = localhost/mysite/ url = / result = http://localhost/mysite/
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
214
+ end
215
+
216
+
188
217
  def remote_response
189
218
  ResponseProxy.new(@agent.current_page) if @agent.current_page
190
219
  end
@@ -220,7 +249,7 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
220
249
  end
221
250
 
222
251
  def redirect?
223
- [301, 302].include?(status)
252
+ status >= 300 && status < 400
224
253
  end
225
254
 
226
255
  end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Mechanize
3
- VERSION = '0.3.0.rc3'
3
+ VERSION = '0.3.0'
4
4
  end
5
5
  end
@@ -35,6 +35,29 @@ class ExtendedTestApp < TestApp#< Sinatra::Base
35
35
  current_request_info
36
36
  end
37
37
 
38
+ get '/host' do
39
+ "Current host is #{request.scheme}://#{request.host}:#{request.port}"
40
+ end
41
+
42
+ get '/subsite/relative_link_to_host' do
43
+ %{<a href="/subsite/request_info2/host">host</a>}
44
+ end
45
+
46
+ get '/subsite/local_link_to_host' do
47
+ %{<a href="request_info2/host">host</a>}
48
+ end
49
+
50
+ get '/subsite/request_info2/*' do
51
+ "subsite: " + current_request_info
52
+ end
53
+
54
+ get '/redirect_with_http_param' do
55
+ redirect '/redirect_target?foo=http'
56
+ end
57
+
58
+ get '/redirect_target' do
59
+ %{correct redirect}
60
+ end
38
61
 
39
62
  private
40
63
 
@@ -48,6 +48,13 @@ describe Capybara::Mechanize::Driver do
48
48
 
49
49
  end
50
50
 
51
+ describe "redirect" do
52
+ it "should handle redirects with http-params" do
53
+ @driver.visit "#{REMOTE_TEST_URL}/redirect_with_http_param"
54
+ @driver.body.should include('correct redirect')
55
+ end
56
+ end
57
+
51
58
  it_should_behave_like "driver"
52
59
  it_should_behave_like "driver with header support"
53
60
  it_should_behave_like "driver with status code support"
@@ -0,0 +1,68 @@
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
@@ -35,6 +35,8 @@ describe Capybara::Session do
35
35
  @session.body.should include('The requested object was deleted')
36
36
  end
37
37
  end
38
+
39
+
38
40
 
39
41
  # Pending: Still 16 failing tests here (result is 706 examples, 16 failures, instead of 385 examples)
40
42
  # it_should_behave_like "session"
@@ -42,5 +44,24 @@ describe Capybara::Session do
42
44
  it_should_behave_like "session without javascript support"
43
45
  it_should_behave_like "session with headers support"
44
46
  it_should_behave_like "session with status code support"
47
+
48
+
49
+ context "remote app in a sub-domain" do
50
+ before :each do
51
+ Capybara.app_host = "#{REMOTE_TEST_URL}/subsite"
52
+ end
53
+
54
+ it "follows relative link correctly" do
55
+ @session.visit "/relative_link_to_host"
56
+ @session.click_link "host"
57
+ @session.body.should include('request_info2/host')
58
+ end
59
+
60
+ it "follows local link correctly" do
61
+ @session.visit "/local_link_to_host"
62
+ @session.click_link "host"
63
+ @session.body.should include('request_info2/host')
64
+ end
65
+ end
45
66
  end
46
67
  end
data/spec/spec_helper.rb CHANGED
@@ -1,12 +1,11 @@
1
1
  require 'bundler/setup'
2
2
  require 'capybara'
3
+ require 'capybara/dsl'
3
4
  require 'capybara/mechanize'
4
- require 'artifice'
5
+ require 'capybara/spec/extended_test_app'
5
6
 
6
7
  require 'sinatra'
7
8
 
8
- require 'capybara/spec/extended_test_app'
9
-
10
9
  # TODO move this stuff into capybara
11
10
  require 'capybara/spec/driver'
12
11
  require 'capybara/spec/session'
@@ -14,21 +13,35 @@ require 'capybara/spec/session'
14
13
  alias :running :lambda
15
14
 
16
15
  Capybara.default_wait_time = 0 # less timeout so tests run faster
16
+ Capybara.app = ExtendedTestApp
17
17
 
18
- RSpec.configure do |config|
19
- config.before(:all) do
20
- Artifice.activate_with(ExtendedTestApp)
21
- end
18
+ rack_server = Capybara::Server.new(Capybara.app)
19
+ rack_server.boot
22
20
 
21
+ RSpec.configure do |config|
23
22
  config.after do
24
23
  Capybara.default_selector = :xpath
25
24
  Capybara::Mechanize.local_hosts = nil
26
25
  end
27
-
28
- config.after(:all) do
29
- Artifice.deactivate
30
- end
31
26
  # config.filter_run :focus => true
32
27
  end
33
28
 
34
- REMOTE_TEST_URL = "http://localhost"
29
+ REMOTE_TEST_URL = "http://localhost:#{rack_server.port}"
30
+
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
47
+ end
metadata CHANGED
@@ -1,39 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-mechanize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0.rc3
5
- prerelease: 6
4
+ version: 0.3.0
5
+ prerelease:
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: 2011-09-09 00:00:00.000000000 +02:00
13
- default_executable:
12
+ date: 2012-03-14 00:00:00.000000000Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: mechanize
17
- requirement: &2168594720 !ruby/object:Gem::Requirement
16
+ requirement: &70180442685720 !ruby/object:Gem::Requirement
18
17
  none: false
19
18
  requirements:
20
19
  - - ~>
21
20
  - !ruby/object:Gem::Version
22
- version: 2.0.0
21
+ version: '2.3'
23
22
  type: :runtime
24
23
  prerelease: false
25
- version_requirements: *2168594720
24
+ version_requirements: *70180442685720
26
25
  - !ruby/object:Gem::Dependency
27
26
  name: capybara
28
- requirement: &2168594240 !ruby/object:Gem::Requirement
27
+ requirement: &70180442685240 !ruby/object:Gem::Requirement
29
28
  none: false
30
29
  requirements:
31
30
  - - ~>
32
31
  - !ruby/object:Gem::Version
33
- version: 1.1.0
32
+ version: '1.1'
34
33
  type: :runtime
35
34
  prerelease: false
36
- version_requirements: *2168594240
35
+ version_requirements: *70180442685240
37
36
  description: RackTest driver for Capybara, but with remote request support thanks
38
37
  to mechanize
39
38
  email: jeroen@jeevidee.nl
@@ -49,11 +48,11 @@ files:
49
48
  - lib/capybara/spec/extended_test_app.rb
50
49
  - spec/driver/mechanize_driver_spec.rb
51
50
  - spec/driver/remote_mechanize_driver_spec.rb
51
+ - spec/relative_urls_spec.rb
52
52
  - spec/session/mechanize_spec.rb
53
53
  - spec/session/remote_mechanize_spec.rb
54
54
  - spec/spec_helper.rb
55
55
  - README.mdown
56
- has_rdoc: true
57
56
  homepage: https://github.com/jeroenvandijk/capybara-mechanize
58
57
  licenses: []
59
58
  post_install_message:
@@ -67,9 +66,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
67
66
  - - ! '>='
68
67
  - !ruby/object:Gem::Version
69
68
  version: '0'
70
- segments:
71
- - 0
72
- hash: -3177128084939450317
73
69
  required_rubygems_version: !ruby/object:Gem::Requirement
74
70
  none: false
75
71
  requirements:
@@ -78,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
74
  version: '0'
79
75
  requirements: []
80
76
  rubyforge_project:
81
- rubygems_version: 1.6.2
77
+ rubygems_version: 1.8.15
82
78
  signing_key:
83
79
  specification_version: 3
84
80
  summary: RackTest driver for Capybara with remote request support