From c4244cc55b21061cecc00a03f056689ac2469d1e Mon Sep 17 00:00:00 2001 From: Yann Vanhalewyn Date: Mon, 24 Oct 2016 14:47:14 +0200 Subject: Improve and test SessionHash#fetch. --- lib/rack/session/abstract/id.rb | 12 +++++++++++- test/spec_session_abstract_session_hash.rb | 13 +++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/rack/session/abstract/id.rb b/lib/rack/session/abstract/id.rb index 4c139637..ca1a2628 100644 --- a/lib/rack/session/abstract/id.rb +++ b/lib/rack/session/abstract/id.rb @@ -18,6 +18,8 @@ module Rack include Enumerable attr_writer :id + Unspecified = Object.new + def self.find(req) req.get_header RACK_SESSION end @@ -54,7 +56,15 @@ module Rack load_for_read! @data[key.to_s] end - alias :fetch :[] + + def fetch(key, default=Unspecified, &block) + load_for_read! + if default == Unspecified + @data.fetch(key.to_s, &block) + else + @data.fetch(key.to_s, default, &block) + end + end def has_key?(key) load_for_read! diff --git a/test/spec_session_abstract_session_hash.rb b/test/spec_session_abstract_session_hash.rb index 6d73a80a..16b06c7b 100644 --- a/test/spec_session_abstract_session_hash.rb +++ b/test/spec_session_abstract_session_hash.rb @@ -25,4 +25,17 @@ describe Rack::Session::Abstract::SessionHash do assert_equal [:bar, :qux], hash.values end + describe "#fetch" do + it "returns value for a matching key" do + assert_equal :bar, hash.fetch(:foo) + end + + it "works with a default value" do + assert_equal :default, hash.fetch(:unknown, :default) + end + + it "works with a block" do + assert_equal :default, hash.fetch(:unkown) { :default } + end + end end -- cgit v1.2.3-24-ge0c7 From 91cc7a456f2a354d371b44dc14703f3304f42b29 Mon Sep 17 00:00:00 2001 From: Yann Vanhalewyn Date: Wed, 2 Nov 2016 11:03:51 +0100 Subject: Add test for fetching unknown keys without defaults --- test/spec_session_abstract_session_hash.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/spec_session_abstract_session_hash.rb b/test/spec_session_abstract_session_hash.rb index 16b06c7b..76b34a01 100644 --- a/test/spec_session_abstract_session_hash.rb +++ b/test/spec_session_abstract_session_hash.rb @@ -37,5 +37,9 @@ describe Rack::Session::Abstract::SessionHash do it "works with a block" do assert_equal :default, hash.fetch(:unkown) { :default } end + + it "it raises when fetching unknown keys without defaults" do + lambda { hash.fetch(:unknown) }.must_raise KeyError + end end end -- cgit v1.2.3-24-ge0c7