Use Capybara#session_name= for switching sessions.

This commit is contained in:
Tristan Dunn 2011-01-22 15:19:42 -05:00
parent fbd45c3a89
commit b89175dd17
2 changed files with 47 additions and 33 deletions

View File

@ -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

View File

@ -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