bbc-capybara-mechanize 0.4.2 → 0.4.5

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.
@@ -39,21 +39,13 @@ Note that I haven't tested this case for my self yet. The Capybara tests pass fo
39
39
 
40
40
  ## Running tests
41
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
42
  Run bundler
47
43
 
48
44
  bundle install
49
45
 
50
- Run the app with the following line:
51
-
52
- bundle exec ruby -rrubygems lib/capybara/spec/extended_test_app.rb
53
-
54
46
  Then you are ready to run the test like so
55
47
 
56
- rake spec
48
+ bundle exec rake spec
57
49
 
58
50
  Todo
59
51
  ----
@@ -73,4 +65,4 @@ Note on Patches/Pull Requests
73
65
 
74
66
  Copyright
75
67
  ---------
76
- Copyright (c) 2010 Jeroen van Dijk. See LICENSE for details.
68
+ Copyright (c) 2010-2012 Jeroen van Dijk. See LICENSE for details.
@@ -3,16 +3,15 @@ require 'mechanize'
3
3
 
4
4
  class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
5
5
  extend Forwardable
6
-
7
- attr_reader :driver
8
-
6
+
9
7
  def_delegator :agent, :scheme_handlers
10
8
  def_delegator :agent, :scheme_handlers=
11
-
9
+
12
10
  def initialize(driver)
13
11
  @agent = ::Mechanize.new
14
12
  @agent.redirect_ok = false
15
13
  @agent.user_agent = default_user_agent
14
+ #@agent.agent.max_history = 0
16
15
  if !driver.options.empty?
17
16
  if driver.options[:certificate]
18
17
  if !driver.options[:certificate].is_a? Hash
@@ -22,6 +21,9 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
22
21
  @agent.cert = driver.options[:certificate][:cer]
23
22
  @agent.key = driver.options[:certificate][:key]
24
23
  end
24
+ if driver.options[:ca]
25
+ @agent.ca_file = driver.options[:ca]
26
+ end
25
27
  end
26
28
  if driver.options[:user_agent]
27
29
  @agent.user_agent = driver.options[:user_agent]
@@ -45,221 +47,246 @@ class Capybara::Mechanize::Browser < Capybara::RackTest::Browser
45
47
  end
46
48
  super
47
49
  end
48
-
49
- def auth(username, password)
50
- @agent.basic_auth(username, password)
51
- end
52
-
50
+
53
51
  def reset_host!
54
- @last_remote_host = nil
55
- @last_request_remote = nil
56
- super
57
- end
52
+ @last_remote_uri = nil
53
+ @last_request_remote = nil
54
+ super
55
+ end
58
56
 
59
- def current_url
60
- last_request_remote? ? remote_response.current_url : super
61
- end
57
+ def current_url
58
+ last_request_remote? ? remote_response.current_url : super
59
+ end
62
60
 
63
- def last_response
64
- last_request_remote? ? remote_response : super
65
- end
61
+ def last_response
62
+ last_request_remote? ? remote_response : super
63
+ end
66
64
 
67
- def follow_redirects!
68
- 5.times do
69
- follow_redirect! if last_response.redirect?
70
- end
71
- raise Capybara::InfiniteRedirectError, "redirected more than 5 times, check for infinite redirects." if last_response.redirect?
72
- end
65
+ def follow_redirects!
66
+ 5.times do
67
+ follow_redirect! if last_response.redirect?
68
+ end
69
+ raise Capybara::InfiniteRedirectError, "redirected more than 5 times, check for infinite redirects." if last_response.redirect?
70
+ end
73
71
 
74
- def follow_redirect!
75
- unless last_response.redirect?
76
- raise "Last response was not a redirect. Cannot follow_redirect!"
77
- end
72
+ def follow_redirect!
73
+ unless last_response.redirect?
74
+ raise "Last response was not a redirect. Cannot follow_redirect!"
75
+ end
78
76
 
79
- get(last_location_header)
80
- end
77
+ get(last_location_header)
78
+ end
81
79
 
