diff --git a/lib/capybara/dsl.rb b/lib/capybara/dsl.rb index 47c1b9e1..6f779ad3 100644 --- a/lib/capybara/dsl.rb +++ b/lib/capybara/dsl.rb @@ -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 diff --git a/spec/dsl_spec.rb b/spec/dsl_spec.rb index 8f0b930a..abf77a25 100644 --- a/spec/dsl_spec.rb +++ b/spec/dsl_spec.rb @@ -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