From 3498aacbbebb41e529b6755f4ccfdfbb84c28830 Mon Sep 17 00:00:00 2001
From: codeforkjeff <jeff@codefork.com>
Date: Wed, 26 Apr 2017 18:48:41 -0400
Subject: Add lazy loading to #keys and #values methods in Session

This fixes a bug where session.keys and session.values return an empty
array unless one of the other methods that does lazy loading from the
underlying store is called first. #keys and #values should also
call #load_for_read!
---
 actionpack/lib/action_dispatch/request/session.rb |  2 ++
 actionpack/test/dispatch/request/session_test.rb  | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/actionpack/lib/action_dispatch/request/session.rb b/actionpack/lib/action_dispatch/request/session.rb
index 74ba6466cf..3547a8604f 100644
--- a/actionpack/lib/action_dispatch/request/session.rb
+++ b/actionpack/lib/action_dispatch/request/session.rb
@@ -101,11 +101,13 @@ module ActionDispatch
 
       # Returns keys of the session as Array.
       def keys
+        load_for_read!
         @delegate.keys
       end
 
       # Returns values of the session as Array.
       def values
+        load_for_read!
         @delegate.values
       end
 
diff --git a/actionpack/test/dispatch/request/session_test.rb b/actionpack/test/dispatch/request/session_test.rb
index 311b80ea0a..228135c547 100644
--- a/actionpack/test/dispatch/request/session_test.rb
+++ b/actionpack/test/dispatch/request/session_test.rb
@@ -54,6 +54,11 @@ module ActionDispatch
         assert_equal %w[rails adequate], s.keys
       end
 
+      def test_keys_with_deferred_loading
+        s = Session.create(store_with_data, req, {})
+        assert_equal %w[sample_key], s.keys
+      end
+
       def test_values
         s = Session.create(store, req, {})
         s["rails"] = "ftw"
@@ -61,6 +66,11 @@ module ActionDispatch
         assert_equal %w[ftw awesome], s.values
       end
 
+      def test_values_with_deferred_loading
+        s = Session.create(store_with_data, req, {})
+        assert_equal %w[sample_value], s.values
+      end
+
       def test_clear
         s = Session.create(store, req, {})
         s["rails"] = "ftw"
@@ -113,6 +123,14 @@ module ActionDispatch
             def delete_session(env, id, options); 123; end
           }.new
         end
+
+        def store_with_data
+          Class.new {
+            def load_session(env); [1, { "sample_key" => "sample_value" }]; end
+            def session_exists?(env); true; end
+            def delete_session(env, id, options); 123; end
+          }.new
+        end
     end
 
     class SessionIntegrationTest < ActionDispatch::IntegrationTest
-- 
cgit v1.2.3