82
- def process(method, path, *options)
83
- reset_cache!
84
- send(method, path, *options)
85
- follow_redirects!
86
- end
80
+ def process(method, path, *options)
81
+ reset_cache!
82
+ send(method, path, *options)
83
+ follow_redirects!
84
+ end
87
85
 
88
- def process_without_redirect(method, path, attributes, headers)
89
- path = @last_path if path.nil? || path.empty?
86
+ def process_without_redirect(method, path, attributes, headers)
87
+ path = @last_path if path.nil? || path.empty?
90
88
 
91
- if remote?(path)
92
- process_remote_request(method, path, attributes, headers)
93
- else
94
- register_local_request
89
+ if remote?(path)
90
+ process_remote_request(method, path, attributes, headers)
91
+ else
92
+ register_local_request
95
93
 
96
- path = determine_path(path)
94
+ path = determine_path(path)
97
95
 
98
- reset_cache!
99
- send("racktest_#{method}", path, attributes, env.merge(headers))
100
- end
96
+ reset_cache!
97
+ send("racktest_#{method}", path, attributes, env.merge(headers))
98
+ end
101
99
 
102
- @last_path = path
103
- end
100
+ @last_path = path
101
+ end
104
102
 
105
- # TODO path Capybara to move this into its own method
106
- def determine_path(path)
107
- new_uri = URI.parse(path)
108
- current_uri = URI.parse(current_url)
103
+ # TODO path Capybara to move this into its own method
104
+ def determine_path(path)
105
+ new_uri = URI.parse(path)
106
+ current_uri = URI.parse(current_url)
109
107
 
110
- if new_uri.host
111
- @current_host = new_uri.scheme + '://' + new_uri.host
112
- end
108
+ if new_uri.host
109
+ @current_host = new_uri.scheme + '://' + new_uri.host
110
+ end
113
111
 
114
- if new_uri.relative?
115
- path = request_path + path if path.start_with?('?')
116
-
117
- unless path.start_with?('/')
118
- folders = request_path.split('/')
119
- if folders.empty?
120
- path = '/' + path
121
- else
122
- path = (folders[0, folders.size - 1] << path).join('/')
123
- end
124
- end
125
- path = current_host + path
112
+ if new_uri.relative?
113
+ path = request_path + path if path.start_with?('?')
114
+
115
+ unless path.start_with?('/')
116
+ folders = request_path.split('/')
117
+ if folders.empty?
118
+ path = '/' + path
119
+ else
120
+ path = (folders[0, folders.size - 1] << path).join('/')
126
121
  end
127
- path
128
122
  end
123
+ path = current_host + path
124
+ end
125
+ path
126
+ end
129
127
 
130
- alias :racktest_get :get
131
- def get(path, attributes = {}, headers = {})
132
- process_without_redirect(:get, path, attributes, headers)
133
- end
128
+ alias :racktest_get :get
129
+ def get(path, attributes = {}, headers = {})
130
+ process_without_redirect(:get, path, attributes, headers)
131
+ end
134
132
 
135
- alias :racktest_post :post
136
- def post(path, attributes = {}, headers = {})
137
- process_without_redirect(:post, path, post_data(attributes), headers)
138
- end
133
+ alias :racktest_post :post
134
+ def post(path, attributes = {}, headers = {})
135
+ process_without_redirect(:post, path, post_data(attributes), headers)
136
+ end
139
137
 
140
- alias :racktest_put :put
141
- def put(path, attributes = {}, headers = {})
142
- process_without_redirect(:put, path, attributes, headers)
143
- end
138
+ alias :racktest_put :put
139
+ def put(path, attributes = {}, headers = {})
140
+ process_without_redirect(:put, path, attributes, headers)
141
+ end
144
142
 
145
- alias :racktest_delete :delete
146
- def delete(path, attributes = {}, headers = {})
147
- process_without_redirect(:delete, path, attributes, headers)
148
- end
143
+ alias :racktest_delete :delete
144
+ def delete(path, attributes = {}, headers = {})
145
+ process_without_redirect(:delete, path, attributes, headers)
146
+ end
149
147
 
