Skip to content

Commit 381ab80

Browse files
committed
Improve Dual Adapter
1 parent e7ab0e7 commit 381ab80

File tree

2 files changed

+104
-76
lines changed

2 files changed

+104
-76
lines changed
Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
# frozen_string_literal: true
22

3-
require 'forwardable'
4-
53
module Split
64
module Persistence
75
class DualAdapter
8-
extend Forwardable
9-
def_delegators :@adapter, :keys, :[], :[]=, :delete
6+
def self.with_config(options={})
7+
self.config.merge!(options)
8+
self
9+
end
10+
11+
def self.config
12+
@config ||= {}
13+
end
1014

1115
def initialize(context)
1216
if logged_in = self.class.config[:logged_in]
@@ -22,22 +26,28 @@ def initialize(context)
2226
raise "Please configure :logged_out_adapter"
2327
end
2428

25-
if logged_in.call(context)
26-
@adapter = logged_in_adapter.new(context)
27-
else
28-
@adapter = logged_out_adapter.new(context)
29-
end
29+
@logged_in = logged_in.call(context)
30+
@logged_in_adapter = logged_in_adapter.new(context)
31+
@logged_out_adapter = logged_out_adapter.new(context)
3032
end
3133

32-
def self.with_config(options={})
33-
self.config.merge!(options)
34-
self
34+
def keys
35+
@logged_in_adapter.keys + @logged_out_adapter.keys
3536
end
3637

37-
def self.config
38-
@config ||= {}
38+
def [](key)
39+
@logged_in && @logged_in_adapter[key] || @logged_out_adapter[key]
40+
end
41+
42+
def []=(key, value)
43+
@logged_in_adapter[key] = value if @logged_in
44+
@logged_out_adapter[key] = value
3945
end
4046

47+
def delete(key)
48+
@logged_in_adapter.delete(key)
49+
@logged_out_adapter.delete(key)
50+
end
4151
end
4252
end
4353
end
Lines changed: 80 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,120 @@
11
# frozen_string_literal: true
2-
require "spec_helper"
32

4-
describe Split::Persistence::DualAdapter do
3+
require 'spec_helper'
54

6-
let(:context){ "some context" }
5+
describe Split::Persistence::DualAdapter do
6+
let(:context) { 'some context' }
77

8-
let(:just_adapter){ Class.new }
9-
let(:selected_adapter_instance){ double }
10-
let(:selected_adapter){
8+
let(:logged_in_adapter_instance) { double }
9+
let(:logged_in_adapter) do
1110
c = Class.new
12-
expect(c).to receive(:new){ selected_adapter_instance }
11+
allow(c).to receive(:new) { logged_in_adapter_instance }
1312
c
14-
}
15-
let(:not_selected_adapter){
13+
end
14+
let(:logged_out_adapter_instance) { double }
15+
let(:logged_out_adapter) do
1616
c = Class.new
17-
expect(c).not_to receive(:new)
17+
allow(c).to receive(:new) { logged_out_adapter_instance }
1818
c
19-
}
19+
end
2020

21-
shared_examples_for "forwarding calls" do
22-
it "#[]=" do
23-
expect(selected_adapter_instance).to receive(:[]=).with('my_key', 'my_value')
24-
expect_any_instance_of(not_selected_adapter).not_to receive(:[]=)
25-
subject["my_key"] = "my_value"
21+
context 'when logged in' do
22+
subject do
23+
described_class.with_config(
24+
logged_in: lambda { |context| true },
25+
logged_in_adapter: logged_in_adapter,
26+
logged_out_adapter: logged_out_adapter
27+
).new(context)
2628
end
2729

28-
it "#[]" do
29-
expect(selected_adapter_instance).to receive(:[]).with('my_key'){'my_value'}
30-
expect_any_instance_of(not_selected_adapter).not_to receive(:[])
31-
expect(subject["my_key"]).to eq('my_value')
30+
it '#[]=' do
31+
expect(logged_in_adapter_instance).to receive(:[]=).with('my_key', 'my_value')
32+
expect(logged_out_adapter_instance).to receive(:[]=).with('my_key', 'my_value')
33+
subject['my_key'] = 'my_value'
3234
end
3335

34-
it "#delete" do
35-
expect(selected_adapter_instance).to receive(:delete).with('my_key'){'my_value'}
36-
expect_any_instance_of(not_selected_adapter).not_to receive(:delete)
37-
expect(subject.delete("my_key")).to eq('my_value')
36+
it '#[]' do
37+
expect(logged_in_adapter_instance).to receive(:[]).with('my_key') { 'my_value' }
38+
expect_any_instance_of(logged_out_adapter).not_to receive(:[])
39+
expect(subject['my_key']).to eq('my_value')
3840
end
3941

