Use Capybara#session_name= for switching sessions.
This commit is contained in:
parent
fbd45c3a89
commit
b89175dd17
|
@ -2,7 +2,7 @@ require 'capybara'
|
|||
|
||||
module Capybara
|
||||
class << self
|
||||
attr_writer :default_driver, :current_driver, :javascript_driver
|
||||
attr_writer :default_driver, :current_driver, :javascript_driver, :session_name
|
||||
|
||||
attr_accessor :app
|
||||
|
||||
|
@ -57,7 +57,13 @@ module Capybara
|
|||
# @return [Capybara::Session] The currently used session
|
||||
#
|
||||
def current_session
|
||||
session_pool[session_namespace] ||= Capybara::Session.new(current_driver, app)
|
||||
if session_name == :default
|
||||
namespace = session_namespace
|
||||
else
|
||||
namespace = "#{session_namespace}:#{session_name}"
|
||||
end
|
||||
|
||||
session_pool[namespace] ||= Capybara::Session.new(current_driver, app)
|
||||
end
|
||||
|
||||
##
|
||||
|
@ -70,6 +76,16 @@ module Capybara
|
|||
end
|
||||
alias_method :reset!, :reset_sessions!
|
||||
|
||||
##
|
||||
#
|
||||
# The current session name.
|
||||
#
|
||||
# @return [Symbol] The name of the currently used session.
|
||||
#
|
||||
def session_name
|
||||
@session_name ||= :default
|
||||
end
|
||||
|
||||
##
|
||||
#
|
||||
# Switch to a different session, referenced by name, execute the provided block and return to
|
||||
|
@ -78,14 +94,10 @@ module Capybara
|
|||
def in_session(name, &block)
|
||||
return unless block_given?
|
||||
|
||||
namespace = "#{session_namespace}:#{name}"
|
||||
previous_session = current_session
|
||||
session_pool[namespace] ||= Capybara::Session.new(current_driver, app)
|
||||
|
||||
self.current_session = session_pool[namespace]
|
||||
self.session_name = name
|
||||
yield
|
||||
ensure
|
||||
self.current_session = previous_session
|
||||
self.session_name = :default
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -9,6 +9,7 @@ describe Capybara do
|
|||
end
|
||||
|
||||
after do
|
||||
Capybara.session_name = nil
|
||||
Capybara.default_driver = nil
|
||||
Capybara.use_default_driver
|
||||
end
|
||||
|
@ -123,49 +124,50 @@ describe Capybara do
|
|||
Capybara.current_session.object_id.should_not == object_id
|
||||
Capybara.current_session.app.should == Capybara.app
|
||||
end
|
||||
|
||||
it "should change when the session name changes" do
|
||||
object_id = Capybara.current_session.object_id
|
||||
Capybara.session_name = :administrator
|
||||
Capybara.session_name.should == :administrator
|
||||
Capybara.current_session.object_id.should_not == object_id
|
||||
Capybara.session_name = :default
|
||||
Capybara.session_name.should == :default
|
||||
Capybara.current_session.object_id.should == object_id
|
||||
end
|
||||
end
|
||||
|
||||
describe "#in_session" do
|
||||
let!(:default_session) { Capybara.current_session }
|
||||
|
||||
before do
|
||||
@object_ids = { :default => default_session.object_id }
|
||||
end
|
||||
|
||||
it "should create unique sessions by name" do
|
||||
Capybara.in_session(:bob) { @object_ids[:bob] = Capybara.current_session.object_id }
|
||||
Capybara.in_session(:sue) { @object_ids[:sue] = Capybara.current_session.object_id }
|
||||
|
||||
@object_ids.values.uniq.length.should == 3
|
||||
end
|
||||
|
||||
it "should cache sessions by name" do
|
||||
Capybara.in_session(:bob) { @object_ids[:bob] = Capybara.current_session.object_id }
|
||||
Capybara.in_session(:sue) { @object_ids[:sue] = Capybara.current_session.object_id }
|
||||
|
||||
Capybara.in_session(:bob) do
|
||||
@object_ids[:bob].should == Capybara.current_session.object_id
|
||||
end
|
||||
Capybara.in_session(:sue) do
|
||||
@object_ids[:sue].should == Capybara.current_session.object_id
|
||||
it "should change the session name for the duration of the block" do
|
||||
Capybara.session_name.should == :default
|
||||
Capybara.in_session(:administrator) do
|
||||
Capybara.session_name.should == :administrator
|
||||
end
|
||||
Capybara.session_name.should == :default
|
||||
end
|
||||
|
||||
it "should reset the session to the default, even if an exception occurs" do
|
||||
begin
|
||||
Capybara.in_session(:raise) { raise }
|
||||
Capybara.in_session(:raise) do
|
||||
raise
|
||||
end
|
||||
rescue Exception
|
||||
end
|
||||
Capybara.current_session.should == default_session
|
||||
Capybara.session_name.should == :default
|
||||
end
|
||||
|
||||
it "should yield the passed block" do
|
||||
called = false
|
||||
Capybara.in_session(:other) { called = true }
|
||||
Capybara.in_session(:administrator) { called = true }
|
||||
called.should == true
|
||||
end
|
||||
end
|
||||
|
||||
describe "#session_name" do
|
||||
it "should default to :default" do
|
||||
Capybara.session_name.should == :default
|
||||
end
|
||||
end
|
||||
|
||||
describe 'the DSL' do
|
||||
before do
|
||||
@session = Capybara
|
||||
|
|
Loading…
Reference in New Issue