150
- def post_data(params)
151
- params.inject({}) do |memo, param|
152
- case param
153
- when Hash
154
- param.each {|attribute, value| memo[attribute] = value }
155
- memo
156
- when Array
157
- case param.last
158
- when Hash
159
- param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
160
- else
161
- memo[param.first] = param.last
162
- end
163
- memo
164
- end
148
+ def post_data(params)
149
+ params.inject({}) do |memo, param|
150
+ case param
151
+ when Hash
152
+ param.each {|attribute, value| memo[attribute] = value }
153
+ memo
154
+ when Array
155
+ case param.last
156
+ when Hash
157
+ param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
158
+ else
159
+ memo[param.first] = param.last
165
160
  end
161
+ memo
166
162
  end
163
+ end
164
+ end
167
165
 
168
- def remote?(url)
169
- if Capybara.app_host
170
- true
171
- else
172
- host = URI.parse(url).host
166
+ def remote?(url)
167
+ if Capybara.app_host
168
+ true
169
+ else
170
+ host = URI.parse(url).host
173
171
 
174
- if host.nil?
175
- last_request_remote?
176
- else
177
- !Capybara::Mechanize.local_hosts.include?(host)
178
- end
179
- end
172
+ if host.nil?
173
+ last_request_remote?
174
+ else
175
+ !Capybara::Mechanize.local_hosts.include?(host)
180
176
  end
177
+ end
178
+ end
181
179
 
182
- attr_reader :agent
180
+ attr_reader :agent
183
181
 
184
- private
182
+ private
185
183
 
186
- def last_location_header
187
- last_request_remote? ? remote_response.page.response['Location'] : last_response['Location']
188
- end
184
+ def last_location_header
185
+ last_request_remote? ? remote_response.page.response['Location'] : last_response['Location']
186
+ end
189
187
 
190
- def last_request_remote?
191
- !!@last_request_remote
192
- end
188
+ def last_request_remote?
189
+ !!@last_request_remote
190
+ end
193
191
 
194
- def register_local_request
195
- @last_remote_host = nil
196
- @last_request_remote = false
192
+ def register_local_request
193
+ @last_remote_uri = nil
194
+ @last_request_remote = false
195
+ end
196
+
197
+ def process_remote_request(method, url, attributes, headers)
198
+ if remote?(url)
199
+ uri = URI.parse(url)
200
+ uri = resolve_relative_url(url) if uri.host.nil?
201
+ @last_remote_uri = uri
202
+ url = uri.to_s
203
+
204
+ reset_cache!
205
+ begin
206
+ args = []
207
+ args << attributes unless attributes.empty?
208
+ args << headers unless headers.empty?
209
+ @agent.send(method, url, *args)
210
+ rescue => e
211
+ raise "Received the following error for a #{method.to_s.upcase} request to #{url}: '#{e.message}'"
197
212
  end
213
+ @last_request_remote = true
214
+ end
215
+ end
198
216
 
