flipper 0.10.2 → 0.11.0.beta1
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 +4 -4
- data/.rubocop.yml +42 -0
- data/.rubocop_todo.yml +188 -0
- data/Changelog.md +10 -0
- data/Gemfile +6 -3
- data/README.md +4 -3
- data/Rakefile +13 -13
- data/docs/Adapters.md +2 -1
- data/docs/DockerCompose.md +6 -3
- data/docs/Gates.md +25 -3
- data/docs/Optimization.md +27 -5
- data/docs/api/README.md +73 -32
- data/docs/http/README.md +34 -0
- data/docs/read-only/README.md +22 -0
- data/examples/percentage_of_actors_group.rb +49 -0
- data/flipper.gemspec +15 -15
- data/lib/flipper.rb +2 -5
- data/lib/flipper/adapter.rb +10 -0
- data/lib/flipper/adapters/http.rb +147 -0
- data/lib/flipper/adapters/http/client.rb +83 -0
- data/lib/flipper/adapters/http/error.rb +14 -0
- data/lib/flipper/adapters/instrumented.rb +36 -36
- data/lib/flipper/adapters/memoizable.rb +2 -6
- data/lib/flipper/adapters/memory.rb +10 -9
- data/lib/flipper/adapters/operation_logger.rb +1 -1
- data/lib/flipper/adapters/pstore.rb +12 -11
- data/lib/flipper/adapters/read_only.rb +6 -6
- data/lib/flipper/dsl.rb +1 -3
- data/lib/flipper/feature.rb +11 -16
- data/lib/flipper/gate.rb +3 -3
- data/lib/flipper/gate_values.rb +6 -6
- data/lib/flipper/gates/group.rb +2 -2
- data/lib/flipper/gates/percentage_of_actors.rb +2 -2
- data/lib/flipper/instrumentation/log_subscriber.rb +2 -4
- data/lib/flipper/instrumentation/metriks.rb +1 -1
- data/lib/flipper/instrumentation/statsd.rb +1 -1
- data/lib/flipper/instrumentation/statsd_subscriber.rb +1 -3
- data/lib/flipper/instrumentation/subscriber.rb +11 -10
- data/lib/flipper/instrumenters/memory.rb +1 -5
- data/lib/flipper/instrumenters/noop.rb +1 -1
- data/lib/flipper/middleware/memoizer.rb +11 -27
- data/lib/flipper/middleware/setup_env.rb +44 -0
- data/lib/flipper/registry.rb +8 -10
- data/lib/flipper/spec/shared_adapter_specs.rb +45 -67
- data/lib/flipper/test/shared_adapter_test.rb +25 -31
- data/lib/flipper/typecast.rb +2 -2
- data/lib/flipper/types/actor.rb +2 -4
- data/lib/flipper/types/group.rb +1 -1
- data/lib/flipper/types/percentage.rb +2 -1
- data/lib/flipper/version.rb +1 -1
- data/spec/fixtures/feature.json +31 -0
- data/spec/flipper/adapters/http_spec.rb +148 -0
- data/spec/flipper/adapters/instrumented_spec.rb +20 -20
- data/spec/flipper/adapters/memoizable_spec.rb +59 -59
- data/spec/flipper/adapters/operation_logger_spec.rb +16 -16
- data/spec/flipper/adapters/pstore_spec.rb +6 -6
- data/spec/flipper/adapters/read_only_spec.rb +28 -34
- data/spec/flipper/dsl_spec.rb +73 -84
- data/spec/flipper/feature_check_context_spec.rb +27 -27
- data/spec/flipper/feature_spec.rb +186 -196
- data/spec/flipper/gate_spec.rb +11 -11
- data/spec/flipper/gate_values_spec.rb +46 -45
- data/spec/flipper/gates/actor_spec.rb +2 -2
- data/spec/flipper/gates/boolean_spec.rb +24 -23
- data/spec/flipper/gates/group_spec.rb +19 -19
- data/spec/flipper/gates/percentage_of_actors_spec.rb +10 -10
- data/spec/flipper/gates/percentage_of_time_spec.rb +2 -2
- data/spec/flipper/instrumentation/log_subscriber_spec.rb +20 -20
- data/spec/flipper/instrumentation/metriks_subscriber_spec.rb +20 -20
- data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +11 -11
- data/spec/flipper/instrumenters/memory_spec.rb +5 -5
- data/spec/flipper/instrumenters/noop_spec.rb +6 -6
- data/spec/flipper/middleware/memoizer_spec.rb +83 -100
- data/spec/flipper/middleware/setup_env_spec.rb +76 -0
- data/spec/flipper/registry_spec.rb +35 -39
- data/spec/flipper/typecast_spec.rb +18 -18
- data/spec/flipper/types/actor_spec.rb +30 -29
- data/spec/flipper/types/boolean_spec.rb +8 -8
- data/spec/flipper/types/group_spec.rb +28 -28
- data/spec/flipper/types/percentage_spec.rb +14 -14
- data/spec/flipper_spec.rb +61 -54
- data/spec/helper.rb +26 -21
- data/spec/integration_spec.rb +121 -113
- data/spec/support/fake_udp_socket.rb +1 -1
- data/spec/support/spec_helpers.rb +32 -4
- data/test/adapters/pstore_test.rb +3 -3
- data/test/test_helper.rb +1 -1
- metadata +20 -5
@@ -0,0 +1,44 @@
|
|
1
|
+
module Flipper
|
2
|
+
module Middleware
|
3
|
+
class SetupEnv
|
4
|
+
# Public: Initializes an instance of the SetEnv middleware. Allows for
|
5
|
+
# lazy initialization of the flipper instance being set in the env by
|
6
|
+
# providing a block.
|
7
|
+
#
|
8
|
+
# app - The app this middleware is included in.
|
9
|
+
# flipper_or_block - The Flipper::DSL instance or a block that yields a
|
10
|
+
# Flipper::DSL instance to use for all operations.
|
11
|
+
#
|
12
|
+
# Examples
|
13
|
+
#
|
14
|
+
# flipper = Flipper.new(...)
|
15
|
+
#
|
16
|
+
# # using with a normal flipper instance
|
17
|
+
# use Flipper::Middleware::SetEnv, flipper
|
18
|
+
#
|
19
|
+
# # using with a block that yields a flipper instance
|
20
|
+
# use Flipper::Middleware::SetEnv, lambda { Flipper.new(...) }
|
21
|
+
#
|
22
|
+
def initialize(app, flipper_or_block)
|
23
|
+
@app = app
|
24
|
+
|
25
|
+
if flipper_or_block.respond_to?(:call)
|
26
|
+
@flipper_block = flipper_or_block
|
27
|
+
else
|
28
|
+
@flipper = flipper_or_block
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def call(env)
|
33
|
+
env['flipper'.freeze] ||= flipper
|
34
|
+
@app.call(env)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def flipper
|
40
|
+
@flipper ||= @flipper_block.call
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/flipper/registry.rb
CHANGED
@@ -34,29 +34,27 @@ module Flipper
|
|
34
34
|
def add(key, value)
|
35
35
|
key = key.to_sym
|
36
36
|
|
37
|
-
@mutex.synchronize
|
37
|
+
@mutex.synchronize do
|
38
38
|
if @source[key]
|
39
39
|
raise DuplicateKey, "#{key} is already registered"
|
40
40
|
else
|
41
41
|
@source[key] = value
|
42
42
|
end
|
43
|
-
|
43
|
+
end
|
44
44
|
end
|
45
45
|
|
46
46
|
def get(key)
|
47
47
|
key = key.to_sym
|
48
|
-
@mutex.synchronize
|
49
|
-
@source
|
50
|
-
|
51
|
-
}
|
52
|
-
}
|
48
|
+
@mutex.synchronize do
|
49
|
+
@source[key]
|
50
|
+
end
|
53
51
|
end
|
54
52
|
|
55
53
|
def key?(key)
|
56
54
|
key = key.to_sym
|
57
|
-
@mutex.synchronize
|
58
|
-
@source.
|
59
|
-
|
55
|
+
@mutex.synchronize do
|
56
|
+
@source.key?(key)
|
57
|
+
end
|
60
58
|
end
|
61
59
|
|
62
60
|
def each(&block)
|
@@ -10,46 +10,36 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
10
10
|
let(:group_gate) { feature.gate(:group) }
|
11
11
|
let(:actor_gate) { feature.gate(:actor) }
|
12
12
|
let(:actors_gate) { feature.gate(:percentage_of_actors) }
|
13
|
-
let(:time_gate)
|
14
|
-
|
15
|
-
let(:default_config) {
|
16
|
-
{
|
17
|
-
:boolean => nil,
|
18
|
-
:groups => Set.new,
|
19
|
-
:actors => Set.new,
|
20
|
-
:percentage_of_actors => nil,
|
21
|
-
:percentage_of_time => nil,
|
22
|
-
}
|
23
|
-
}
|
13
|
+
let(:time_gate) { feature.gate(:percentage_of_time) }
|
24
14
|
|
25
15
|
before do
|
26
|
-
Flipper.register(:admins)
|
16
|
+
Flipper.register(:admins) do |actor|
|
27
17
|
actor.respond_to?(:admin?) && actor.admin?
|
28
|
-
|
18
|
+
end
|
29
19
|
|
30
|
-
Flipper.register(:early_access)
|
20
|
+
Flipper.register(:early_access) do |actor|
|
31
21
|
actor.respond_to?(:early_access?) && actor.early_access?
|
32
|
-
|
22
|
+
end
|
33
23
|
end
|
34
24
|
|
35
25
|
after do
|
36
26
|
Flipper.unregister_groups
|
37
27
|
end
|
38
28
|
|
39
|
-
it
|
40
|
-
expect(subject.name).
|
29
|
+
it 'has name that is a symbol' do
|
30
|
+
expect(subject.name).not_to be_nil
|
41
31
|
expect(subject.name).to be_instance_of(Symbol)
|
42
32
|
end
|
43
33
|
|
44
|
-
it
|
34
|
+
it 'has included the flipper adapter module' do
|
45
35
|
expect(subject.class.ancestors).to include(Flipper::Adapter)
|
46
36
|
end
|
47
37
|
|
48
|
-
it
|
49
|
-
expect(subject.get(feature)).to eq(default_config)
|
38
|
+
it 'returns correct default values for the gates if none are enabled' do
|
39
|
+
expect(subject.get(feature)).to eq(subject.default_config)
|
50
40
|
end
|
51
41
|
|
52
|
-
it
|
42
|
+
it 'can enable, disable and get value for boolean gate' do
|
53
43
|
expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
|
54
44
|
|
55
45
|
result = subject.get(feature)
|
@@ -61,26 +51,20 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
61
51
|
expect(result[:boolean]).to eq(nil)
|
62
52
|
end
|
63
53
|
|
64
|
-
it
|
65
|
-
|
54
|
+
it 'fully disables all enabled things when boolean gate disabled' do
|
55
|
+
actor22 = actor_class.new('22')
|
66
56
|
expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
|
67
57
|
expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
|
68
|
-
expect(subject.enable(feature, actor_gate, flipper.actor(
|
58
|
+
expect(subject.enable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
|
69
59
|
expect(subject.enable(feature, actors_gate, flipper.actors(25))).to eq(true)
|
70
60
|
expect(subject.enable(feature, time_gate, flipper.time(45))).to eq(true)
|
71
61
|
|
72
62
|
expect(subject.disable(feature, boolean_gate, flipper.boolean(false))).to eq(true)
|
73
63
|
|
74
|
-
expect(subject.get(feature)).to eq(
|
75
|
-
:boolean => nil,
|
76
|
-
:groups => Set.new,
|
77
|
-
:actors => Set.new,
|
78
|
-
:percentage_of_actors => nil,
|
79
|
-
:percentage_of_time => nil,
|
80
|
-
})
|
64
|
+
expect(subject.get(feature)).to eq(subject.default_config)
|
81
65
|
end
|
82
66
|
|
83
|
-
it
|
67
|
+
it 'can enable, disable and get value for group gate' do
|
84
68
|
expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
|
85
69
|
expect(subject.enable(feature, group_gate, flipper.group(:early_access))).to eq(true)
|
86
70
|
|
@@ -96,17 +80,17 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
96
80
|
expect(result[:groups]).to eq(Set.new)
|
97
81
|
end
|
98
82
|
|
99
|
-
it
|
100
|
-
|
83
|
+
it 'can enable, disable and get value for actor gate' do
|
84
|
+
actor22 = actor_class.new('22')
|
101
85
|
actor_asdf = actor_class.new('asdf')
|
102
86
|
|
103
|
-
expect(subject.enable(feature, actor_gate, flipper.actor(
|
87
|
+
expect(subject.enable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
|
104
88
|
expect(subject.enable(feature, actor_gate, flipper.actor(actor_asdf))).to eq(true)
|
105
89
|
|
106
90
|
result = subject.get(feature)
|
107
91
|
expect(result[:actors]).to eq(Set['22', 'asdf'])
|
108
92
|
|
109
|
-
expect(subject.disable(feature, actor_gate, flipper.actor(
|
93
|
+
expect(subject.disable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
|
110
94
|
result = subject.get(feature)
|
111
95
|
expect(result[:actors]).to eq(Set['asdf'])
|
112
96
|
|
@@ -115,7 +99,7 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
115
99
|
expect(result[:actors]).to eq(Set.new)
|
116
100
|
end
|
117
101
|
|
118
|
-
it
|
102
|
+
it 'can enable, disable and get value for percentage of actors gate' do
|
119
103
|
expect(subject.enable(feature, actors_gate, flipper.actors(15))).to eq(true)
|
120
104
|
result = subject.get(feature)
|
121
105
|
expect(result[:percentage_of_actors]).to eq('15')
|
@@ -125,7 +109,7 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
125
109
|
expect(result[:percentage_of_actors]).to eq('0')
|
126
110
|
end
|
127
111
|
|
128
|
-
it
|
112
|
+
it 'can enable percentage of actors gate many times and consistently return values' do
|
129
113
|
(1..100).each do |percentage|
|
130
114
|
expect(subject.enable(feature, actors_gate, flipper.actors(percentage))).to eq(true)
|
131
115
|
result = subject.get(feature)
|
@@ -133,7 +117,7 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
133
117
|
end
|
134
118
|
end
|
135
119
|
|
136
|
-
it
|
120
|
+
it 'can disable percentage of actors gate many times and consistently return values' do
|
137
121
|
(1..100).each do |percentage|
|
138
122
|
expect(subject.disable(feature, actors_gate, flipper.actors(percentage))).to eq(true)
|
139
123
|
result = subject.get(feature)
|
@@ -141,7 +125,7 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
141
125
|
end
|
142
126
|
end
|
143
127
|
|
144
|
-
it
|
128
|
+
it 'can enable, disable and get value for percentage of time gate' do
|
145
129
|
expect(subject.enable(feature, time_gate, flipper.time(10))).to eq(true)
|
146
130
|
result = subject.get(feature)
|
147
131
|
expect(result[:percentage_of_time]).to eq('10')
|
@@ -151,7 +135,7 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
151
135
|
expect(result[:percentage_of_time]).to eq('0')
|
152
136
|
end
|
153
137
|
|
154
|
-
it
|
138
|
+
it 'can enable percentage of time gate many times and consistently return values' do
|
155
139
|
(1..100).each do |percentage|
|
156
140
|
expect(subject.enable(feature, time_gate, flipper.time(percentage))).to eq(true)
|
157
141
|
result = subject.get(feature)
|
@@ -159,7 +143,7 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
159
143
|
end
|
160
144
|
end
|
161
145
|
|
162
|
-
it
|
146
|
+
it 'can disable percentage of time gate many times and consistently return values' do
|
163
147
|
(1..100).each do |percentage|
|
164
148
|
expect(subject.disable(feature, time_gate, flipper.time(percentage))).to eq(true)
|
165
149
|
result = subject.get(feature)
|
@@ -167,37 +151,37 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
167
151
|
end
|
168
152
|
end
|
169
153
|
|
170
|
-
it
|
154
|
+
it 'converts boolean value to a string' do
|
171
155
|
expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
|
172
156
|
result = subject.get(feature)
|
173
157
|
expect(result[:boolean]).to eq('true')
|
174
158
|
end
|
175
159
|
|
176
|
-
it
|
160
|
+
it 'converts the actor value to a string' do
|
177
161
|
expect(subject.enable(feature, actor_gate, flipper.actor(actor_class.new(22)))).to eq(true)
|
178
162
|
result = subject.get(feature)
|
179
163
|
expect(result[:actors]).to eq(Set['22'])
|
180
164
|
end
|
181
165
|
|
182
|
-
it
|
166
|
+
it 'converts group value to a string' do
|
183
167
|
expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
|
184
168
|
result = subject.get(feature)
|
185
169
|
expect(result[:groups]).to eq(Set['admins'])
|
186
170
|
end
|
187
171
|
|
188
|
-
it
|
172
|
+
it 'converts percentage of time integer value to a string' do
|
189
173
|
expect(subject.enable(feature, time_gate, flipper.time(10))).to eq(true)
|
190
174
|
result = subject.get(feature)
|
191
175
|
expect(result[:percentage_of_time]).to eq('10')
|
192
176
|
end
|
193
177
|
|
194
|
-
it
|
178
|
+
it 'converts percentage of actors integer value to a string' do
|
195
179
|
expect(subject.enable(feature, actors_gate, flipper.actors(10))).to eq(true)
|
196
180
|
result = subject.get(feature)
|
197
181
|
expect(result[:percentage_of_actors]).to eq('10')
|
198
182
|
end
|
199
183
|
|
200
|
-
it
|
184
|
+
it 'can add, remove and list known features' do
|
201
185
|
expect(subject.features).to eq(Set.new)
|
202
186
|
|
203
187
|
expect(subject.add(flipper[:stats])).to eq(true)
|
@@ -213,46 +197,40 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
213
197
|
expect(subject.features).to eq(Set.new)
|
214
198
|
end
|
215
199
|
|
216
|
-
it
|
217
|
-
|
200
|
+
it 'clears all the gate values for the feature on remove' do
|
201
|
+
actor22 = actor_class.new('22')
|
218
202
|
expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
|
219
203
|
expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
|
220
|
-
expect(subject.enable(feature, actor_gate, flipper.actor(
|
204
|
+
expect(subject.enable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
|
221
205
|
expect(subject.enable(feature, actors_gate, flipper.actors(25))).to eq(true)
|
222
206
|
expect(subject.enable(feature, time_gate, flipper.time(45))).to eq(true)
|
223
207
|
|
224
208
|
expect(subject.remove(feature)).to eq(true)
|
225
209
|
|
226
|
-
expect(subject.get(feature)).to eq(
|
227
|
-
:boolean => nil,
|
228
|
-
:groups => Set.new,
|
229
|
-
:actors => Set.new,
|
230
|
-
:percentage_of_actors => nil,
|
231
|
-
:percentage_of_time => nil,
|
232
|
-
})
|
210
|
+
expect(subject.get(feature)).to eq(subject.default_config)
|
233
211
|
end
|
234
212
|
|
235
|
-
it
|
236
|
-
|
213
|
+
it 'can clear all the gate values for a feature' do
|
214
|
+
actor22 = actor_class.new('22')
|
237
215
|
subject.add(feature)
|
238
216
|
expect(subject.features).to include(feature.key)
|
239
217
|
|
240
218
|
expect(subject.enable(feature, boolean_gate, flipper.boolean)).to eq(true)
|
241
219
|
expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
|
242
|
-
expect(subject.enable(feature, actor_gate, flipper.actor(
|
220
|
+
expect(subject.enable(feature, actor_gate, flipper.actor(actor22))).to eq(true)
|
243
221
|
expect(subject.enable(feature, actors_gate, flipper.actors(25))).to eq(true)
|
244
222
|
expect(subject.enable(feature, time_gate, flipper.time(45))).to eq(true)
|
245
223
|
|
246
224
|
expect(subject.clear(feature)).to eq(true)
|
247
225
|
expect(subject.features).to include(feature.key)
|
248
|
-
expect(subject.get(feature)).to eq(default_config)
|
226
|
+
expect(subject.get(feature)).to eq(subject.default_config)
|
249
227
|
end
|
250
228
|
|
251
|
-
it
|
229
|
+
it 'does not complain clearing a feature that does not exist in adapter' do
|
252
230
|
expect(subject.clear(flipper[:stats])).to eq(true)
|
253
231
|
end
|
254
232
|
|
255
|
-
it
|
233
|
+
it 'can get multiple features' do
|
256
234
|
expect(subject.add(flipper[:stats])).to eq(true)
|
257
235
|
expect(subject.enable(flipper[:stats], boolean_gate, flipper.boolean)).to eq(true)
|
258
236
|
|
@@ -262,8 +240,8 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
262
240
|
expect(result).to be_instance_of(Hash)
|
263
241
|
|
264
242
|
stats, search, other = result.values
|
265
|
-
expect(stats).to eq(default_config.merge(boolean:
|
266
|
-
expect(search).to eq(default_config)
|
267
|
-
expect(other).to eq(default_config)
|
243
|
+
expect(stats).to eq(subject.default_config.merge(boolean: 'true'))
|
244
|
+
expect(search).to eq(subject.default_config)
|
245
|
+
expect(other).to eq(subject.default_config)
|
268
246
|
end
|
269
247
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:disable Metrics/ModuleLength
|
1
2
|
module Flipper
|
2
3
|
module Test
|
3
4
|
module SharedAdapterTests
|
@@ -9,24 +10,16 @@ module Flipper
|
|
9
10
|
@boolean_gate = @feature.gate(:boolean)
|
10
11
|
@group_gate = @feature.gate(:group)
|
11
12
|
@actor_gate = @feature.gate(:actor)
|
12
|
-
@actors_gate =
|
13
|
-
@time_gate =
|
14
|
-
|
15
|
-
@default_config = {
|
16
|
-
:boolean => nil,
|
17
|
-
:groups => Set.new,
|
18
|
-
:actors => Set.new,
|
19
|
-
:percentage_of_actors => nil,
|
20
|
-
:percentage_of_time => nil,
|
21
|
-
}
|
13
|
+
@actors_gate = @feature.gate(:percentage_of_actors)
|
14
|
+
@time_gate = @feature.gate(:percentage_of_time)
|
22
15
|
|
23
16
|
Flipper.register(:admins) do |actor|
|
24
17
|
actor.respond_to?(:admin?) && actor.admin?
|
25
18
|
end
|
26
19
|
|
27
|
-
Flipper.register(:early_access)
|
20
|
+
Flipper.register(:early_access) do |actor|
|
28
21
|
actor.respond_to?(:early_access?) && actor.early_access?
|
29
|
-
|
22
|
+
end
|
30
23
|
end
|
31
24
|
|
32
25
|
def teardown
|
@@ -35,16 +28,16 @@ module Flipper
|
|
35
28
|
end
|
36
29
|
|
37
30
|
def test_has_name_that_is_a_symbol
|
38
|
-
refute_empty
|
31
|
+
refute_empty @adapter.name
|
39
32
|
assert_kind_of Symbol, @adapter.name
|
40
33
|
end
|
41
34
|
|
42
35
|
def test_has_included_the_flipper_adapter_module
|
43
|
-
assert_includes
|
36
|
+
assert_includes @adapter.class.ancestors, Flipper::Adapter
|
44
37
|
end
|
45
38
|
|
46
39
|
def test_returns_correct_default_values_for_gates_if_none_are_enabled
|
47
|
-
assert_equal @default_config, @adapter.get(@feature)
|
40
|
+
assert_equal @adapter.default_config, @adapter.get(@feature)
|
48
41
|
end
|
49
42
|
|
50
43
|
def test_can_enable_disable_and_get_value_for_boolean_gate
|
@@ -55,14 +48,14 @@ module Flipper
|
|
55
48
|
end
|
56
49
|
|
57
50
|
def test_fully_disables_all_enabled_things_when_boolean_gate_disabled
|
58
|
-
|
51
|
+
actor22 = @actor_class.new('22')
|
59
52
|
assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
|
60
53
|
assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
|
61
|
-
assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(
|
54
|
+
assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor22))
|
62
55
|
assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(25))
|
63
56
|
assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(45))
|
64
57
|
assert_equal true, @adapter.disable(@feature, @boolean_gate, @flipper.boolean(false))
|
65
|
-
assert_equal @default_config, @adapter.get(@feature)
|
58
|
+
assert_equal @adapter.default_config, @adapter.get(@feature)
|
66
59
|
end
|
67
60
|
|
68
61
|
def test_can_enable_disable_get_value_for_group_gate
|
@@ -82,16 +75,16 @@ module Flipper
|
|
82
75
|
end
|
83
76
|
|
84
77
|
def test_can_enable_disable_and_get_value_for_an_actor_gate
|
85
|
-
|
78
|
+
actor22 = @actor_class.new('22')
|
86
79
|
actor_asdf = @actor_class.new('asdf')
|
87
80
|
|
88
|
-
assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(
|
81
|
+
assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor22))
|
89
82
|
assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor_asdf))
|
90
83
|
|
91
84
|
result = @adapter.get(@feature)
|
92
85
|
assert_equal Set['22', 'asdf'], result[:actors]
|
93
86
|
|
94
|
-
assert true, @adapter.disable(@feature, @actor_gate, @flipper.actor(
|
87
|
+
assert true, @adapter.disable(@feature, @actor_gate, @flipper.actor(actor22))
|
95
88
|
result = @adapter.get(@feature)
|
96
89
|
assert_equal Set['asdf'], result[:actors]
|
97
90
|
|
@@ -159,7 +152,8 @@ module Flipper
|
|
159
152
|
end
|
160
153
|
|
161
154
|
def test_converts_the_actor_value_to_a_string
|
162
|
-
assert_equal true,
|
155
|
+
assert_equal true,
|
156
|
+
@adapter.enable(@feature, @actor_gate, @flipper.actor(@actor_class.new(22)))
|
163
157
|
result = @adapter.get(@feature)
|
164
158
|
assert_equal Set['22'], result[:actors]
|
165
159
|
end
|
@@ -199,32 +193,32 @@ module Flipper
|
|
199
193
|
end
|
200
194
|
|
201
195
|
def test_clears_all_the_gate_values_for_the_feature_on_remove
|
202
|
-
|
196
|
+
actor22 = @actor_class.new('22')
|
203
197
|
assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
|
204
198
|
assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
|
205
|
-
assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(
|
199
|
+
assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor22))
|
206
200
|
assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(25))
|
207
201
|
assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(45))
|
208
202
|
|
209
203
|
assert_equal true, @adapter.remove(@feature)
|
210
204
|
|
211
|
-
assert_equal @default_config, @adapter.get(@feature)
|
205
|
+
assert_equal @adapter.default_config, @adapter.get(@feature)
|
212
206
|
end
|
213
207
|
|
214
208
|
def test_can_clear_all_the_gate_values_for_a_feature
|
215
|
-
|
209
|
+
actor22 = @actor_class.new('22')
|
216
210
|
@adapter.add(@feature)
|
217
211
|
assert_includes @adapter.features, @feature.key
|
218
212
|
|
219
213
|
assert_equal true, @adapter.enable(@feature, @boolean_gate, @flipper.boolean)
|
220
214
|
assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
|
221
|
-
assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(
|
215
|
+
assert_equal true, @adapter.enable(@feature, @actor_gate, @flipper.actor(actor22))
|
222
216
|
assert_equal true, @adapter.enable(@feature, @actors_gate, @flipper.actors(25))
|
223
217
|
assert_equal true, @adapter.enable(@feature, @time_gate, @flipper.time(45))
|
224
218
|
|
225
219
|
assert_equal true, @adapter.clear(@feature)
|
226
220
|
assert_includes @adapter.features, @feature.key
|
227
|
-
assert_equal @default_config, @adapter.get(@feature)
|
221
|
+
assert_equal @adapter.default_config, @adapter.get(@feature)
|
228
222
|
end
|
229
223
|
|
230
224
|
def test_does_not_complain_clearing_a_feature_that_does_not_exist_in_adapter
|
@@ -240,9 +234,9 @@ module Flipper
|
|
240
234
|
assert_instance_of Hash, result
|
241
235
|
|
242
236
|
stats, search, other = result.values
|
243
|
-
assert_equal @default_config.merge(boolean:
|
244
|
-
assert_equal @default_config, search
|
245
|
-
assert_equal @default_config, other
|
237
|
+
assert_equal @adapter.default_config.merge(boolean: 'true'), stats
|
238
|
+
assert_equal @adapter.default_config, search
|
239
|
+
assert_equal @adapter.default_config, other
|
246
240
|
end
|
247
241
|
end
|
248
242
|
end
|