flipper 0.28.0 → 1.3.6
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/.github/FUNDING.yml +1 -0
- data/.github/workflows/ci.yml +50 -7
- data/.github/workflows/examples.yml +52 -10
- data/CLAUDE.md +74 -0
- data/Changelog.md +1 -526
- data/Gemfile +17 -8
- data/README.md +31 -27
- data/Rakefile +2 -2
- data/benchmark/typecast_ips.rb +8 -0
- data/docs/images/banner.jpg +0 -0
- data/docs/images/flipper_cloud.png +0 -0
- data/examples/cloud/app.ru +12 -0
- data/examples/cloud/backoff_policy.rb +13 -0
- data/examples/cloud/basic.rb +22 -0
- data/examples/cloud/cloud_setup.rb +20 -0
- data/examples/cloud/forked.rb +36 -0
- data/examples/cloud/import.rb +17 -0
- data/examples/cloud/threaded.rb +33 -0
- data/examples/dsl.rb +0 -14
- data/examples/expressions.rb +213 -0
- data/examples/mirroring.rb +59 -0
- data/examples/strict.rb +18 -0
- data/exe/flipper +5 -0
- data/flipper-cloud.gemspec +19 -0
- data/flipper.gemspec +8 -4
- data/lib/flipper/actor.rb +6 -3
- data/lib/flipper/adapter.rb +10 -0
- data/lib/flipper/adapter_builder.rb +44 -0
- data/lib/flipper/adapters/actor_limit.rb +28 -0
- data/lib/flipper/adapters/cache_base.rb +143 -0
- data/lib/flipper/adapters/dual_write.rb +1 -3
- data/lib/flipper/adapters/failover.rb +0 -4
- data/lib/flipper/adapters/failsafe.rb +0 -4
- data/lib/flipper/adapters/http/client.rb +40 -12
- data/lib/flipper/adapters/http/error.rb +2 -2
- data/lib/flipper/adapters/http.rb +19 -14
- data/lib/flipper/adapters/instrumented.rb +0 -4
- data/lib/flipper/adapters/memoizable.rb +14 -19
- data/lib/flipper/adapters/memory.rb +37 -19
- data/lib/flipper/adapters/operation_logger.rb +18 -92
- data/lib/flipper/adapters/poll.rb +16 -3
- data/lib/flipper/adapters/pstore.rb +17 -11
- data/lib/flipper/adapters/read_only.rb +8 -41
- data/lib/flipper/adapters/strict.rb +45 -0
- data/lib/flipper/adapters/sync/feature_synchronizer.rb +10 -1
- data/lib/flipper/adapters/sync.rb +0 -4
- data/lib/flipper/adapters/wrapper.rb +54 -0
- data/lib/flipper/cli.rb +263 -0
- data/lib/flipper/cloud/configuration.rb +266 -0
- data/lib/flipper/cloud/dsl.rb +27 -0
- data/lib/flipper/cloud/message_verifier.rb +95 -0
- data/lib/flipper/cloud/middleware.rb +63 -0
- data/lib/flipper/cloud/routes.rb +14 -0
- data/lib/flipper/cloud/telemetry/backoff_policy.rb +96 -0
- data/lib/flipper/cloud/telemetry/instrumenter.rb +22 -0
- data/lib/flipper/cloud/telemetry/metric.rb +39 -0
- data/lib/flipper/cloud/telemetry/metric_storage.rb +30 -0
- data/lib/flipper/cloud/telemetry/submitter.rb +100 -0
- data/lib/flipper/cloud/telemetry.rb +191 -0
- data/lib/flipper/cloud.rb +53 -0
- data/lib/flipper/configuration.rb +25 -4
- data/lib/flipper/dsl.rb +47 -42
- data/lib/flipper/engine.rb +102 -0
- data/lib/flipper/export.rb +0 -2
- data/lib/flipper/exporters/json/export.rb +1 -1
- data/lib/flipper/exporters/json/v1.rb +1 -1
- data/lib/flipper/expression/builder.rb +73 -0
- data/lib/flipper/expression/constant.rb +25 -0
- data/lib/flipper/expression.rb +71 -0
- data/lib/flipper/expressions/all.rb +9 -0
- data/lib/flipper/expressions/any.rb +9 -0
- data/lib/flipper/expressions/boolean.rb +9 -0
- data/lib/flipper/expressions/comparable.rb +13 -0
- data/lib/flipper/expressions/duration.rb +28 -0
- data/lib/flipper/expressions/equal.rb +9 -0
- data/lib/flipper/expressions/greater_than.rb +9 -0
- data/lib/flipper/expressions/greater_than_or_equal_to.rb +9 -0
- data/lib/flipper/expressions/less_than.rb +9 -0
- data/lib/flipper/expressions/less_than_or_equal_to.rb +9 -0
- data/lib/flipper/expressions/not_equal.rb +9 -0
- data/lib/flipper/expressions/now.rb +9 -0
- data/lib/flipper/expressions/number.rb +9 -0
- data/lib/flipper/expressions/percentage.rb +9 -0
- data/lib/flipper/expressions/percentage_of_actors.rb +12 -0
- data/lib/flipper/expressions/property.rb +9 -0
- data/lib/flipper/expressions/random.rb +9 -0
- data/lib/flipper/expressions/string.rb +9 -0
- data/lib/flipper/expressions/time.rb +9 -0
- data/lib/flipper/feature.rb +63 -1
- data/lib/flipper/gate.rb +2 -1
- data/lib/flipper/gate_values.rb +5 -2
- data/lib/flipper/gates/expression.rb +75 -0
- data/lib/flipper/instrumentation/log_subscriber.rb +28 -5
- data/lib/flipper/instrumentation/statsd.rb +4 -2
- data/lib/flipper/instrumentation/statsd_subscriber.rb +2 -4
- data/lib/flipper/instrumentation/subscriber.rb +0 -4
- data/lib/flipper/metadata.rb +8 -1
- data/lib/flipper/middleware/memoizer.rb +30 -14
- data/lib/flipper/model/active_record.rb +23 -0
- data/lib/flipper/poller.rb +10 -9
- data/lib/flipper/serializers/gzip.rb +22 -0
- data/lib/flipper/serializers/json.rb +17 -0
- data/lib/flipper/spec/shared_adapter_specs.rb +82 -63
- data/lib/flipper/test/shared_adapter_test.rb +77 -58
- data/lib/flipper/test_help.rb +43 -0
- data/lib/flipper/typecast.rb +37 -9
- data/lib/flipper/types/percentage.rb +1 -1
- data/lib/flipper/version.rb +11 -1
- data/lib/flipper.rb +44 -7
- data/lib/generators/flipper/setup_generator.rb +68 -0
- data/lib/generators/flipper/templates/initializer.rb +45 -0
- data/lib/generators/flipper/templates/update/migrations/01_create_flipper_tables.rb.erb +22 -0
- data/lib/generators/flipper/templates/update/migrations/02_change_flipper_gates_value_to_text.rb.erb +18 -0
- data/lib/generators/flipper/update_generator.rb +35 -0
- data/package-lock.json +41 -0
- data/package.json +10 -0
- data/spec/fixtures/environment.rb +1 -0
- data/spec/flipper/adapter_builder_spec.rb +72 -0
- data/spec/flipper/adapter_spec.rb +1 -0
- data/spec/flipper/adapters/actor_limit_spec.rb +20 -0
- data/spec/flipper/adapters/dual_write_spec.rb +2 -2
- data/spec/flipper/adapters/http/client_spec.rb +61 -0
- data/spec/flipper/adapters/http_spec.rb +135 -74
- data/spec/flipper/adapters/instrumented_spec.rb +1 -1
- data/spec/flipper/adapters/memoizable_spec.rb +21 -21
- data/spec/flipper/adapters/memory_spec.rb +11 -2
- data/spec/flipper/adapters/operation_logger_spec.rb +2 -2
- data/spec/flipper/adapters/poll_spec.rb +41 -0
- data/spec/flipper/adapters/read_only_spec.rb +32 -17
- data/spec/flipper/adapters/strict_spec.rb +64 -0
- data/spec/flipper/adapters/sync/feature_synchronizer_spec.rb +27 -0
- data/spec/flipper/cli_spec.rb +166 -0
- data/spec/flipper/cloud/configuration_spec.rb +251 -0
- data/spec/flipper/cloud/dsl_spec.rb +82 -0
- data/spec/flipper/cloud/message_verifier_spec.rb +104 -0
- data/spec/flipper/cloud/middleware_spec.rb +289 -0
- data/spec/flipper/cloud/telemetry/backoff_policy_spec.rb +107 -0
- data/spec/flipper/cloud/telemetry/metric_spec.rb +87 -0
- data/spec/flipper/cloud/telemetry/metric_storage_spec.rb +58 -0
- data/spec/flipper/cloud/telemetry/submitter_spec.rb +145 -0
- data/spec/flipper/cloud/telemetry_spec.rb +208 -0
- data/spec/flipper/cloud_spec.rb +186 -0
- data/spec/flipper/configuration_spec.rb +17 -0
- data/spec/flipper/dsl_spec.rb +34 -73
- data/spec/flipper/engine_spec.rb +374 -0
- data/spec/flipper/exporters/json/v1_spec.rb +3 -3
- data/spec/flipper/expression/builder_spec.rb +248 -0
- data/spec/flipper/expression_spec.rb +188 -0
- data/spec/flipper/expressions/all_spec.rb +15 -0
- data/spec/flipper/expressions/any_spec.rb +15 -0
- data/spec/flipper/expressions/boolean_spec.rb +15 -0
- data/spec/flipper/expressions/duration_spec.rb +43 -0
- data/spec/flipper/expressions/equal_spec.rb +24 -0
- data/spec/flipper/expressions/greater_than_or_equal_to_spec.rb +28 -0
- data/spec/flipper/expressions/greater_than_spec.rb +28 -0
- data/spec/flipper/expressions/less_than_or_equal_to_spec.rb +28 -0
- data/spec/flipper/expressions/less_than_spec.rb +32 -0
- data/spec/flipper/expressions/not_equal_spec.rb +15 -0
- data/spec/flipper/expressions/now_spec.rb +11 -0
- data/spec/flipper/expressions/number_spec.rb +21 -0
- data/spec/flipper/expressions/percentage_of_actors_spec.rb +20 -0
- data/spec/flipper/expressions/percentage_spec.rb +15 -0
- data/spec/flipper/expressions/property_spec.rb +13 -0
- data/spec/flipper/expressions/random_spec.rb +9 -0
- data/spec/flipper/expressions/string_spec.rb +11 -0
- data/spec/flipper/expressions/time_spec.rb +13 -0
- data/spec/flipper/feature_spec.rb +380 -10
- data/spec/flipper/gate_values_spec.rb +2 -2
- data/spec/flipper/gates/expression_spec.rb +108 -0
- data/spec/flipper/identifier_spec.rb +4 -5
- data/spec/flipper/instrumentation/log_subscriber_spec.rb +10 -2
- data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +16 -2
- data/spec/flipper/middleware/memoizer_spec.rb +79 -10
- data/spec/flipper/model/active_record_spec.rb +72 -0
- data/spec/flipper/serializers/gzip_spec.rb +13 -0
- data/spec/flipper/serializers/json_spec.rb +13 -0
- data/spec/flipper/typecast_spec.rb +43 -7
- data/spec/flipper/types/actor_spec.rb +18 -1
- data/spec/flipper_integration_spec.rb +114 -16
- data/spec/flipper_spec.rb +87 -29
- data/spec/spec_helper.rb +17 -17
- data/spec/support/actor_names.yml +1 -0
- data/spec/support/fail_on_output.rb +8 -0
- data/spec/support/fake_backoff_policy.rb +15 -0
- data/spec/support/spec_helpers.rb +34 -8
- data/test/adapters/actor_limit_test.rb +20 -0
- data/test_rails/generators/flipper/setup_generator_test.rb +69 -0
- data/test_rails/generators/flipper/update_generator_test.rb +96 -0
- data/test_rails/helper.rb +22 -2
- data/test_rails/system/test_help_test.rb +52 -0
- metadata +179 -19
- data/.tool-versions +0 -1
- data/lib/flipper/railtie.rb +0 -47
- data/spec/flipper/railtie_spec.rb +0 -109
|
@@ -4,11 +4,12 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
4
4
|
let(:flipper) { Flipper.new(subject) }
|
|
5
5
|
let(:feature) { flipper[:stats] }
|
|
6
6
|
|
|
7
|
-
let(:boolean_gate)
|
|
8
|
-
let(:
|
|
9
|
-
let(:
|
|
10
|
-
let(:
|
|
11
|
-
let(:
|
|
7
|
+
let(:boolean_gate) { feature.gate(:boolean) }
|
|
8
|
+
let(:expression_gate) { feature.gate(:expression) }
|
|
9
|
+
let(:group_gate) { feature.gate(:group) }
|
|
10
|
+
let(:actor_gate) { feature.gate(:actor) }
|
|
11
|
+
let(:actors_gate) { feature.gate(:percentage_of_actors) }
|
|
12
|
+
let(:time_gate) { feature.gate(:percentage_of_time) }
|
|
12
13
|
|
|
13
14
|
before do
|
|
14
15
|
Flipper.register(:admins) do |actor|
|
|
@@ -46,12 +47,12 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
46
47
|
end
|
|
47
48
|
|
|
48
49
|
it 'can enable, disable and get value for boolean gate' do
|
|
49
|
-
expect(subject.enable(feature, boolean_gate,
|
|
50
|
+
expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
|
|
50
51
|
|
|
51
52
|
result = subject.get(feature)
|
|
52
53
|
expect(result[:boolean]).to eq('true')
|
|
53
54
|
|
|
54
|
-
expect(subject.disable(feature, boolean_gate,
|
|
55
|
+
expect(subject.disable(feature, boolean_gate, Flipper::Types::Boolean.new(false))).to eq(true)
|
|
55
56
|
|
|
56
57
|
result = subject.get(feature)
|
|
57
58
|
expect(result[:boolean]).to eq(nil)
|
|
@@ -59,17 +60,34 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
59
60
|
|
|
60
61
|
it 'fully disables all enabled things when boolean gate disabled' do
|
|
61
62
|
actor22 = Flipper::Actor.new('22')
|
|
62
|
-
expect(subject.enable(feature, boolean_gate,
|
|
63
|
+
expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
|
|
63
64
|
expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
|
|
64
|
-
expect(subject.enable(feature, actor_gate,
|
|
65
|
-
expect(subject.enable(feature, actors_gate,
|
|
66
|
-
expect(subject.enable(feature, time_gate,
|
|
67
|
-
|
|
68
|
-
expect(subject.disable(feature, boolean_gate, flipper.boolean(false))).to eq(true)
|
|
65
|
+
expect(subject.enable(feature, actor_gate, Flipper::Types::Actor.new(actor22))).to eq(true)
|
|
66
|
+
expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
|
|
67
|
+
expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(45))).to eq(true)
|
|
69
68
|
|
|
69
|
+
expect(subject.disable(feature, boolean_gate, Flipper::Types::Boolean.new(false))).to eq(true)
|
|
70
70
|
expect(subject.get(feature)).to eq(subject.default_config)
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
+
it 'can enable, disable and get value for expression gate' do
|
|
74
|
+
basic_expression = Flipper.property(:plan).eq("basic")
|
|
75
|
+
age_expression = Flipper.property(:age).gte(21)
|
|
76
|
+
any_expression = Flipper.any(basic_expression, age_expression)
|
|
77
|
+
|
|
78
|
+
expect(subject.enable(feature, expression_gate, any_expression)).to eq(true)
|
|
79
|
+
result = subject.get(feature)
|
|
80
|
+
expect(result[:expression]).to eq(any_expression.value)
|
|
81
|
+
|
|
82
|
+
expect(subject.enable(feature, expression_gate, basic_expression)).to eq(true)
|
|
83
|
+
result = subject.get(feature)
|
|
84
|
+
expect(result[:expression]).to eq(basic_expression.value)
|
|
85
|
+
|
|
86
|
+
expect(subject.disable(feature, expression_gate, basic_expression)).to eq(true)
|
|
87
|
+
result = subject.get(feature)
|
|
88
|
+
expect(result[:expression]).to be(nil)
|
|
89
|
+
end
|
|
90
|
+
|
|
73
91
|
it 'can enable, disable and get value for group gate' do
|
|
74
92
|
expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
|
|
75
93
|
expect(subject.enable(feature, group_gate, flipper.group(:early_access))).to eq(true)
|
|
@@ -90,34 +108,34 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
90
108
|
actor22 = Flipper::Actor.new('22')
|
|
91
109
|
actor_asdf = Flipper::Actor.new('asdf')
|
|
92
110
|
|
|
93
|
-
expect(
|
|
94
|
-
expect(
|
|
111
|
+
expect(feature.enable(actor22)).to be(true)
|
|
112
|
+
expect(feature.enable(actor_asdf)).to be(true)
|
|
95
113
|
|
|
96
|
-
|
|
97
|
-
expect(
|
|
114
|
+
expect(feature).to be_enabled(actor22)
|
|
115
|
+
expect(feature).to be_enabled(actor_asdf)
|
|
98
116
|
|
|
99
|
-
expect(
|
|
100
|
-
|
|
101
|
-
expect(
|
|
117
|
+
expect(feature.disable(actor22)).to be(true)
|
|
118
|
+
expect(feature).not_to be_enabled(actor22)
|
|
119
|
+
expect(feature).to be_enabled(actor_asdf)
|
|
102
120
|
|
|
103
|
-
expect(
|
|
104
|
-
|
|
105
|
-
expect(
|
|
121
|
+
expect(feature.disable(actor_asdf)).to eq(true)
|
|
122
|
+
expect(feature).not_to be_enabled(actor22)
|
|
123
|
+
expect(feature).not_to be_enabled(actor_asdf)
|
|
106
124
|
end
|
|
107
125
|
|
|
108
126
|
it 'can enable, disable and get value for percentage of actors gate' do
|
|
109
|
-
expect(subject.enable(feature, actors_gate,
|
|
127
|
+
expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(15))).to eq(true)
|
|
110
128
|
result = subject.get(feature)
|
|
111
129
|
expect(result[:percentage_of_actors]).to eq('15')
|
|
112
130
|
|
|
113
|
-
expect(subject.disable(feature, actors_gate,
|
|
131
|
+
expect(subject.disable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(0))).to eq(true)
|
|
114
132
|
result = subject.get(feature)
|
|
115
133
|
expect(result[:percentage_of_actors]).to eq('0')
|
|
116
134
|
end
|
|
117
135
|
|
|
118
136
|
it 'can enable percentage of actors gate many times and consistently return values' do
|
|
119
137
|
(1..100).each do |percentage|
|
|
120
|
-
expect(subject.enable(feature, actors_gate,
|
|
138
|
+
expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(percentage))).to eq(true)
|
|
121
139
|
result = subject.get(feature)
|
|
122
140
|
expect(result[:percentage_of_actors]).to eq(percentage.to_s)
|
|
123
141
|
end
|
|
@@ -125,25 +143,25 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
125
143
|
|
|
126
144
|
it 'can disable percentage of actors gate many times and consistently return values' do
|
|
127
145
|
(1..100).each do |percentage|
|
|
128
|
-
expect(subject.disable(feature, actors_gate,
|
|
146
|
+
expect(subject.disable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(percentage))).to eq(true)
|
|
129
147
|
result = subject.get(feature)
|
|
130
148
|
expect(result[:percentage_of_actors]).to eq(percentage.to_s)
|
|
131
149
|
end
|
|
132
150
|
end
|
|
133
151
|
|
|
134
152
|
it 'can enable, disable and get value for percentage of time gate' do
|
|
135
|
-
expect(subject.enable(feature, time_gate,
|
|
153
|
+
expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(10))).to eq(true)
|
|
136
154
|
result = subject.get(feature)
|
|
137
155
|
expect(result[:percentage_of_time]).to eq('10')
|
|
138
156
|
|
|
139
|
-
expect(subject.disable(feature, time_gate,
|
|
157
|
+
expect(subject.disable(feature, time_gate, Flipper::Types::PercentageOfTime.new(0))).to eq(true)
|
|
140
158
|
result = subject.get(feature)
|
|
141
159
|
expect(result[:percentage_of_time]).to eq('0')
|
|
142
160
|
end
|
|
143
161
|
|
|
144
162
|
it 'can enable percentage of time gate many times and consistently return values' do
|
|
145
163
|
(1..100).each do |percentage|
|
|
146
|
-
expect(subject.enable(feature, time_gate,
|
|
164
|
+
expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(percentage))).to eq(true)
|
|
147
165
|
result = subject.get(feature)
|
|
148
166
|
expect(result[:percentage_of_time]).to eq(percentage.to_s)
|
|
149
167
|
end
|
|
@@ -151,22 +169,23 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
151
169
|
|
|
152
170
|
it 'can disable percentage of time gate many times and consistently return values' do
|
|
153
171
|
(1..100).each do |percentage|
|
|
154
|
-
expect(subject.disable(feature, time_gate,
|
|
172
|
+
expect(subject.disable(feature, time_gate, Flipper::Types::PercentageOfTime.new(percentage))).to eq(true)
|
|
155
173
|
result = subject.get(feature)
|
|
156
174
|
expect(result[:percentage_of_time]).to eq(percentage.to_s)
|
|
157
175
|
end
|
|
158
176
|
end
|
|
159
177
|
|
|
160
178
|
it 'converts boolean value to a string' do
|
|
161
|
-
expect(subject.enable(feature, boolean_gate,
|
|
179
|
+
expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
|
|
162
180
|
result = subject.get(feature)
|
|
163
181
|
expect(result[:boolean]).to eq('true')
|
|
164
182
|
end
|
|
165
183
|
|
|
166
184
|
it 'converts the actor value to a string' do
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
185
|
+
actor = Flipper::Actor.new(22)
|
|
186
|
+
expect(feature).not_to be_enabled(actor)
|
|
187
|
+
feature.enable_actor actor
|
|
188
|
+
expect(feature).to be_enabled(actor)
|
|
170
189
|
end
|
|
171
190
|
|
|
172
191
|
it 'converts group value to a string' do
|
|
@@ -176,13 +195,13 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
176
195
|
end
|
|
177
196
|
|
|
178
197
|
it 'converts percentage of time integer value to a string' do
|
|
179
|
-
expect(subject.enable(feature, time_gate,
|
|
198
|
+
expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(10))).to eq(true)
|
|
180
199
|
result = subject.get(feature)
|
|
181
200
|
expect(result[:percentage_of_time]).to eq('10')
|
|
182
201
|
end
|
|
183
202
|
|
|
184
203
|
it 'converts percentage of actors integer value to a string' do
|
|
185
|
-
expect(subject.enable(feature, actors_gate,
|
|
204
|
+
expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(10))).to eq(true)
|
|
186
205
|
result = subject.get(feature)
|
|
187
206
|
expect(result[:percentage_of_actors]).to eq('10')
|
|
188
207
|
end
|
|
@@ -205,11 +224,11 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
205
224
|
|
|
206
225
|
it 'clears all the gate values for the feature on remove' do
|
|
207
226
|
actor22 = Flipper::Actor.new('22')
|
|
208
|
-
expect(subject.enable(feature, boolean_gate,
|
|
227
|
+
expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
|
|
209
228
|
expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
|
|
210
|
-
expect(subject.enable(feature, actor_gate,
|
|
211
|
-
expect(subject.enable(feature, actors_gate,
|
|
212
|
-
expect(subject.enable(feature, time_gate,
|
|
229
|
+
expect(subject.enable(feature, actor_gate, Flipper::Types::Actor.new(actor22))).to eq(true)
|
|
230
|
+
expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
|
|
231
|
+
expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(45))).to eq(true)
|
|
213
232
|
|
|
214
233
|
expect(subject.remove(feature)).to eq(true)
|
|
215
234
|
|
|
@@ -221,11 +240,11 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
221
240
|
subject.add(feature)
|
|
222
241
|
expect(subject.features).to include(feature.key)
|
|
223
242
|
|
|
224
|
-
expect(subject.enable(feature, boolean_gate,
|
|
243
|
+
expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
|
|
225
244
|
expect(subject.enable(feature, group_gate, flipper.group(:admins))).to eq(true)
|
|
226
|
-
expect(subject.enable(feature, actor_gate,
|
|
227
|
-
expect(subject.enable(feature, actors_gate,
|
|
228
|
-
expect(subject.enable(feature, time_gate,
|
|
245
|
+
expect(subject.enable(feature, actor_gate, Flipper::Types::Actor.new(actor22))).to eq(true)
|
|
246
|
+
expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
|
|
247
|
+
expect(subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(45))).to eq(true)
|
|
229
248
|
|
|
230
249
|
expect(subject.clear(feature)).to eq(true)
|
|
231
250
|
expect(subject.features).to include(feature.key)
|
|
@@ -238,7 +257,7 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
238
257
|
|
|
239
258
|
it 'can get multiple features' do
|
|
240
259
|
expect(subject.add(flipper[:stats])).to eq(true)
|
|
241
|
-
expect(subject.enable(flipper[:stats], boolean_gate,
|
|
260
|
+
expect(subject.enable(flipper[:stats], boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
|
|
242
261
|
expect(subject.add(flipper[:search])).to eq(true)
|
|
243
262
|
|
|
244
263
|
result = subject.get_multi([flipper[:stats], flipper[:search], flipper[:other]])
|
|
@@ -254,16 +273,16 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
254
273
|
|
|
255
274
|
it 'can get all features' do
|
|
256
275
|
expect(subject.add(flipper[:stats])).to eq(true)
|
|
257
|
-
expect(subject.enable(flipper[:stats], boolean_gate,
|
|
276
|
+
expect(subject.enable(flipper[:stats], boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
|
|
258
277
|
expect(subject.add(flipper[:search])).to eq(true)
|
|
278
|
+
flipper.enable :analytics, Flipper.property(:plan).eq("pro")
|
|
259
279
|
|
|
260
280
|
result = subject.get_all
|
|
261
|
-
expect(result).to be_instance_of(Hash)
|
|
262
281
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
expect(
|
|
266
|
-
expect(
|
|
282
|
+
expect(result).to be_instance_of(Hash)
|
|
283
|
+
expect(result["stats"]).to eq(subject.default_config.merge(boolean: 'true'))
|
|
284
|
+
expect(result["search"]).to eq(subject.default_config)
|
|
285
|
+
expect(result["analytics"]).to eq(subject.default_config.merge(expression: {"Equal"=>[{"Property"=>["plan"]}, "pro"]}))
|
|
267
286
|
end
|
|
268
287
|
|
|
269
288
|
it 'includes explicitly disabled features when getting all features' do
|
|
@@ -277,9 +296,9 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
277
296
|
|
|
278
297
|
it 'can double enable an actor without error' do
|
|
279
298
|
actor = Flipper::Actor.new('Flipper::Actor;22')
|
|
280
|
-
expect(
|
|
281
|
-
expect(
|
|
282
|
-
expect(
|
|
299
|
+
expect(feature.enable(actor)).to be(true)
|
|
300
|
+
expect(feature.enable(actor)).to be(true)
|
|
301
|
+
expect(feature).to be_enabled(actor)
|
|
283
302
|
end
|
|
284
303
|
|
|
285
304
|
it 'can double enable a group without error' do
|
|
@@ -289,13 +308,13 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
289
308
|
end
|
|
290
309
|
|
|
291
310
|
it 'can double enable percentage without error' do
|
|
292
|
-
expect(subject.enable(feature, actors_gate,
|
|
293
|
-
expect(subject.enable(feature, actors_gate,
|
|
311
|
+
expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
|
|
312
|
+
expect(subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))).to eq(true)
|
|
294
313
|
end
|
|
295
314
|
|
|
296
315
|
it 'can double enable without error' do
|
|
297
|
-
expect(subject.enable(feature, boolean_gate,
|
|
298
|
-
expect(subject.enable(feature, boolean_gate,
|
|
316
|
+
expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
|
|
317
|
+
expect(subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new)).to eq(true)
|
|
299
318
|
end
|
|
300
319
|
|
|
301
320
|
it 'can get_all features when there are none' do
|
|
@@ -305,11 +324,11 @@ RSpec.shared_examples_for 'a flipper adapter' do
|
|
|
305
324
|
|
|
306
325
|
it 'clears other gate values on enable' do
|
|
307
326
|
actor = Flipper::Actor.new('Flipper::Actor;22')
|
|
308
|
-
subject.enable(feature, actors_gate,
|
|
309
|
-
subject.enable(feature, time_gate,
|
|
327
|
+
subject.enable(feature, actors_gate, Flipper::Types::PercentageOfActors.new(25))
|
|
328
|
+
subject.enable(feature, time_gate, Flipper::Types::PercentageOfTime.new(25))
|
|
310
329
|
subject.enable(feature, group_gate, flipper.group(:admins))
|
|
311
|
-
subject.enable(feature, actor_gate,
|
|
312
|
-
subject.enable(feature, boolean_gate,
|
|
330
|
+
subject.enable(feature, actor_gate, Flipper::Types::Actor.new(actor))
|
|
331
|
+
subject.enable(feature, boolean_gate, Flipper::Types::Boolean.new(true))
|
|
313
332
|
expect(subject.get(feature)).to eq(subject.default_config.merge(boolean: "true"))
|
|
314
333
|
end
|
|
315
334
|
|
|
@@ -7,6 +7,7 @@ module Flipper
|
|
|
7
7
|
@feature = @flipper[:stats]
|
|
8
8
|
@boolean_gate = @feature.gate(:boolean)
|
|
9
9
|
@group_gate = @feature.gate(:group)
|
|
10
|
+
@expression_gate = @feature.gate(:expression)
|
|
10
11
|
@actor_gate = @feature.gate(:actor)
|
|
11
12
|
@actors_gate = @feature.gate(:percentage_of_actors)
|
|
12
13
|
@time_gate = @feature.gate(:percentage_of_time)
|
|
@@ -48,23 +49,41 @@ module Flipper
|
|
|
48
49
|
end
|
|
49
50
|
|
|
50
51
|
def test_can_enable_disable_and_get_value_for_boolean_gate
|
|
51
|
-
assert_equal true, @adapter.enable(@feature, @boolean_gate,
|
|
52
|
+
assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
|
|
52
53
|
assert_equal 'true', @adapter.get(@feature)[:boolean]
|
|
53
|
-
assert_equal true, @adapter.disable(@feature, @boolean_gate,
|
|
54
|
+
assert_equal true, @adapter.disable(@feature, @boolean_gate, Flipper::Types::Boolean.new(false))
|
|
54
55
|
assert_nil @adapter.get(@feature)[:boolean]
|
|
55
56
|
end
|
|
56
57
|
|
|
57
58
|
def test_fully_disables_all_enabled_things_when_boolean_gate_disabled
|
|
58
59
|
actor22 = Flipper::Actor.new('22')
|
|
59
|
-
assert_equal true, @adapter.enable(@feature, @boolean_gate,
|
|
60
|
+
assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
|
|
60
61
|
assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
|
|
61
|
-
assert_equal true, @adapter.enable(@feature, @actor_gate,
|
|
62
|
-
assert_equal true, @adapter.enable(@feature, @actors_gate,
|
|
63
|
-
assert_equal true, @adapter.enable(@feature, @time_gate,
|
|
64
|
-
assert_equal true, @adapter.disable(@feature, @boolean_gate,
|
|
62
|
+
assert_equal true, @adapter.enable(@feature, @actor_gate, Flipper::Types::Actor.new(actor22))
|
|
63
|
+
assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
|
|
64
|
+
assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(45))
|
|
65
|
+
assert_equal true, @adapter.disable(@feature, @boolean_gate, Flipper::Types::Boolean.new(false))
|
|
65
66
|
assert_equal @adapter.default_config, @adapter.get(@feature)
|
|
66
67
|
end
|
|
67
68
|
|
|
69
|
+
def test_can_enable_disable_and_get_value_for_expression_gate
|
|
70
|
+
basic_expression = Flipper.property(:plan).eq("basic")
|
|
71
|
+
age_expression = Flipper.property(:age).gte(21)
|
|
72
|
+
any_expression = Flipper.any(basic_expression, age_expression)
|
|
73
|
+
|
|
74
|
+
assert_equal true, @adapter.enable(@feature, @expression_gate, any_expression)
|
|
75
|
+
result = @adapter.get(@feature)
|
|
76
|
+
assert_equal any_expression.value, result[:expression]
|
|
77
|
+
|
|
78
|
+
assert_equal true, @adapter.enable(@feature, @expression_gate, basic_expression)
|
|
79
|
+
result = @adapter.get(@feature)
|
|
80
|
+
assert_equal basic_expression.value, result[:expression]
|
|
81
|
+
|
|
82
|
+
assert_equal true, @adapter.disable(@feature, @expression_gate, basic_expression)
|
|
83
|
+
result = @adapter.get(@feature)
|
|
84
|
+
assert_nil result[:expression]
|
|
85
|
+
end
|
|
86
|
+
|
|
68
87
|
def test_can_enable_disable_get_value_for_group_gate
|
|
69
88
|
assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
|
|
70
89
|
assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:early_access))
|
|
@@ -85,34 +104,34 @@ module Flipper
|
|
|
85
104
|
actor22 = Flipper::Actor.new('22')
|
|
86
105
|
actor_asdf = Flipper::Actor.new('asdf')
|
|
87
106
|
|
|
88
|
-
assert_equal true, @
|
|
89
|
-
assert_equal true, @
|
|
107
|
+
assert_equal true, @feature.enable(actor22)
|
|
108
|
+
assert_equal true, @feature.enable(actor_asdf)
|
|
90
109
|
|
|
91
|
-
|
|
92
|
-
|
|
110
|
+
assert @feature.enabled?(actor22)
|
|
111
|
+
assert @feature.enabled?(actor_asdf)
|
|
93
112
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
113
|
+
assert_equal true, @feature.disable(actor22)
|
|
114
|
+
refute @feature.enabled?(actor22)
|
|
115
|
+
assert @feature.enabled?(actor_asdf)
|
|
97
116
|
|
|
98
|
-
assert_equal true, @
|
|
99
|
-
|
|
100
|
-
|
|
117
|
+
assert_equal true, @feature.disable(actor_asdf)
|
|
118
|
+
refute @feature.enabled?(actor22)
|
|
119
|
+
refute @feature.enabled?(actor_asdf)
|
|
101
120
|
end
|
|
102
121
|
|
|
103
122
|
def test_can_enable_disable_get_value_for_percentage_of_actors_gate
|
|
104
|
-
assert_equal true, @adapter.enable(@feature, @actors_gate,
|
|
123
|
+
assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(15))
|
|
105
124
|
result = @adapter.get(@feature)
|
|
106
125
|
assert_equal '15', result[:percentage_of_actors]
|
|
107
126
|
|
|
108
|
-
assert_equal true, @adapter.disable(@feature, @actors_gate,
|
|
127
|
+
assert_equal true, @adapter.disable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(0))
|
|
109
128
|
result = @adapter.get(@feature)
|
|
110
129
|
assert_equal '0', result[:percentage_of_actors]
|
|
111
130
|
end
|
|
112
131
|
|
|
113
132
|
def test_can_enable_percentage_of_actors_gate_many_times_and_consistently_return_values
|
|
114
133
|
(1..100).each do |percentage|
|
|
115
|
-
assert_equal true, @adapter.enable(@feature, @actors_gate,
|
|
134
|
+
assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(percentage))
|
|
116
135
|
result = @adapter.get(@feature)
|
|
117
136
|
assert_equal percentage.to_s, result[:percentage_of_actors]
|
|
118
137
|
end
|
|
@@ -120,25 +139,25 @@ module Flipper
|
|
|
120
139
|
|
|
121
140
|
def test_can_disable_percentage_of_actors_gate_many_times_and_consistently_return_values
|
|
122
141
|
(1..100).each do |percentage|
|
|
123
|
-
assert_equal true, @adapter.disable(@feature, @actors_gate,
|
|
142
|
+
assert_equal true, @adapter.disable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(percentage))
|
|
124
143
|
result = @adapter.get(@feature)
|
|
125
144
|
assert_equal percentage.to_s, result[:percentage_of_actors]
|
|
126
145
|
end
|
|
127
146
|
end
|
|
128
147
|
|
|
129
148
|
def test_can_enable_disable_and_get_value_for_percentage_of_time_gate
|
|
130
|
-
assert_equal true, @adapter.enable(@feature, @time_gate,
|
|
149
|
+
assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(10))
|
|
131
150
|
result = @adapter.get(@feature)
|
|
132
151
|
assert_equal '10', result[:percentage_of_time]
|
|
133
152
|
|
|
134
|
-
assert_equal true, @adapter.disable(@feature, @time_gate,
|
|
153
|
+
assert_equal true, @adapter.disable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(0))
|
|
135
154
|
result = @adapter.get(@feature)
|
|
136
155
|
assert_equal '0', result[:percentage_of_time]
|
|
137
156
|
end
|
|
138
157
|
|
|
139
158
|
def test_can_enable_percentage_of_time_gate_many_times_and_consistently_return_values
|
|
140
159
|
(1..100).each do |percentage|
|
|
141
|
-
assert_equal true, @adapter.enable(@feature, @time_gate,
|
|
160
|
+
assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(percentage))
|
|
142
161
|
result = @adapter.get(@feature)
|
|
143
162
|
assert_equal percentage.to_s, result[:percentage_of_time]
|
|
144
163
|
end
|
|
@@ -146,23 +165,23 @@ module Flipper
|
|
|
146
165
|
|
|
147
166
|
def test_can_disable_percentage_of_time_gate_many_times_and_consistently_return_values
|
|
148
167
|
(1..100).each do |percentage|
|
|
149
|
-
assert_equal true, @adapter.disable(@feature, @time_gate,
|
|
168
|
+
assert_equal true, @adapter.disable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(percentage))
|
|
150
169
|
result = @adapter.get(@feature)
|
|
151
170
|
assert_equal percentage.to_s, result[:percentage_of_time]
|
|
152
171
|
end
|
|
153
172
|
end
|
|
154
173
|
|
|
155
174
|
def test_converts_boolean_value_to_a_string
|
|
156
|
-
assert_equal true, @adapter.enable(@feature, @boolean_gate,
|
|
175
|
+
assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
|
|
157
176
|
result = @adapter.get(@feature)
|
|
158
177
|
assert_equal 'true', result[:boolean]
|
|
159
178
|
end
|
|
160
179
|
|
|
161
180
|
def test_converts_the_actor_value_to_a_string
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
181
|
+
actor = Flipper::Actor.new(22)
|
|
182
|
+
refute @feature.enabled?(actor)
|
|
183
|
+
@feature.enable_actor actor
|
|
184
|
+
assert @feature.enabled?(actor)
|
|
166
185
|
end
|
|
167
186
|
|
|
168
187
|
def test_converts_group_value_to_a_string
|
|
@@ -172,13 +191,13 @@ module Flipper
|
|
|
172
191
|
end
|
|
173
192
|
|
|
174
193
|
def test_converts_percentage_of_time_integer_value_to_a_string
|
|
175
|
-
assert_equal true, @adapter.enable(@feature, @time_gate,
|
|
194
|
+
assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(10))
|
|
176
195
|
result = @adapter.get(@feature)
|
|
177
196
|
assert_equal '10', result[:percentage_of_time]
|
|
178
197
|
end
|
|
179
198
|
|
|
180
199
|
def test_converts_percentage_of_actors_integer_value_to_a_string
|
|
181
|
-
assert_equal true, @adapter.enable(@feature, @actors_gate,
|
|
200
|
+
assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(10))
|
|
182
201
|
result = @adapter.get(@feature)
|
|
183
202
|
assert_equal '10', result[:percentage_of_actors]
|
|
184
203
|
end
|
|
@@ -201,11 +220,11 @@ module Flipper
|
|
|
201
220
|
|
|
202
221
|
def test_clears_all_the_gate_values_for_the_feature_on_remove
|
|
203
222
|
actor22 = Flipper::Actor.new('22')
|
|
204
|
-
assert_equal true, @adapter.enable(@feature, @boolean_gate,
|
|
223
|
+
assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
|
|
205
224
|
assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
|
|
206
|
-
assert_equal true, @adapter.enable(@feature, @actor_gate,
|
|
207
|
-
assert_equal true, @adapter.enable(@feature, @actors_gate,
|
|
208
|
-
assert_equal true, @adapter.enable(@feature, @time_gate,
|
|
225
|
+
assert_equal true, @adapter.enable(@feature, @actor_gate, Flipper::Types::Actor.new(actor22))
|
|
226
|
+
assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
|
|
227
|
+
assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(45))
|
|
209
228
|
|
|
210
229
|
assert_equal true, @adapter.remove(@feature)
|
|
211
230
|
|
|
@@ -217,11 +236,11 @@ module Flipper
|
|
|
217
236
|
@adapter.add(@feature)
|
|
218
237
|
assert_includes @adapter.features, @feature.key
|
|
219
238
|
|
|
220
|
-
assert_equal true, @adapter.enable(@feature, @boolean_gate,
|
|
239
|
+
assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
|
|
221
240
|
assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
|
|
222
|
-
assert_equal true, @adapter.enable(@feature, @actor_gate,
|
|
223
|
-
assert_equal true, @adapter.enable(@feature, @actors_gate,
|
|
224
|
-
assert_equal true, @adapter.enable(@feature, @time_gate,
|
|
241
|
+
assert_equal true, @adapter.enable(@feature, @actor_gate, Flipper::Types::Actor.new(actor22))
|
|
242
|
+
assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
|
|
243
|
+
assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(45))
|
|
225
244
|
|
|
226
245
|
assert_equal true, @adapter.clear(@feature)
|
|
227
246
|
assert_includes @adapter.features, @feature.key
|
|
@@ -234,7 +253,7 @@ module Flipper
|
|
|
234
253
|
|
|
235
254
|
def test_can_get_multiple_features
|
|
236
255
|
assert @adapter.add(@flipper[:stats])
|
|
237
|
-
assert @adapter.enable(@flipper[:stats], @boolean_gate,
|
|
256
|
+
assert @adapter.enable(@flipper[:stats], @boolean_gate, Flipper::Types::Boolean.new)
|
|
238
257
|
assert @adapter.add(@flipper[:search])
|
|
239
258
|
|
|
240
259
|
result = @adapter.get_multi([@flipper[:stats], @flipper[:search], @flipper[:other]])
|
|
@@ -250,16 +269,16 @@ module Flipper
|
|
|
250
269
|
|
|
251
270
|
def test_can_get_all_features
|
|
252
271
|
assert @adapter.add(@flipper[:stats])
|
|
253
|
-
assert @adapter.enable(@flipper[:stats], @boolean_gate,
|
|
272
|
+
assert @adapter.enable(@flipper[:stats], @boolean_gate, Flipper::Types::Boolean.new)
|
|
254
273
|
assert @adapter.add(@flipper[:search])
|
|
274
|
+
@flipper.enable :analytics, Flipper.property(:plan).eq("pro")
|
|
255
275
|
|
|
256
276
|
result = @adapter.get_all
|
|
257
|
-
assert_instance_of Hash, result
|
|
258
277
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
assert_equal @adapter.default_config
|
|
262
|
-
assert_equal @adapter.default_config,
|
|
278
|
+
assert_instance_of Hash, result
|
|
279
|
+
assert_equal @adapter.default_config.merge(boolean: 'true'), result["stats"]
|
|
280
|
+
assert_equal @adapter.default_config, result["search"]
|
|
281
|
+
assert_equal @adapter.default_config.merge(expression: {"Equal"=>[{"Property"=>["plan"]}, "pro"]}), result["analytics"]
|
|
263
282
|
end
|
|
264
283
|
|
|
265
284
|
def test_includes_explicitly_disabled_features_when_getting_all_features
|
|
@@ -273,9 +292,9 @@ module Flipper
|
|
|
273
292
|
|
|
274
293
|
def test_can_double_enable_an_actor_without_error
|
|
275
294
|
actor = Flipper::Actor.new('Flipper::Actor;22')
|
|
276
|
-
assert_equal true, @
|
|
277
|
-
assert_equal true, @
|
|
278
|
-
|
|
295
|
+
assert_equal true, @feature.enable(actor)
|
|
296
|
+
assert_equal true, @feature.enable(actor)
|
|
297
|
+
assert @feature.enabled?(actor)
|
|
279
298
|
end
|
|
280
299
|
|
|
281
300
|
def test_can_double_enable_a_group_without_error
|
|
@@ -285,13 +304,13 @@ module Flipper
|
|
|
285
304
|
end
|
|
286
305
|
|
|
287
306
|
def test_can_double_enable_percentage_without_error
|
|
288
|
-
assert_equal true, @adapter.enable(@feature, @actors_gate,
|
|
289
|
-
assert_equal true, @adapter.enable(@feature, @actors_gate,
|
|
307
|
+
assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
|
|
308
|
+
assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
|
|
290
309
|
end
|
|
291
310
|
|
|
292
311
|
def test_can_double_enable_without_error
|
|
293
|
-
assert_equal true, @adapter.enable(@feature, @boolean_gate,
|
|
294
|
-
assert_equal true, @adapter.enable(@feature, @boolean_gate,
|
|
312
|
+
assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
|
|
313
|
+
assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new)
|
|
295
314
|
end
|
|
296
315
|
|
|
297
316
|
def test_can_get_all_features_when_there_are_none
|
|
@@ -302,11 +321,11 @@ module Flipper
|
|
|
302
321
|
|
|
303
322
|
def test_clears_other_gate_values_on_enable
|
|
304
323
|
actor = Flipper::Actor.new('Flipper::Actor;22')
|
|
305
|
-
assert_equal true, @adapter.enable(@feature, @actors_gate,
|
|
306
|
-
assert_equal true, @adapter.enable(@feature, @time_gate,
|
|
324
|
+
assert_equal true, @adapter.enable(@feature, @actors_gate, Flipper::Types::PercentageOfActors.new(25))
|
|
325
|
+
assert_equal true, @adapter.enable(@feature, @time_gate, Flipper::Types::PercentageOfTime.new(25))
|
|
307
326
|
assert_equal true, @adapter.enable(@feature, @group_gate, @flipper.group(:admins))
|
|
308
|
-
assert_equal true, @adapter.enable(@feature, @actor_gate,
|
|
309
|
-
assert_equal true, @adapter.enable(@feature, @boolean_gate,
|
|
327
|
+
assert_equal true, @adapter.enable(@feature, @actor_gate, Flipper::Types::Actor.new(actor))
|
|
328
|
+
assert_equal true, @adapter.enable(@feature, @boolean_gate, Flipper::Types::Boolean.new(true))
|
|
310
329
|
assert_equal @adapter.default_config.merge(boolean: "true"), @adapter.get(@feature)
|
|
311
330
|
end
|
|
312
331
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Flipper
|
|
2
|
+
module TestHelp
|
|
3
|
+
extend self
|
|
4
|
+
|
|
5
|
+
def flipper_configure
|
|
6
|
+
# Use a shared Memory adapter for all tests. This is instantiated outside of the
|
|
7
|
+
# `configure` block so the same instance is returned in new threads.
|
|
8
|
+
adapter = Flipper::Adapters::Memory.new
|
|
9
|
+
|
|
10
|
+
Flipper.configure do |config|
|
|
11
|
+
config.adapter { adapter }
|
|
12
|
+
config.default { Flipper.new(config.adapter) }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def flipper_reset
|
|
17
|
+
# Remove all features
|
|
18
|
+
Flipper.features.each(&:remove) rescue nil
|
|
19
|
+
|
|
20
|
+
# Reset previous DSL instance
|
|
21
|
+
Flipper.instance = nil
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
if defined?(RSpec) && RSpec.respond_to?(:configure)
|
|
27
|
+
RSpec.configure do |config|
|
|
28
|
+
config.include Flipper::TestHelp
|
|
29
|
+
config.before(:suite) { Flipper::TestHelp.flipper_configure }
|
|
30
|
+
config.before(:each) { flipper_reset }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
if defined?(ActiveSupport)
|
|
34
|
+
ActiveSupport.on_load(:active_support_test_case) do
|
|
35
|
+
Flipper::TestHelp.flipper_configure
|
|
36
|
+
|
|
37
|
+
ActiveSupport::TestCase.class_eval do
|
|
38
|
+
include Flipper::TestHelp
|
|
39
|
+
|
|
40
|
+
setup :flipper_reset
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|