40-
it "#keys" do
41-
expect(selected_adapter_instance).to receive(:keys){'my_value'}
42-
expect_any_instance_of(not_selected_adapter).not_to receive(:keys)
43-
expect(subject.keys).to eq('my_value')
42+
it '#delete' do
43+
expect(logged_in_adapter_instance).to receive(:delete).with('my_key') { 'my_value' }
44+
expect(logged_out_adapter_instance).to receive(:delete).with('my_key') { 'my_value' }
45+
expect(subject.delete('my_key')).to eq('my_value')
4446
end
45-
end
4647

47-
context "when logged in" do
48-
subject {
49-
described_class.with_config(
50-
logged_in: lambda { |context| true },
51-
logged_in_adapter: selected_adapter,
52-
logged_out_adapter: not_selected_adapter
53-
).new(context)
54-
}
55-
56-
it_should_behave_like "forwarding calls"
48+
it '#keys' do
49+
expect(logged_in_adapter_instance).to receive(:keys) { ['my_value'] }
50+
expect(logged_out_adapter_instance).to receive(:keys) { ['my_value'] }
51+
expect(subject.keys).to eq(['my_value', 'my_value'])
52+
end
5753
end
5854

59-
context "when not logged in" do
60-
subject {
55+
context 'when logged out' do
56+
subject do
6157
described_class.with_config(
6258
logged_in: lambda { |context| false },
63-
logged_in_adapter: not_selected_adapter,
64-
logged_out_adapter: selected_adapter
65-
).new(context)
66-
}
59+
logged_in_adapter: logged_in_adapter,
60+
logged_out_adapter: logged_out_adapter
61+
).new(context)
62+
end
6763

68-
it_should_behave_like "forwarding calls"
64+
it '#[]=' do
65+
expect_any_instance_of(logged_in_adapter).not_to receive(:[])
66+
expect(logged_out_adapter_instance).to receive(:[]=).with('my_key', 'my_value')
67+
subject['my_key'] = 'my_value'
68+
end
69+
70+
it '#[]' do
71+
expect_any_instance_of(logged_in_adapter).not_to receive(:[])
72+
expect(logged_out_adapter_instance).to receive(:[]).with('my_key') { 'my_value' }
73+
expect(subject['my_key']).to eq('my_value')
74+
end
75+
76+
it '#delete' do
77+
expect(logged_in_adapter_instance).to receive(:delete).with('my_key') { 'my_value' }
78+
expect(logged_out_adapter_instance).to receive(:delete).with('my_key') { 'my_value' }
79+
expect(subject.delete('my_key')).to eq('my_value')
80+
end
81+
82+
it '#keys' do
83+
expect(logged_in_adapter_instance).to receive(:keys) { ['my_value'] }
84+
expect(logged_out_adapter_instance).to receive(:keys) { ['my_value'] }
85+
expect(subject.keys).to eq(['my_value', 'my_value'])
86+
end
6987
end
7088

71-
describe "when errors in config" do
72-
before{
73-
described_class.config.clear
74-
}
75-
let(:some_proc){ ->{} }
76-
it "when no logged in adapter" do
89+
describe 'when errors in config' do
90+
before { described_class.config.clear }
91+
let(:some_proc) { ->{} }
92+
93+
it 'when no logged in adapter' do
7794
expect{
7895
described_class.with_config(
7996
logged_in: some_proc,
80-
logged_out_adapter: just_adapter
81-
).new(context)
97+
logged_out_adapter: logged_out_adapter
98+
).new(context)
8299
}.to raise_error(StandardError, /:logged_in_adapter/)
83100
end
84-
it "when no logged out adapter" do
101+
102+
it 'when no logged out adapter' do
85103
expect{
86104
described_class.with_config(
87105
logged_in: some_proc,
88-
logged_in_adapter: just_adapter
89-
).new(context)
106+
logged_in_adapter: logged_in_adapter
107+
).new(context)
90108
}.to raise_error(StandardError, /:logged_out_adapter/)
91109
end
92-
it "when no logged in detector" do
110+
111+
it 'when no logged in detector' do
93112
expect{
94113
described_class.with_config(
95-
logged_in_adapter: just_adapter,
96-
logged_out_adapter: just_adapter
97-
).new(context)
114+
logged_in_adapter: logged_in_adapter,
115+
logged_out_adapter: logged_out_adapter
116+
).new(context)
98117
}.to raise_error(StandardError, /:logged_in$/)
99118
end
100119
end
101-
102120
end

0 commit comments

Comments
 (0)