Skip to content

Commit e6ff873

Browse files
andrehjrandrew
authored andcommitted
Rewrite CookieAdapter to work with Rack::Request and Rack::Response directly (#490)
1 parent b1714e5 commit e6ff873

2 files changed

Lines changed: 25 additions & 17 deletions

File tree

lib/split/persistence/cookie_adapter.rb

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@ module Persistence
66
class CookieAdapter
77

88
def initialize(context)
9-
@cookies = context.send(:cookies)
9+
@request, @response = context.request, context.response
10+
@cookies = @request.cookies
1011
@expires = Time.now + cookie_length_config
1112
end
1213

1314
def [](key)
14-
hash[key]
15+
hash[key.to_s]
1516
end
1617

1718
def []=(key, value)
18-
set_cookie(hash.merge(key => value))
19+
set_cookie(hash.merge!(key.to_s => value))
1920
end
2021

2122
def delete(key)
22-
set_cookie(hash.tap { |h| h.delete(key) })
23+
set_cookie(hash.tap { |h| h.delete(key.to_s) })
2324
end
2425

2526
def keys
@@ -28,22 +29,25 @@ def keys
2829

2930
private
3031

31-
def set_cookie(value)
32-
@cookies[:split] = {
33-
:value => JSON.generate(value),
34-
:expires => @expires
35-
}
32+
def set_cookie(value = {})
33+
@response.set_cookie :split.to_s, default_options.merge(value: JSON.generate(value))
34+
end
35+
36+
def default_options
37+
{ expires: @expires, path: '/' }
3638
end
3739

3840
def hash
39-
if @cookies[:split]
40-
begin
41-
JSON.parse(@cookies[:split])
42-
rescue JSON::ParserError
41+
@hash ||= begin
42+
if cookies = @cookies[:split.to_s]
43+
begin
44+
JSON.parse(cookies)
45+
rescue JSON::ParserError
46+
{}
47+
end
48+
else
4349
{}
4450
end
45-
else
46-
{}
4751
end
4852
end
4953

spec/persistence/cookie_adapter_spec.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
# frozen_string_literal: true
22
require "spec_helper"
3+
require 'rack/test'
34

45
describe Split::Persistence::CookieAdapter do
56

6-
let(:context) { double(:cookies => CookiesMock.new) }
7+
let(:env) { Rack::MockRequest.env_for("http://example.com:8080/") }
8+
let(:request) { Rack::Request.new(env) }
9+
let(:response) { Rack::MockResponse.new(200, {}, "") }
10+
let(:context) { double(request: request, response: response) }
711
subject { Split::Persistence::CookieAdapter.new(context) }
812

913
describe "#[] and #[]=" do
@@ -30,7 +34,7 @@
3034
end
3135

3236
it "handles invalid JSON" do
33-
context.cookies[:split] = { :value => '{"foo":2,', :expires => Time.now }
37+
context.request.cookies[:split] = { :value => '{"foo":2,', :expires => Time.now }
3438
expect(subject["my_key"]).to be_nil
3539
subject["my_key"] = "my_value"
3640
expect(subject["my_key"]).to eq("my_value")

0 commit comments

Comments
 (0)