199
- def process_remote_request(method, url, attributes, headers)
200
- if remote?(url)
201
- remote_uri = URI.parse(url)
202
-
203
- if remote_uri.host.nil?
204
- remote_host = @last_remote_host || Capybara.app_host || Capybara.default_host
205
- url = File.join(remote_host, url)
206
- url = "http://#{url}" unless url =~ /^http(s?):/
207
- else
208
- @last_remote_host = "#{remote_uri.host}:#{remote_uri.port}"
209
- end
210
-
211
- reset_cache!
212
- begin
213
- args = []
214
- args << attributes unless attributes.empty?
215
- args << headers unless headers.empty?
216
- @agent.send(method, url, *args)
217
- rescue => e
218
- raise "Received the following error for a #{method.to_s.upcase} request to #{url}: '#{e.message}'"
219
- end
220
- @last_request_remote = true
217
+ # paths are combined "intelligently" as close as they would be by the browser, but still interpreting
218
+ # routes from rails like "/user/login" as relative to a host including a possible subdirectory:
219
+ # eg: app_host = localhost/mysite/ url = / result = http://localhost/mysite/
220
+ # eg: app_host = localhost/mysite/ url = /home result = http://localhost/mysite/home
221
+ # eg: app_host = localhost/mysite/ url = /user/login result = http://localhost/mysite/user/login
222
+ # eg: app_host = localhost/mysite/ url = /mysite/login result = http://localhost/mysite/login
223
+ # **** notice that 'mysite' is not repeated! *****
224
+ def resolve_relative_url(url)
225
+ if @last_remote_uri
226
+ base_uri = @last_remote_uri
227
+ path_prefix = ''
228
+ else
229
+ host = Capybara.app_host || Capybara.default_host
230
+ # do this in text so we don't get the host interpretted as the scheme.
231
+ host = "http://#{host}" unless host =~ %r{^https?://.*}
232
+ base_uri = URI.parse(host)
233
+ base_uri.path = '/' if base_uri.path.nil? || base_uri.path.empty?
234
+ if base_uri.path.length > 1
235
+ path_prefix = base_uri.path
236
+ path_prefix += '/' unless path_prefix.end_with?('/') || url.start_with?('/')
237
+
238
+ # if the prefix is already in the path, don't let it be there twice.
239
+ if url.start_with?(path_prefix)
240
+ path_prefix = ''
221
241
  end
242
+ else
243
+ path_prefix = ''
222
244
  end
245
+ end
246
+ uri = URI.parse(path_prefix + url)
247
+ result_uri = base_uri.merge uri
248
+ end
223
249
 
224
- def remote_response
225
- ResponseProxy.new(@agent.current_page) if @agent.current_page
226
- end
227
250
 
228
- def default_user_agent
229
- "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"
230
- end
251
+ def remote_response
252
+ ResponseProxy.new(@agent.current_page) if @agent.current_page
253
+ end
231
254
 
232
- class ResponseProxy
233
- extend Forwardable
255
+ def default_user_agent
256
+ "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"
257
+ end
234
258
 
235
- def_delegator :page, :body
259
+ class ResponseProxy
260
+ extend Forwardable
236
261
 
237
- attr_reader :page
262
+ def_delegator :page, :body
238
263
 
239
- def initialize(page)
240
- @page = page
241
- end
264
+ attr_reader :page
242
265
 
243
- def current_url
244
- page.uri.to_s
245
- end
266
+ def initialize(page)
267
+ @page = page
268
+ end
246
269
 
247
- def headers
248
- # Hax the content-type contains utf8, so Capybara specs are failing, need to ask mailinglist
249
- headers = page.response
250
- headers["cache-control"] = "no-cache"
251
- headers["content-type"].gsub!(';charset=utf-8', '') if headers["content-type"]
252
- headers
253
- end
270
+ def current_url
271
+ page.uri.to_s
272
+ end
254
273
 
255
- def status
256
- page.code.to_i
257
- end
274
+ def headers
275
+ # Hax the content-type contains utf8, so Capybara specs are failing, need to ask mailinglist
276
+ headers = page.response
277
+ headers["content-type"].gsub!(';charset=utf-8', '') if headers["content-type"]
278
+ headers
279
+ end
258
280
 
259
- def redirect?
260
- [301, 302].include?(status)
261
- end
281
+ def status
282
+ page.code.to_i
283
+ end
262
284
 
263
- end
285
+ def redirect?
286
+ status >= 300 && status < 400
287
+ end
288
+
289
+ end
290
+
291
+ end
264
292
 
265
- end
@@ -18,4 +18,4 @@ class Capybara::Mechanize::Driver < Capybara::RackTest::Driver
18
18
  @browser ||= Capybara::Mechanize::Browser.new(self)
19
19
  end
20
20
 
21
- end
21
+ end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Mechanize
3
- VERSION = '0.4.2'
3
+ VERSION = '0.4.5'
4
4
  end
5
- end
5
+ end
@@ -2,22 +2,6 @@ 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
-
6
- helpers do
7
-
8
- def protected!
9
- unless authorized?
10
- response['WWW-Authenticate'] = %(Basic realm="Restricted Area")
11
- throw(:halt, [401, "Not authorized\n"])
12
- end
13
- end
14
-
15
- def authorized?
16
- @auth ||= Rack::Auth::Basic::Request.new(request.env)
17
- @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['admin', 'password']
18
- end
19
-
20
- end
21
5
 
22
6
  get %r{/redirect_to/(.*)} do
23
7
  redirect params[:captures]
@@ -50,10 +34,29 @@ class ExtendedTestApp < TestApp#< Sinatra::Base
50
34
  post '/request_info/*' do
51
35
  current_request_info
52
36
  end
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
53
57
 
54
- get '/basic_auth/' do
55
- protected!
56
- %{Successfully authenticated}
58
+ get '/redirect_target' do
59
+ %{correct redirect}
57
60
  end
58
61
 
59
62
  private
@@ -61,4 +64,5 @@ class ExtendedTestApp < TestApp#< Sinatra::Base
61
64
  def current_request_info
62
65
  "Current host is #{request.url}, method #{request.request_method.downcase}"
63
66
  end
64
- end
67
+ end
68
+
@@ -29,6 +29,24 @@ describe Capybara::Mechanize::Driver do
29
29
  @driver.post("#{REMOTE_TEST_URL}/form", {:form => "success"})
30
30
  @driver.body.should include('success')
31
31
  end
32
+
33
+ it "should throw an error when bad proxy option is passed" do
34
+ running do
35
+ Capybara::Mechanize::Driver.new(ExtendedTestApp, {:proxy => BAD_PROXY}).browser
36
+ end.should raise_error("ProxyError: You have entered an invalid proxy address #{BAD_PROXY}. e.g. (http|https)://proxy.com(:port)")
37
+ end
38
+
39
+ it "should not throw an error when good proxy option is passed" do
40
+ running do
41
+ Capybara::Mechanize::Driver.new(ExtendedTestApp, {:proxy => GOOD_PROXY}).browser
42
+ end.should_not raise_error()
43
+ end
44
+
45
+ it "should not throw an error when good proxy with port option is passed" do
46
+ running do
47
+ Capybara::Mechanize::Driver.new(ExtendedTestApp, {:proxy => PROXY_WITH_PORT}).browser
48
+ end.should_not raise_error()
49
+ end
32
50
 
33
51
  context "for a post request" do
34
52
 
@@ -48,6 +66,13 @@ describe Capybara::Mechanize::Driver do
48
66
 
49
67
  end
50
68
 
69
+ describe "redirect" do
70
+ it "should handle redirects with http-params" do
71
+ @driver.visit "#{REMOTE_TEST_URL}/redirect_with_http_param"
72
+ @driver.body.should include('correct redirect')
73
+ end
74
+ end
75
+
51
76
  it_should_behave_like "driver"
52
77
  it_should_behave_like "driver with header support"
53
78
  it_should_behave_like "driver with status code support"
@@ -56,40 +81,3 @@ describe Capybara::Mechanize::Driver do
56
81
  end
57
82
 
58
83
  end
59
-
60
- describe "Capybara::Mechanize::Driver, browser" do
61
-
62
- before(:each) do
63
- Capybara.app_host = REMOTE_TEST_URL
64
- end
65
-
66
- after(:each) do
67
- Capybara.app_host = nil
68
- end
69
-
70
- context "in remote mode" do
71
- it "should not throw an error when empty option is passed" do
72
- running do
73
- Capybara::Mechanize::Driver.new(ExtendedTestApp, {})
74
- end.should_not raise_error()
75
- end
76
-
77
- it "should throw an error when bad proxy option is passed" do
78
- running do
79
- Capybara::Mechanize::Driver.new(ExtendedTestApp, {:proxy => BAD_PROXY}).browser
80
- end.should raise_error("ProxyError: You have entered an invalid proxy address #{BAD_PROXY}. e.g. (http|https)://proxy.com(:port)")
81
- end
82
-
83
- it "should not throw an error when good proxy option is passed" do
84
- running do
85
- Capybara::Mechanize::Driver.new(ExtendedTestApp, {:proxy => GOOD_PROXY}).browser
86
- end.should_not raise_error()
87
- end
88
-
89
- it "should not throw an error when good proxy with port option is passed" do
90
- running do
91
- Capybara::Mechanize::Driver.new(ExtendedTestApp, {:proxy => PROXY_WITH_PORT}).browser
92
- end.should_not raise_error()
93
- end
94
- end
95
- end
@@ -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
@@ -56,43 +56,4 @@ describe Capybara::Session do
56
56
  it_should_behave_like "session with headers support"
57
57
  it_should_behave_like "session with status code support"
58
58
  end
59
-
60
- context "Custom user agent" do
61
-
62
- before do
63
- @session = Capybara::Session.new(:mechanize, TestApp)
64
- @session.driver.options[:respect_data_method] = true
65
- Capybara.default_host = 'http://www.local.com'
66
- end
67
-
68
- it "should allow setting of custom user agents" do
69
- @session.driver.options[:user_agent] = "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3"
70
- @session.visit("#{REMOTE_TEST_URL}/request_info/user_agent")
71
- @session.body.should include("Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3")
72
- end
73
- end
74
-
75
- context "Basic HTTP Auth" do
76
-
77
- before do
78
- @session = Capybara::Session.new(:mechanize, TestApp)
79
- @session.driver.options[:respect_data_method] = true
80
- Capybara.default_host = 'http://www.local.com'
81
- end
82
-
83
- it "should allow basic authentication to be setup" do
84
- @session.driver.options[:username] = "admin"
85
- @session.driver.options[:password] = "password"
86
- @session.visit("#{REMOTE_TEST_URL}/basic_auth/")
87
- @session.body.should include("Successfully authenticated")
88
- end
89
-
90
- it "should allow basic authentication via auth method" do
91
- @session.driver.browser.auth("admin", "password")
92
- @session.visit("#{REMOTE_TEST_URL}/basic_auth/")
93
- @session.body.should include("Successfully authenticated")
94
- end
95
-
96
- end
97
-
98
59
  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
@@ -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,24 +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"
35
- GOOD_PROXY = "http://proxy.com"
36
- BAD_PROXY = "fasfasfasfasf"
37
- PROXY_WITH_PORT = "http://proxy.com:520"
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,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bbc-capybara-mechanize
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 5
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 2
10
- version: 0.4.2
9
+ - 5
10
+ version: 0.4.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jeroen van Dijk
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-05-30 00:00:00 Z
19
+ date: 2012-08-02 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  version_requirements: &id001 !ruby/object:Gem::Requirement
@@ -24,12 +24,11 @@ dependencies:
24
24
  requirements:
25
25
  - - ~>
26
26
  - !ruby/object:Gem::Version
27
- hash: 25
27
+ hash: 5
28
28
  segments:
29
29
  - 2
30
- - 5
31
- - 1
32
- version: 2.5.1
30
+ - 3
31
+ version: "2.3"
33
32
  prerelease: false
34
33
  type: :runtime
35
34
  name: mechanize
@@ -40,12 +39,11 @@ dependencies:
40
39
  requirements:
41
40
  - - ~>
42
41
  - !ruby/object:Gem::Version
43
- hash: 23
42
+ hash: 13
44
43
  segments:
45
44
  - 1
46
45
  - 1
47
- - 2
48
- version: 1.1.2
46
+ version: "1.1"
49
47
  prerelease: false
50
48
  type: :runtime
51
49
  name: capybara
@@ -67,6 +65,7 @@ files:
67
65
  - lib/capybara/spec/extended_test_app.rb
68
66
  - spec/driver/mechanize_driver_spec.rb
69
67
  - spec/driver/remote_mechanize_driver_spec.rb
68
+ - spec/relative_urls_spec.rb
70
69
  - spec/session/mechanize_spec.rb
71
70
  - spec/session/remote_mechanize_spec.rb
72
71
  - spec/spec_helper.rb