rack-redic 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.rubocop.yml +55 -0
- data/README.md +1 -1
- data/Rakefile +0 -1
- data/{Gemfile → gems.rb} +1 -0
- data/lib/rack/session/redic.rb +58 -112
- data/rack-redic.gemspec +2 -4
- data/test/all.rb +1 -1
- data/test/helper.rb +1 -2
- data/test/session_redic_test.rb +8 -9
- metadata +6 -27
- data/test/storage_msgpack_test.rb +0 -28
- data/test/storage_oj_test.rb +0 -14
- data/test/storage_test.rb +0 -13
- data/test/support/storage_marshaller_interface.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b5d2082c913c7e03778bf029522eaf82c69321d279d2faba665d6fb72f6d60ad
|
4
|
+
data.tar.gz: e3ee0c189726c401312cb2fccf54dd7c491d1788ef0baf4c74e2649715bc0f3d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bee20ab72c2041aeb81c944c9635d5c736f5074854ec016d0c695a85979a9ddb5ed78c1940d5993e684c2cc6b6107dd105bdf4c8b794cdb72e199e11d9eb3ce0
|
7
|
+
data.tar.gz: fa4455eb28f23b911dd1ce00441d6098f2386373f0fc74162e4b9f4b7e2cf614ca7f08b9391fab8f2cc923159191a9079614d1f225dea85300ec3bc682965c9a
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# http://rubocop.readthedocs.io
|
2
|
+
# https://github.com/bbatsov/rubocop/blob/master/config/enabled.yml
|
3
|
+
AllCops:
|
4
|
+
DisplayCopNames: true
|
5
|
+
DisplayStyleGuide: true
|
6
|
+
ExtraDetails: true
|
7
|
+
TargetRubyVersion: 2.4
|
8
|
+
|
9
|
+
Layout/AlignParameters:
|
10
|
+
EnforcedStyle: with_fixed_indentation
|
11
|
+
|
12
|
+
Layout/EmptyLineAfterMagicComment:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
Layout/IndentHash:
|
16
|
+
EnforcedStyle: consistent
|
17
|
+
|
18
|
+
Layout/MultilineOperationIndentation:
|
19
|
+
EnforcedStyle: indented
|
20
|
+
|
21
|
+
Layout/SpaceInsideStringInterpolation:
|
22
|
+
EnforcedStyle: space
|
23
|
+
|
24
|
+
Metrics/AbcSize:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
Metrics/BlockLength:
|
28
|
+
Enabled: false
|
29
|
+
|
30
|
+
Metrics/ClassLength:
|
31
|
+
Enabled: false
|
32
|
+
|
33
|
+
Metrics/CyclomaticComplexity:
|
34
|
+
Enabled: false
|
35
|
+
|
36
|
+
Metrics/LineLength:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
Metrics/MethodLength:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
Metrics/ModuleLength:
|
43
|
+
Enabled: false
|
44
|
+
|
45
|
+
Metrics/PerceivedComplexity:
|
46
|
+
Enabled: false
|
47
|
+
|
48
|
+
# Style/Documentation:
|
49
|
+
# Enabled: false
|
50
|
+
|
51
|
+
Style/IfUnlessModifier:
|
52
|
+
Enabled: false
|
53
|
+
|
54
|
+
Style/Next:
|
55
|
+
MinBodyLength: 8
|
data/README.md
CHANGED
@@ -13,7 +13,7 @@ Any other options will get passed to `Rack::Session::Abstract::Persisted`.
|
|
13
13
|
|
14
14
|
## Installation
|
15
15
|
|
16
|
-
Add this line to your application's Gemfile:
|
16
|
+
Add this line to your application's Gemfile or gems.rb file:
|
17
17
|
|
18
18
|
```ruby
|
19
19
|
gem 'rack-redic', require: 'rack/session/redic'
|
data/Rakefile
CHANGED
data/{Gemfile → gems.rb}
RENAMED
data/lib/rack/session/redic.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
require 'rack/session/abstract/id'
|
4
3
|
require 'redic'
|
4
|
+
require 'securerandom'
|
5
5
|
|
6
6
|
module Rack
|
7
7
|
module Session
|
8
|
-
#
|
9
8
|
# Rack::Session::Redic provides simple cookie based session management.
|
10
9
|
# Session data is stored in Redis via the Redic gem. The corresponding
|
11
10
|
# session key is maintained in the cookie.
|
@@ -25,46 +24,64 @@ module Rack
|
|
25
24
|
# refresh the expiration set in Redis with each request.
|
26
25
|
#
|
27
26
|
# Any other options will get passed to Rack::Session::Abstract::Persisted.
|
28
|
-
#
|
29
27
|
class Redic < Abstract::Persisted
|
30
|
-
|
31
|
-
|
28
|
+
# Redis commands.
|
29
|
+
DELETE = 'DEL'
|
30
|
+
EX = 'EX'
|
31
|
+
EXISTS = 'EXISTS'
|
32
|
+
GET = 'GET'
|
33
|
+
SET = 'SET'
|
34
|
+
|
35
|
+
# Assorted.
|
36
|
+
REDIS_URL = 'REDIS_URL'
|
37
|
+
ZERO = 0
|
38
|
+
|
39
|
+
# Access the storage interface directly. Needed for testing.
|
40
|
+
#
|
41
|
+
# @return [Redic]
|
32
42
|
attr_reader :storage
|
33
43
|
|
34
44
|
def initialize(app, options = {})
|
35
45
|
super
|
36
46
|
|
47
|
+
@expires = options[:expire_after]
|
48
|
+
@marshaller = options.fetch(:marshaller) { Marshal }
|
37
49
|
@mutex = Mutex.new
|
38
|
-
@storage =
|
39
|
-
options[:expire_after],
|
40
|
-
options.fetch(:marshaller) { Marshal },
|
41
|
-
options.fetch(:url) { ENV.fetch(REDIS_URL) }
|
42
|
-
)
|
50
|
+
@storage = ::Redic.new(options.fetch(:url) { ENV.fetch(REDIS_URL) })
|
43
51
|
end
|
44
52
|
|
45
|
-
#
|
53
|
+
# Generate a session ID that doesn't already exist.
|
54
|
+
#
|
55
|
+
# Based on Rack::Session::Abstract::Persisted#generate_sid and
|
56
|
+
# Rack::Session::Memcache#generate_sid but without the conditional check.
|
57
|
+
# We always generate the session ID from SecureRandom#hex.
|
58
|
+
#
|
59
|
+
# @return [String]
|
46
60
|
def generate_sid
|
47
61
|
loop do
|
48
|
-
|
49
|
-
break
|
62
|
+
session_id = SecureRandom.hex(@sid_length)
|
63
|
+
break session_id unless @storage.call(EXISTS, session_id) != ZERO
|
50
64
|
end
|
51
65
|
end
|
52
66
|
|
53
67
|
# Find the session (or generate a blank one).
|
54
|
-
def find_session(_req,
|
68
|
+
def find_session(_req, session_id)
|
55
69
|
@mutex.synchronize do
|
56
|
-
unless
|
57
|
-
|
70
|
+
unless session_id && (session = deserialize(@storage.call(GET, session_id)))
|
71
|
+
session_id, session = generate_sid, {} # rubocop:disable Style/ParallelAssignment
|
58
72
|
end
|
59
73
|
|
60
|
-
[
|
74
|
+
[session_id, session]
|
61
75
|
end
|
62
76
|
end
|
63
77
|
|
64
78
|
# Write the session.
|
65
79
|
def write_session(_req, session_id, new_session, _options)
|
80
|
+
arguments = [SET, session_id, serialize(new_session)]
|
81
|
+
arguments += [EX, @expires] if @expires
|
82
|
+
|
66
83
|
@mutex.synchronize do
|
67
|
-
@storage.
|
84
|
+
@storage.call(*arguments)
|
68
85
|
|
69
86
|
session_id
|
70
87
|
end
|
@@ -73,105 +90,34 @@ module Rack
|
|
73
90
|
# Kill the session.
|
74
91
|
def delete_session(_req, session_id, options)
|
75
92
|
@mutex.synchronize do
|
76
|
-
@storage.
|
93
|
+
@storage.call(DELETE, session_id)
|
77
94
|
generate_sid unless options[:drop]
|
78
95
|
end
|
79
96
|
end
|
80
97
|
|
81
|
-
#
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
@marshaller = marshaller
|
103
|
-
@storage = ::Redic.new(url)
|
104
|
-
end
|
105
|
-
|
106
|
-
# Check for an identifier's existence.
|
107
|
-
#
|
108
|
-
# @param id [String]
|
109
|
-
# The key to check for.
|
110
|
-
# @return [Boolean]
|
111
|
-
def exists?(id)
|
112
|
-
@storage.call(EXISTS, id) != ZERO
|
113
|
-
end
|
114
|
-
|
115
|
-
# Retrieve an object.
|
116
|
-
#
|
117
|
-
# @param id [String]
|
118
|
-
# The key in Redis to retrieve from.
|
119
|
-
# @return [Object, nil]
|
120
|
-
# The object stored at the identifier provided, or nil.
|
121
|
-
def get(id)
|
122
|
-
deserialize(@storage.call(GET, id))
|
123
|
-
end
|
124
|
-
|
125
|
-
# Store an object.
|
126
|
-
#
|
127
|
-
# @param id [String]
|
128
|
-
# The key to use to store the object.
|
129
|
-
# @param object [Object]
|
130
|
-
# Any object that can be serialized.
|
131
|
-
# @return [String]
|
132
|
-
# See {https://redis.io/commands/set#return-value Redis' docs for more}.
|
133
|
-
def set(id, object)
|
134
|
-
arguments = [SET, id, serialize(object)]
|
135
|
-
arguments += [EX, @expires] if @expires
|
136
|
-
|
137
|
-
@storage.call(*arguments)
|
138
|
-
end
|
139
|
-
|
140
|
-
# Remove an object.
|
141
|
-
#
|
142
|
-
# @param id [String]
|
143
|
-
# The key to delete.
|
144
|
-
# @return [Integer]
|
145
|
-
# The number of keys that were deleted. See
|
146
|
-
# {https://redis.io/commands/del#return-value Redis' docs for more}.
|
147
|
-
def delete(id)
|
148
|
-
@storage.call(DELETE, id)
|
149
|
-
end
|
150
|
-
|
151
|
-
private
|
152
|
-
|
153
|
-
# Serialize an object using our marshaller.
|
154
|
-
#
|
155
|
-
# @param object [Object]
|
156
|
-
# @return [String]
|
157
|
-
# The object serialized by the marshaller.
|
158
|
-
def serialize(object)
|
159
|
-
@marshaller.dump(object)
|
160
|
-
end
|
161
|
-
|
162
|
-
# Deserialize a string back into an object.
|
163
|
-
#
|
164
|
-
# @param string [String]
|
165
|
-
# @return [Object, nil]
|
166
|
-
# Returns the object as loaded by the marshaller, or nil.
|
167
|
-
def deserialize(string)
|
168
|
-
@marshaller.load(string) if string
|
169
|
-
|
170
|
-
# In the case that loading fails, return a nil.
|
171
|
-
rescue
|
172
|
-
nil
|
173
|
-
end
|
98
|
+
# Serialize an object using our marshaller.
|
99
|
+
#
|
100
|
+
# @param object [Object]
|
101
|
+
# @return [String]
|
102
|
+
# The object as serialized by the marshaller.
|
103
|
+
def serialize(object)
|
104
|
+
@marshaller.dump(object)
|
105
|
+
end
|
106
|
+
private :serialize
|
107
|
+
|
108
|
+
# Deserialize a string back into an object.
|
109
|
+
#
|
110
|
+
# @param string [String]
|
111
|
+
# @return [Object, nil]
|
112
|
+
# Returns the object as loaded by the marshaller, or nil.
|
113
|
+
def deserialize(string)
|
114
|
+
@marshaller.load(string) if string
|
115
|
+
|
116
|
+
# In the case that loading fails, return a nil.
|
117
|
+
rescue # rubocop:disable Lint/RescueWithoutErrorClass
|
118
|
+
nil
|
174
119
|
end
|
120
|
+
private :deserialize
|
175
121
|
end
|
176
122
|
end
|
177
123
|
end
|
data/rack-redic.gemspec
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
Gem::Specification.new do |spec|
|
4
3
|
spec.name = 'rack-redic'
|
5
|
-
spec.version = '1.
|
4
|
+
spec.version = '1.4.0'
|
6
5
|
spec.authors = ['Evan Lecklider']
|
7
6
|
spec.email = ['evan@lecklider.com']
|
8
7
|
|
@@ -17,6 +16,5 @@ Gem::Specification.new do |spec|
|
|
17
16
|
spec.add_dependency 'redic'
|
18
17
|
|
19
18
|
spec.add_development_dependency 'minitest'
|
20
|
-
spec.add_development_dependency '
|
21
|
-
spec.add_development_dependency 'oj'
|
19
|
+
spec.add_development_dependency 'rubocop'
|
22
20
|
end
|
data/test/all.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
# Add our project folder to the root of our load path.
|
@@ -8,7 +7,7 @@ $LOAD_PATH.unshift File.expand_path('../..', __FILE__)
|
|
8
7
|
ENV['REDIS_URL'] ||= 'redis://localhost:6379'
|
9
8
|
|
10
9
|
# Require our core library.
|
11
|
-
require 'rack/session/redic'
|
10
|
+
require 'lib/rack/session/redic'
|
12
11
|
|
13
12
|
# Kick off the tests.
|
14
13
|
require 'minitest/autorun'
|
data/test/session_redic_test.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
require 'rack/lint'
|
4
3
|
require 'rack/mock'
|
@@ -9,7 +8,7 @@ describe Rack::Session::Redic do
|
|
9
8
|
ROOT = '/'
|
10
9
|
|
11
10
|
session_key = Rack::Session::Abstract::Persisted::DEFAULT_OPTIONS[:key]
|
12
|
-
session_match = /#{session_key}=([0-9a-fA-F]+);/
|
11
|
+
session_match = /#{ session_key }=([0-9a-fA-F]+);/
|
13
12
|
|
14
13
|
incrementor = lambda do |env|
|
15
14
|
env['rack.session']['counter'] ||= 0
|
@@ -65,8 +64,8 @@ describe Rack::Session::Redic do
|
|
65
64
|
response = request.get(ROOT)
|
66
65
|
sid = response[Rack::SET_COOKIE][session_match, 1]
|
67
66
|
|
68
|
-
assert_equal request.get("/?rack.session=#{sid}").body, '{"counter"=>1}'
|
69
|
-
assert_equal request.get("/?rack.session=#{sid}").body, '{"counter"=>1}'
|
67
|
+
assert_equal request.get("/?rack.session=#{ sid }").body, '{"counter"=>1}'
|
68
|
+
assert_equal request.get("/?rack.session=#{ sid }").body, '{"counter"=>1}'
|
70
69
|
end
|
71
70
|
|
72
71
|
it 'determines session from params' do
|
@@ -75,8 +74,8 @@ describe Rack::Session::Redic do
|
|
75
74
|
response = request.get(ROOT)
|
76
75
|
sid = response[Rack::SET_COOKIE][session_match, 1]
|
77
76
|
|
78
|
-
assert_equal request.get("/?rack.session=#{sid}").body, '{"counter"=>2}'
|
79
|
-
assert_equal request.get("/?rack.session=#{sid}").body, '{"counter"=>3}'
|
77
|
+
assert_equal request.get("/?rack.session=#{ sid }").body, '{"counter"=>2}'
|
78
|
+
assert_equal request.get("/?rack.session=#{ sid }").body, '{"counter"=>3}'
|
80
79
|
end
|
81
80
|
|
82
81
|
it 'survives nonexistant cookies' do
|
@@ -88,7 +87,7 @@ describe Rack::Session::Redic do
|
|
88
87
|
assert_equal response.body, '{"counter"=>1}'
|
89
88
|
|
90
89
|
cookie = response[Rack::SET_COOKIE][session_match]
|
91
|
-
refute_match
|
90
|
+
refute_match(/#{ bad_cookie }/, cookie)
|
92
91
|
end
|
93
92
|
|
94
93
|
it 'maintains freshness' do
|
@@ -224,10 +223,10 @@ describe Rack::Session::Redic do
|
|
224
223
|
|
225
224
|
res0 = request.get(ROOT)
|
226
225
|
session_id = (cookie = res0[Rack::SET_COOKIE])[session_match, 1]
|
227
|
-
ses0 = redic.storage.
|
226
|
+
ses0 = redic.storage.call('GET', session_id)
|
228
227
|
|
229
228
|
request.get(ROOT, Rack::HTTP_COOKIE => cookie)
|
230
|
-
ses1 = redic.storage.
|
229
|
+
ses1 = redic.storage.call('GET', session_id)
|
231
230
|
|
232
231
|
refute_equal ses1, ses0
|
233
232
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-redic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Lecklider
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -53,21 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: oj
|
56
|
+
name: rubocop
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
59
|
- - ">="
|
@@ -89,21 +75,18 @@ extra_rdoc_files: []
|
|
89
75
|
files:
|
90
76
|
- ".editorconfig"
|
91
77
|
- ".gitignore"
|
78
|
+
- ".rubocop.yml"
|
92
79
|
- CODE_OF_CONDUCT.md
|
93
|
-
- Gemfile
|
94
80
|
- LICENSE.txt
|
95
81
|
- Makefile
|
96
82
|
- README.md
|
97
83
|
- Rakefile
|
84
|
+
- gems.rb
|
98
85
|
- lib/rack/session/redic.rb
|
99
86
|
- rack-redic.gemspec
|
100
87
|
- test/all.rb
|
101
88
|
- test/helper.rb
|
102
89
|
- test/session_redic_test.rb
|
103
|
-
- test/storage_msgpack_test.rb
|
104
|
-
- test/storage_oj_test.rb
|
105
|
-
- test/storage_test.rb
|
106
|
-
- test/support/storage_marshaller_interface.rb
|
107
90
|
homepage: https://github.com/evanleck/rack-redic
|
108
91
|
licenses:
|
109
92
|
- MIT
|
@@ -124,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
107
|
version: '0'
|
125
108
|
requirements: []
|
126
109
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.
|
110
|
+
rubygems_version: 2.7.3
|
128
111
|
signing_key:
|
129
112
|
specification_version: 4
|
130
113
|
summary: Rack::Session in Redis via Redic
|
@@ -132,7 +115,3 @@ test_files:
|
|
132
115
|
- test/all.rb
|
133
116
|
- test/helper.rb
|
134
117
|
- test/session_redic_test.rb
|
135
|
-
- test/storage_msgpack_test.rb
|
136
|
-
- test/storage_oj_test.rb
|
137
|
-
- test/storage_test.rb
|
138
|
-
- test/support/storage_marshaller_interface.rb
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
require 'msgpack'
|
4
|
-
require_relative 'support/storage_marshaller_interface'
|
5
|
-
|
6
|
-
MessagePack::DefaultFactory.register_type(0x00, Symbol)
|
7
|
-
|
8
|
-
module MessagePackMarshaller
|
9
|
-
def dump(object)
|
10
|
-
MessagePack.pack(object)
|
11
|
-
end
|
12
|
-
module_function :dump
|
13
|
-
|
14
|
-
def load(string)
|
15
|
-
MessagePack.unpack(string)
|
16
|
-
end
|
17
|
-
module_function :load
|
18
|
-
end
|
19
|
-
|
20
|
-
describe Rack::Session::Redic::Storage do
|
21
|
-
describe 'using the MessagePack as the marshaller' do
|
22
|
-
include StorageMarshallerInterface
|
23
|
-
|
24
|
-
before do
|
25
|
-
@store = Rack::Session::Redic::Storage.new(nil, MessagePackMarshaller, ENV['REDIS_URL'])
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/test/storage_oj_test.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
require 'oj'
|
4
|
-
require_relative 'support/storage_marshaller_interface'
|
5
|
-
|
6
|
-
describe Rack::Session::Redic::Storage do
|
7
|
-
describe 'using the Oj as the marshaller' do
|
8
|
-
include StorageMarshallerInterface
|
9
|
-
|
10
|
-
before do
|
11
|
-
@store = Rack::Session::Redic::Storage.new(nil, Oj, ENV['REDIS_URL'])
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/test/storage_test.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
require_relative 'support/storage_marshaller_interface'
|
4
|
-
|
5
|
-
describe Rack::Session::Redic::Storage do
|
6
|
-
describe 'using the default marshaller' do
|
7
|
-
include StorageMarshallerInterface
|
8
|
-
|
9
|
-
before do
|
10
|
-
@store = Rack::Session::Redic::Storage.new(nil, Marshal, ENV['REDIS_URL'])
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
module StorageMarshallerInterface
|
4
|
-
def test_returns_nil_for_empty_keys
|
5
|
-
assert_nil @store.get('not-here')
|
6
|
-
end
|
7
|
-
|
8
|
-
def test_saves_objects
|
9
|
-
object = { saved: true }
|
10
|
-
@store.set('saving', object)
|
11
|
-
|
12
|
-
assert_equal @store.get('saving'), object
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_existence_of_keys
|
16
|
-
@store.set('exists', false)
|
17
|
-
|
18
|
-
assert_equal @store.exists?('exists'), true
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_deletes_objects
|
22
|
-
object = { deleted: true }
|
23
|
-
@store.set('deleted', object)
|
24
|
-
|
25
|
-
assert_equal @store.get('deleted'), object
|
26
|
-
@store.delete('deleted')
|
27
|
-
|
28
|
-
assert_nil @store.get('deleted')
|
29
|
-
end
|
30
|
-
end
|