quonfig 0.0.6 → 0.0.8
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/CHANGELOG.md +29 -0
- data/VERSION +1 -1
- data/lib/quonfig/client.rb +109 -2
- data/lib/quonfig/context.rb +10 -1
- data/lib/quonfig/datadir.rb +2 -4
- data/lib/quonfig/errors/decryption_error.rb +20 -0
- data/lib/quonfig/errors/env_var_parse_error.rb +8 -1
- data/lib/quonfig/errors/invalid_environment_error.rb +19 -0
- data/lib/quonfig/errors/missing_environment_error.rb +18 -0
- data/lib/quonfig/evaluator.rb +64 -2
- data/lib/quonfig/http_connection.rb +1 -1
- data/lib/quonfig/resolver.rb +187 -2
- data/lib/quonfig/stdlib_formatter.rb +95 -0
- data/lib/quonfig/telemetry/context_shape.rb +33 -0
- data/lib/quonfig/telemetry/context_shape_aggregator.rb +82 -0
- data/lib/quonfig/telemetry/evaluation_summaries_aggregator.rb +119 -0
- data/lib/quonfig/telemetry/example_contexts_aggregator.rb +101 -0
- data/lib/quonfig/telemetry/telemetry_reporter.rb +200 -0
- data/lib/quonfig.rb +8 -0
- data/quonfig.gemspec +20 -4
- data/test/integration/test_context_precedence.rb +35 -117
- data/test/integration/test_datadir_environment.rb +15 -37
- data/test/integration/test_enabled.rb +157 -463
- data/test/integration/test_enabled_with_contexts.rb +19 -49
- data/test/integration/test_get.rb +43 -131
- data/test/integration/test_get_feature_flag.rb +7 -13
- data/test/integration/test_get_or_raise.rb +19 -45
- data/test/integration/test_get_weighted_values.rb +9 -4
- data/test/integration/test_helpers.rb +499 -4
- data/test/integration/test_post.rb +15 -5
- data/test/integration/test_telemetry.rb +63 -21
- data/test/test_client_telemetry.rb +132 -0
- data/test/test_context.rb +4 -1
- data/test/test_context_shape.rb +37 -0
- data/test/test_context_shape_aggregator.rb +126 -0
- data/test/test_datadir.rb +6 -2
- data/test/test_evaluation_summaries_aggregator.rb +180 -0
- data/test/test_example_contexts_aggregator.rb +119 -0
- data/test/test_http_connection.rb +1 -1
- data/test/test_resolver.rb +149 -2
- data/test/test_should_log.rb +186 -0
- data/test/test_stdlib_formatter.rb +195 -0
- data/test/test_telemetry_reporter.rb +209 -0
- metadata +19 -3
- data/scripts/generate_integration_tests.rb +0 -362
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
#
|
|
3
3
|
# AUTO-GENERATED from integration-test-data/tests/eval/enabled.yaml.
|
|
4
|
-
# Regenerate with
|
|
4
|
+
# Regenerate with:
|
|
5
|
+
# cd integration-test-data/generators && npm run generate -- --target=ruby
|
|
6
|
+
# Source: integration-test-data/generators/src/targets/ruby.ts
|
|
5
7
|
# Do NOT edit by hand — changes will be overwritten.
|
|
6
8
|
|
|
7
9
|
require 'test_helper'
|
|
@@ -14,771 +16,463 @@ class TestEnabled < Minitest::Test
|
|
|
14
16
|
|
|
15
17
|
# returns the correct value for a simple flag
|
|
16
18
|
def test_returns_the_correct_value_for_a_simple_flag
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.simple", {}, true)
|
|
20
|
-
rescue Exception => e
|
|
21
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
22
|
-
end
|
|
19
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
20
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.simple", {}, true)
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
# always returns false for a non-boolean flag
|
|
26
24
|
def test_always_returns_false_for_a_non_boolean_flag
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.integer", {}, false)
|
|
30
|
-
rescue Exception => e
|
|
31
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
32
|
-
end
|
|
25
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
26
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.integer", {}, false)
|
|
33
27
|
end
|
|
34
28
|
|
|
35
29
|
# returns true for a PROP_IS_ONE_OF rule when any prop matches
|
|
36
30
|
def test_returns_true_for_a_prop_is_one_of_rule_when_any_prop_matches
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.properties.positive", {"" => {"name" => "michael", "domain" => "something.com"}}, true)
|
|
40
|
-
rescue Exception => e
|
|
41
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
42
|
-
end
|
|
31
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
32
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.properties.positive", {"" => {"name" => "michael", "domain" => "something.com"}}, true)
|
|
43
33
|
end
|
|
44
34
|
|
|
45
35
|
# returns false for a PROP_IS_ONE_OF rule when no prop matches
|
|
46
36
|
def test_returns_false_for_a_prop_is_one_of_rule_when_no_prop_matches
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.properties.positive", {"" => {"name" => "lauren", "domain" => "something.com"}}, false)
|
|
50
|
-
rescue Exception => e
|
|
51
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
52
|
-
end
|
|
37
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
38
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.properties.positive", {"" => {"name" => "lauren", "domain" => "something.com"}}, false)
|
|
53
39
|
end
|
|
54
40
|
|
|
55
41
|
# returns true for a PROP_IS_NOT_ONE_OF rule when any prop doesn't match
|
|
56
42
|
def test_returns_true_for_a_prop_is_not_one_of_rule_when_any_prop_doesn_t_match
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.properties.negative", {"" => {"name" => "lauren", "domain" => "prefab.cloud"}}, true)
|
|
60
|
-
rescue Exception => e
|
|
61
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
62
|
-
end
|
|
43
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
44
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.properties.negative", {"" => {"name" => "lauren", "domain" => "prefab.cloud"}}, true)
|
|
63
45
|
end
|
|
64
46
|
|
|
65
47
|
# returns false for a PROP_IS_NOT_ONE_OF rule when all props match
|
|
66
48
|
def test_returns_false_for_a_prop_is_not_one_of_rule_when_all_props_match
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.properties.negative", {"" => {"name" => "michael", "domain" => "prefab.cloud"}}, false)
|
|
70
|
-
rescue Exception => e
|
|
71
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
72
|
-
end
|
|
49
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
50
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.properties.negative", {"" => {"name" => "michael", "domain" => "prefab.cloud"}}, false)
|
|
73
51
|
end
|
|
74
52
|
|
|
75
53
|
# returns true for PROP_ENDS_WITH_ONE_OF rule when the given prop has a matching suffix
|
|
76
54
|
def test_returns_true_for_prop_ends_with_one_of_rule_when_the_given_prop_has_a_matching_suffix
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.ends-with-one-of.positive", {"" => {"email" => "jeff@prefab.cloud"}}, true)
|
|
80
|
-
rescue Exception => e
|
|
81
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
82
|
-
end
|
|
55
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
56
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.ends-with-one-of.positive", {"" => {"email" => "jeff@prefab.cloud"}}, true)
|
|
83
57
|
end
|
|
84
58
|
|
|
85
59
|
# returns false for PROP_ENDS_WITH_ONE_OF rule when the given prop doesn't have a matching suffix
|
|
86
60
|
def test_returns_false_for_prop_ends_with_one_of_rule_when_the_given_prop_doesn_t_have_a_matching_suffix
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.ends-with-one-of.positive", {"" => {"email" => "jeff@test.com"}}, false)
|
|
90
|
-
rescue Exception => e
|
|
91
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
92
|
-
end
|
|
61
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
62
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.ends-with-one-of.positive", {"" => {"email" => "jeff@test.com"}}, false)
|
|
93
63
|
end
|
|
94
64
|
|
|
95
65
|
# returns true for PROP_DOES_NOT_END_WITH_ONE_OF rule when the given prop doesn't have a matching suffix
|
|
96
66
|
def test_returns_true_for_prop_does_not_end_with_one_of_rule_when_the_given_prop_doesn_t_have_a_matching_suffix
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.ends-with-one-of.negative", {"" => {"email" => "michael@test.com"}}, true)
|
|
100
|
-
rescue Exception => e
|
|
101
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
102
|
-
end
|
|
67
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
68
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.ends-with-one-of.negative", {"" => {"email" => "michael@test.com"}}, true)
|
|
103
69
|
end
|
|
104
70
|
|
|
105
71
|
# returns false for PROP_DOES_NOT_END_WITH_ONE_OF rule when the given prop has a matching suffix
|
|
106
72
|
def test_returns_false_for_prop_does_not_end_with_one_of_rule_when_the_given_prop_has_a_matching_suffix
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.ends-with-one-of.negative", {"" => {"email" => "michael@prefab.cloud"}}, false)
|
|
110
|
-
rescue Exception => e
|
|
111
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
112
|
-
end
|
|
73
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
74
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.ends-with-one-of.negative", {"" => {"email" => "michael@prefab.cloud"}}, false)
|
|
113
75
|
end
|
|
114
76
|
|
|
115
77
|
# returns true for PROP_STARTS_WITH_ONE_OF rule when the given prop has a matching prefix
|
|
116
78
|
def test_returns_true_for_prop_starts_with_one_of_rule_when_the_given_prop_has_a_matching_prefix
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.starts-with-one-of.positive", {"user" => {"email" => "foo@prefab.cloud"}}, true)
|
|
120
|
-
rescue Exception => e
|
|
121
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
122
|
-
end
|
|
79
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
80
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.starts-with-one-of.positive", {"user" => {"email" => "foo@prefab.cloud"}}, true)
|
|
123
81
|
end
|
|
124
82
|
|
|
125
83
|
# returns false for PROP_STARTS_WITH_ONE_OF rule when the given prop doesn't have a matching prefix
|
|
126
84
|
def test_returns_false_for_prop_starts_with_one_of_rule_when_the_given_prop_doesn_t_have_a_matching_prefix
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.starts-with-one-of.positive", {"user" => {"email" => "notfoo@prefab.cloud"}}, false)
|
|
130
|
-
rescue Exception => e
|
|
131
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
132
|
-
end
|
|
85
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
86
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.starts-with-one-of.positive", {"user" => {"email" => "notfoo@prefab.cloud"}}, false)
|
|
133
87
|
end
|
|
134
88
|
|
|
135
89
|
# returns true for PROP_DOES_NOT_START_WITH_ONE_OF rule when the given prop doesn't have a matching prefix
|
|
136
90
|
def test_returns_true_for_prop_does_not_start_with_one_of_rule_when_the_given_prop_doesn_t_have_a_matching_prefix
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.starts-with-one-of.negative", {"user" => {"email" => "notfoo@prefab.cloud"}}, true)
|
|
140
|
-
rescue Exception => e
|
|
141
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
142
|
-
end
|
|
91
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
92
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.starts-with-one-of.negative", {"user" => {"email" => "notfoo@prefab.cloud"}}, true)
|
|
143
93
|
end
|
|
144
94
|
|
|
145
95
|
# returns false for PROP_DOES_NOT_START_WITH_ONE_OF rule when the given prop has a matching prefix
|
|
146
96
|
def test_returns_false_for_prop_does_not_start_with_one_of_rule_when_the_given_prop_has_a_matching_prefix
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.starts-with-one-of.negative", {"user" => {"email" => "foo@prefab.cloud"}}, false)
|
|
150
|
-
rescue Exception => e
|
|
151
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
152
|
-
end
|
|
97
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
98
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.starts-with-one-of.negative", {"user" => {"email" => "foo@prefab.cloud"}}, false)
|
|
153
99
|
end
|
|
154
100
|
|
|
155
101
|
# returns true for PROP_CONTAINS_ONE_OF rule when the given prop has a matching substring
|
|
156
102
|
def test_returns_true_for_prop_contains_one_of_rule_when_the_given_prop_has_a_matching_substring
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.contains-one-of.positive", {"user" => {"email" => "somefoo@prefab.cloud"}}, true)
|
|
160
|
-
rescue Exception => e
|
|
161
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
162
|
-
end
|
|
103
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
104
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.contains-one-of.positive", {"user" => {"email" => "somefoo@prefab.cloud"}}, true)
|
|
163
105
|
end
|
|
164
106
|
|
|
165
107
|
# returns false for PROP_CONTAINS_ONE_OF rule when the given prop doesn't have a matching substring
|
|
166
108
|
def test_returns_false_for_prop_contains_one_of_rule_when_the_given_prop_doesn_t_have_a_matching_substring
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.contains-one-of.positive", {"user" => {"email" => "info@prefab.cloud"}}, false)
|
|
170
|
-
rescue Exception => e
|
|
171
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
172
|
-
end
|
|
109
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
110
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.contains-one-of.positive", {"user" => {"email" => "info@prefab.cloud"}}, false)
|
|
173
111
|
end
|
|
174
112
|
|
|
175
113
|
# returns true for PROP_DOES_NOT_CONTAIN_ONE_OF rule when the given prop doesn't have a matching substring
|
|
176
114
|
def test_returns_true_for_prop_does_not_contain_one_of_rule_when_the_given_prop_doesn_t_have_a_matching_substring
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.contains-one-of.negative", {"user" => {"email" => "info@prefab.cloud"}}, true)
|
|
180
|
-
rescue Exception => e
|
|
181
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
182
|
-
end
|
|
115
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
116
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.contains-one-of.negative", {"user" => {"email" => "info@prefab.cloud"}}, true)
|
|
183
117
|
end
|
|
184
118
|
|
|
185
119
|
# returns false for PROP_DOES_NOT_CONTAIN_ONE_OF rule when the given prop has a matching substring
|
|
186
120
|
def test_returns_false_for_prop_does_not_contain_one_of_rule_when_the_given_prop_has_a_matching_substring
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.contains-one-of.negative", {"user" => {"email" => "notfoo@prefab.cloud"}}, false)
|
|
190
|
-
rescue Exception => e
|
|
191
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
192
|
-
end
|
|
121
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
122
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.contains-one-of.negative", {"user" => {"email" => "notfoo@prefab.cloud"}}, false)
|
|
193
123
|
end
|
|
194
124
|
|
|
195
125
|
# returns true for IN_SEG when the segment rule matches
|
|
196
126
|
def test_returns_true_for_in_seg_when_the_segment_rule_matches
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-segment.positive", {"user" => {"key" => "lauren"}}, true)
|
|
200
|
-
rescue Exception => e
|
|
201
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
202
|
-
end
|
|
127
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
128
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-segment.positive", {"user" => {"key" => "lauren"}}, true)
|
|
203
129
|
end
|
|
204
130
|
|
|
205
131
|
# returns false for IN_SEG when the segment rule doesn't match
|
|
206
132
|
def test_returns_false_for_in_seg_when_the_segment_rule_doesn_t_match
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-segment.positive", {"user" => {"key" => "josh"}}, false)
|
|
210
|
-
rescue Exception => e
|
|
211
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
212
|
-
end
|
|
133
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
134
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-segment.positive", {"user" => {"key" => "josh"}}, false)
|
|
213
135
|
end
|
|
214
136
|
|
|
215
137
|
# returns false for IN_SEG if any segment rule fails to match
|
|
216
138
|
def test_returns_false_for_in_seg_if_any_segment_rule_fails_to_match
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-and", {"user" => {"key" => "josh"}, "" => {"domain" => "prefab.cloud"}}, false)
|
|
220
|
-
rescue Exception => e
|
|
221
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
222
|
-
end
|
|
139
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
140
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-seg.segment-and", {"user" => {"key" => "josh"}, "" => {"domain" => "prefab.cloud"}}, false)
|
|
223
141
|
end
|
|
224
142
|
|
|
225
143
|
# returns true for IN_SEG (segment-and) if all rules matches
|
|
226
144
|
def test_returns_true_for_in_seg_segment_and_if_all_rules_matches
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-and", {"user" => {"key" => "michael"}, "" => {"domain" => "prefab.cloud"}}, true)
|
|
230
|
-
rescue Exception => e
|
|
231
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
232
|
-
end
|
|
145
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
146
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-seg.segment-and", {"user" => {"key" => "michael"}, "" => {"domain" => "prefab.cloud"}}, true)
|
|
233
147
|
end
|
|
234
148
|
|
|
235
149
|
# returns true for IN_SEG (segment-or) if any segment rule matches (lookup)
|
|
236
150
|
def test_returns_true_for_in_seg_segment_or_if_any_segment_rule_matches_lookup
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-or", {"user" => {"key" => "michael"}, "" => {"domain" => "example.com"}}, true)
|
|
240
|
-
rescue Exception => e
|
|
241
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
242
|
-
end
|
|
151
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
152
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-seg.segment-or", {"user" => {"key" => "michael"}, "" => {"domain" => "example.com"}}, true)
|
|
243
153
|
end
|
|
244
154
|
|
|
245
155
|
# returns true for IN_SEG (segment-or) if any segment rule matches (prop)
|
|
246
156
|
def test_returns_true_for_in_seg_segment_or_if_any_segment_rule_matches_prop
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-or", {"user" => {"key" => "nobody"}, "" => {"domain" => "gmail.com"}}, true)
|
|
250
|
-
rescue Exception => e
|
|
251
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
252
|
-
end
|
|
157
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
158
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-seg.segment-or", {"user" => {"key" => "nobody"}, "" => {"domain" => "gmail.com"}}, true)
|
|
253
159
|
end
|
|
254
160
|
|
|
255
161
|
# returns true for NOT_IN_SEG when the segment rule doesn't match
|
|
256
162
|
def test_returns_true_for_not_in_seg_when_the_segment_rule_doesn_t_match
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-segment.negative", {"user" => {"key" => "josh"}}, true)
|
|
260
|
-
rescue Exception => e
|
|
261
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
262
|
-
end
|
|
163
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
164
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-segment.negative", {"user" => {"key" => "josh"}}, true)
|
|
263
165
|
end
|
|
264
166
|
|
|
265
167
|
# returns false for NOT_IN_SEG when the segment rule matches
|
|
266
168
|
def test_returns_false_for_not_in_seg_when_the_segment_rule_matches
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-segment.negative", {"user" => {"key" => "michael"}}, false)
|
|
270
|
-
rescue Exception => e
|
|
271
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
272
|
-
end
|
|
169
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
170
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-segment.negative", {"user" => {"key" => "michael"}}, false)
|
|
273
171
|
end
|
|
274
172
|
|
|
275
173
|
# returns false for NOT_IN_SEG if any segment rule matches
|
|
276
174
|
def test_returns_false_for_not_in_seg_if_any_segment_rule_matches
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-segment.multiple-criteria.negative", {"user" => {"key" => "josh"}, "" => {"domain" => "prefab.cloud"}}, true)
|
|
280
|
-
rescue Exception => e
|
|
281
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
282
|
-
end
|
|
175
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
176
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-segment.multiple-criteria.negative", {"user" => {"key" => "josh"}, "" => {"domain" => "prefab.cloud"}}, true)
|
|
283
177
|
end
|
|
284
178
|
|
|
285
179
|
# returns true for NOT_IN_SEG if no segment rule matches
|
|
286
180
|
def test_returns_true_for_not_in_seg_if_no_segment_rule_matches
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-segment.multiple-criteria.negative", {"user" => {"key" => "josh"}, "" => {"domain" => "something.com"}}, true)
|
|
290
|
-
rescue Exception => e
|
|
291
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
292
|
-
end
|
|
181
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
182
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-segment.multiple-criteria.negative", {"user" => {"key" => "josh"}, "" => {"domain" => "something.com"}}, true)
|
|
293
183
|
end
|
|
294
184
|
|
|
295
185
|
# returns true for NOT_IN_SEG (segment-and) if not segment rule fails to match
|
|
296
186
|
def test_returns_true_for_not_in_seg_segment_and_if_not_segment_rule_fails_to_match
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.not-in-seg.segment-and", {"user" => {"key" => "josh"}, "" => {"domain" => "prefab.cloud"}}, true)
|
|
300
|
-
rescue Exception => e
|
|
301
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
302
|
-
end
|
|
187
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
188
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.not-in-seg.segment-and", {"user" => {"key" => "josh"}, "" => {"domain" => "prefab.cloud"}}, true)
|
|
303
189
|
end
|
|
304
190
|
|
|
305
191
|
# returns true for IN_SEG (segment-and) if not segment rule fails to match
|
|
306
192
|
def test_returns_true_for_in_seg_segment_and_if_not_segment_rule_fails_to_match
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-and", {"user" => {"key" => "josh"}, "" => {"domain" => "prefab.cloud"}}, false)
|
|
310
|
-
rescue Exception => e
|
|
311
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
312
|
-
end
|
|
193
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
194
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.in-seg.segment-and", {"user" => {"key" => "josh"}, "" => {"domain" => "prefab.cloud"}}, false)
|
|
313
195
|
end
|
|
314
196
|
|
|
315
197
|
# returns false for NOT_IN_SEG (segment-and) if segment rules matches
|
|
316
198
|
def test_returns_false_for_not_in_seg_segment_and_if_segment_rules_matches
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.not-in-seg.segment-and", {"user" => {"key" => "michael"}, "" => {"domain" => "prefab.cloud"}}, false)
|
|
320
|
-
rescue Exception => e
|
|
321
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
322
|
-
end
|
|
199
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
200
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.not-in-seg.segment-and", {"user" => {"key" => "michael"}, "" => {"domain" => "prefab.cloud"}}, false)
|
|
323
201
|
end
|
|
324
202
|
|
|
325
203
|
# returns true for NOT_IN_SEG (segment-or) if no segment rule matches
|
|
326
204
|
def test_returns_true_for_not_in_seg_segment_or_if_no_segment_rule_matches
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.not-in-seg.segment-or", {"user" => {"key" => "nobody"}, "" => {"domain" => "example.com"}}, true)
|
|
330
|
-
rescue Exception => e
|
|
331
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
332
|
-
end
|
|
205
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
206
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.not-in-seg.segment-or", {"user" => {"key" => "nobody"}, "" => {"domain" => "example.com"}}, true)
|
|
333
207
|
end
|
|
334
208
|
|
|
335
209
|
# returns false for NOT_IN_SEG (segment-or) if one segment rule matches (prop)
|
|
336
210
|
def test_returns_false_for_not_in_seg_segment_or_if_one_segment_rule_matches_prop
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.not-in-seg.segment-or", {"user" => {"key" => "nobody"}, "" => {"domain" => "gmail.com"}}, false)
|
|
340
|
-
rescue Exception => e
|
|
341
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
342
|
-
end
|
|
211
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
212
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.not-in-seg.segment-or", {"user" => {"key" => "nobody"}, "" => {"domain" => "gmail.com"}}, false)
|
|
343
213
|
end
|
|
344
214
|
|
|
345
215
|
# returns false for NOT_IN_SEG (segment-or) if one segment rule matches (lookup)
|
|
346
216
|
def test_returns_false_for_not_in_seg_segment_or_if_one_segment_rule_matches_lookup
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.not-in-seg.segment-or", {"user" => {"key" => "michael"}, "" => {"domain" => "example.com"}}, false)
|
|
350
|
-
rescue Exception => e
|
|
351
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
352
|
-
end
|
|
217
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
218
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.not-in-seg.segment-or", {"user" => {"key" => "michael"}, "" => {"domain" => "example.com"}}, false)
|
|
353
219
|
end
|
|
354
220
|
|
|
355
221
|
# returns true for PROP_BEFORE rule when the given prop represents a date (string) before the rule's time
|
|
356
222
|
def test_returns_true_for_prop_before_rule_when_the_given_prop_represents_a_date_string_before_the_rule_s_time
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.before", {"user" => {"creation_date" => "2024-11-01T00:00:00Z"}}, true)
|
|
360
|
-
rescue Exception => e
|
|
361
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
362
|
-
end
|
|
223
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
224
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.before", {"user" => {"creation_date" => "2024-11-01T00:00:00Z"}}, true)
|
|
363
225
|
end
|
|
364
226
|
|
|
365
227
|
# returns true for PROP_BEFORE rule when the given prop represents a date (number) before the rule's time
|
|
366
228
|
def test_returns_true_for_prop_before_rule_when_the_given_prop_represents_a_date_number_before_the_rule_s_time
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.before", {"user" => {"creation_date" => 1730419200000}}, true)
|
|
370
|
-
rescue Exception => e
|
|
371
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
372
|
-
end
|
|
229
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
230
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.before", {"user" => {"creation_date" => 1730419200000}}, true)
|
|
373
231
|
end
|
|
374
232
|
|
|
375
233
|
# returns false for PROP_BEFORE rule when the given prop represents a date (number) exactly matching rule's time
|
|
376
234
|
def test_returns_false_for_prop_before_rule_when_the_given_prop_represents_a_date_number_exactly_matching_rule_s_time
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.before", {"user" => {"creation_date" => 1733011200000}}, false)
|
|
380
|
-
rescue Exception => e
|
|
381
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
382
|
-
end
|
|
235
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
236
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.before", {"user" => {"creation_date" => 1733011200000}}, false)
|
|
383
237
|
end
|
|
384
238
|
|
|
385
239
|
# returns false for PROP_BEFORE rule when the given prop represents a date (number) AFTER the rule's time
|
|
386
240
|
def test_returns_false_for_prop_before_rule_when_the_given_prop_represents_a_date_number_after_the_rule_s_time
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.before", {"user" => {"creation_date" => "2025-01-01T00:00:00Z"}}, false)
|
|
390
|
-
rescue Exception => e
|
|
391
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
392
|
-
end
|
|
241
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
242
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.before", {"user" => {"creation_date" => "2025-01-01T00:00:00Z"}}, false)
|
|
393
243
|
end
|
|
394
244
|
|
|
395
245
|
# returns false for PROP_BEFORE rule when the given prop won't parse as a date
|
|
396
246
|
def test_returns_false_for_prop_before_rule_when_the_given_prop_won_t_parse_as_a_date
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.before", {"user" => {"creation_date" => "not a date"}}, false)
|
|
400
|
-
rescue Exception => e
|
|
401
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
402
|
-
end
|
|
247
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
248
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.before", {"user" => {"creation_date" => "not a date"}}, false)
|
|
403
249
|
end
|
|
404
250
|
|
|
405
251
|
# returns false for PROP_BEFORE rule using current-time relative to 2050-01-01
|
|
406
252
|
def test_returns_false_for_prop_before_rule_using_current_time_relative_to_2050_01_01
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.before.current-time", {}, true)
|
|
410
|
-
rescue Exception => e
|
|
411
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
412
|
-
end
|
|
253
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
254
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.before.current-time", {}, true)
|
|
413
255
|
end
|
|
414
256
|
|
|
415
257
|
# returns true for PROP_AFTER rule when the given prop represents a date (string) after the rule's time
|
|
416
258
|
def test_returns_true_for_prop_after_rule_when_the_given_prop_represents_a_date_string_after_the_rule_s_time
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.after", {"user" => {"creation_date" => "2025-01-01T00:00:00Z"}}, true)
|
|
420
|
-
rescue Exception => e
|
|
421
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
422
|
-
end
|
|
259
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
260
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.after", {"user" => {"creation_date" => "2025-01-01T00:00:00Z"}}, true)
|
|
423
261
|
end
|
|
424
262
|
|
|
425
263
|
# returns true for PROP_AFTER rule when the given prop represents a date (number) after the rule's time
|
|
426
264
|
def test_returns_true_for_prop_after_rule_when_the_given_prop_represents_a_date_number_after_the_rule_s_time
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.after", {"user" => {"creation_date" => 1735689600000}}, true)
|
|
430
|
-
rescue Exception => e
|
|
431
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
432
|
-
end
|
|
265
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
266
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.after", {"user" => {"creation_date" => 1735689600000}}, true)
|
|
433
267
|
end
|
|
434
268
|
|
|
435
269
|
# returns false for PROP_AFTER rule when the given prop represents a date (number) exactly matching rule's time
|
|
436
270
|
def test_returns_false_for_prop_after_rule_when_the_given_prop_represents_a_date_number_exactly_matching_rule_s_time
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.after", {"user" => {"creation_date" => 1733011200000}}, false)
|
|
440
|
-
rescue Exception => e
|
|
441
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
442
|
-
end
|
|
271
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
272
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.after", {"user" => {"creation_date" => 1733011200000}}, false)
|
|
443
273
|
end
|
|
444
274
|
|
|
445
275
|
# returns false for PROP_BEFORE rule when the given prop represents a date (number) BEFORE the rule's time
|
|
446
276
|
def test_returns_false_for_prop_before_rule_when_the_given_prop_represents_a_date_number_before_the_rule_s_time
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.after", {"user" => {"creation_date" => "2024-01-01T00:00:00Z"}}, false)
|
|
450
|
-
rescue Exception => e
|
|
451
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
452
|
-
end
|
|
277
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
278
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.after", {"user" => {"creation_date" => "2024-01-01T00:00:00Z"}}, false)
|
|
453
279
|
end
|
|
454
280
|
|
|
455
281
|
# returns false for PROP_AFTER rule when the given prop won't parse as a date
|
|
456
282
|
def test_returns_false_for_prop_after_rule_when_the_given_prop_won_t_parse_as_a_date
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.after", {"user" => {"creation_date" => "not a date"}}, false)
|
|
460
|
-
rescue Exception => e
|
|
461
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
462
|
-
end
|
|
283
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
284
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.after", {"user" => {"creation_date" => "not a date"}}, false)
|
|
463
285
|
end
|
|
464
286
|
|
|
465
287
|
# returns false for PROP_AFTER rule using current-time relative to 2025-01-01
|
|
466
288
|
def test_returns_false_for_prop_after_rule_using_current_time_relative_to_2025_01_01
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.after.current-time", {}, true)
|
|
470
|
-
rescue Exception => e
|
|
471
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
472
|
-
end
|
|
289
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
290
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.after.current-time", {}, true)
|
|
473
291
|
end
|
|
474
292
|
|
|
475
293
|
# returns true for PROP_LESS_THAN rule when the given prop is less than the rule's value
|
|
476
294
|
def test_returns_true_for_prop_less_than_rule_when_the_given_prop_is_less_than_the_rule_s_value
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.less-than", {"user" => {"age" => 20}}, true)
|
|
480
|
-
rescue Exception => e
|
|
481
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
482
|
-
end
|
|
295
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
296
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.less-than", {"user" => {"age" => 20}}, true)
|
|
483
297
|
end
|
|
484
298
|
|
|
485
299
|
# returns true for PROP_LESS_THAN rule when the given prop is less than the rule's value (float)
|
|
486
300
|
def test_returns_true_for_prop_less_than_rule_when_the_given_prop_is_less_than_the_rule_s_value_float
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.less-than", {"user" => {"age" => 20.5}}, true)
|
|
490
|
-
rescue Exception => e
|
|
491
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
492
|
-
end
|
|
301
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
302
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.less-than", {"user" => {"age" => 20.5}}, true)
|
|
493
303
|
end
|
|
494
304
|
|
|
495
305
|
# returns false for PROP_LESS_THAN rule when the given prop is equal to rule's value
|
|
496
306
|
def test_returns_false_for_prop_less_than_rule_when_the_given_prop_is_equal_to_rule_s_value
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.less-than", {"user" => {"age" => 30}}, false)
|
|
500
|
-
rescue Exception => e
|
|
501
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
502
|
-
end
|
|
307
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
308
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.less-than", {"user" => {"age" => 30}}, false)
|
|
503
309
|
end
|
|
504
310
|
|
|
505
311
|
# returns false for PROP_LESS_THAN rule when the given prop a string
|
|
506
312
|
def test_returns_false_for_prop_less_than_rule_when_the_given_prop_a_string
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.less-than", {"user" => {"age" => "20"}}, false)
|
|
510
|
-
rescue Exception => e
|
|
511
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
512
|
-
end
|
|
313
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
314
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.less-than", {"user" => {"age" => "20"}}, false)
|
|
513
315
|
end
|
|
514
316
|
|
|
515
317
|
# returns true for PROP_LESS_THAN_OR_EQUAL rule when the given prop is less than the rule's value
|
|
516
318
|
def test_returns_true_for_prop_less_than_or_equal_rule_when_the_given_prop_is_less_than_the_rule_s_value
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.less-than-or-equal", {"user" => {"age" => 20}}, true)
|
|
520
|
-
rescue Exception => e
|
|
521
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
522
|
-
end
|
|
319
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
320
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.less-than-or-equal", {"user" => {"age" => 20}}, true)
|
|
523
321
|
end
|
|
524
322
|
|
|
525
323
|
# returns true for PROP_LESS_THAN_OR_EQUAL rule when the given prop is less than the rule's value (float)
|
|
526
324
|
def test_returns_true_for_prop_less_than_or_equal_rule_when_the_given_prop_is_less_than_the_rule_s_value_float
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.less-than-or-equal", {"user" => {"age" => 20.5}}, true)
|
|
530
|
-
rescue Exception => e
|
|
531
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
532
|
-
end
|
|
325
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
326
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.less-than-or-equal", {"user" => {"age" => 20.5}}, true)
|
|
533
327
|
end
|
|
534
328
|
|
|
535
329
|
# returns false for PROP_LESS_THAN_OR_EQUAL rule when the given prop is equal to rule's value
|
|
536
330
|
def test_returns_false_for_prop_less_than_or_equal_rule_when_the_given_prop_is_equal_to_rule_s_value
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.less-than-or-equal", {"user" => {"age" => 30}}, true)
|
|
540
|
-
rescue Exception => e
|
|
541
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
542
|
-
end
|
|
331
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
332
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.less-than-or-equal", {"user" => {"age" => 30}}, true)
|
|
543
333
|
end
|
|
544
334
|
|
|
545
335
|
# returns false for PROP_LESS_THAN_OR_EQUAL rule when the given prop a string
|
|
546
336
|
def test_returns_false_for_prop_less_than_or_equal_rule_when_the_given_prop_a_string
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.less-than-or-equal", {"user" => {"age" => "20"}}, false)
|
|
550
|
-
rescue Exception => e
|
|
551
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
552
|
-
end
|
|
337
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
338
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.less-than-or-equal", {"user" => {"age" => "20"}}, false)
|
|
553
339
|
end
|
|
554
340
|
|
|
555
341
|
# returns true for PROP_GREATER_THAN rule when the given prop is greater than the rule's value
|
|
556
342
|
def test_returns_true_for_prop_greater_than_rule_when_the_given_prop_is_greater_than_the_rule_s_value
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than", {"user" => {"age" => 100}}, true)
|
|
560
|
-
rescue Exception => e
|
|
561
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
562
|
-
end
|
|
343
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
344
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than", {"user" => {"age" => 100}}, true)
|
|
563
345
|
end
|
|
564
346
|
|
|
565
347
|
# returns true for PROP_GREATER_THAN rule when the given prop is greater than the rule's value (float)
|
|
566
348
|
def test_returns_true_for_prop_greater_than_rule_when_the_given_prop_is_greater_than_the_rule_s_value_float
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than", {"user" => {"age" => 30.5}}, true)
|
|
570
|
-
rescue Exception => e
|
|
571
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
572
|
-
end
|
|
349
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
350
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than", {"user" => {"age" => 30.5}}, true)
|
|
573
351
|
end
|
|
574
352
|
|
|
575
353
|
# returns true for PROP_GREATER_THAN rule when the given prop is greater than the rule's float value (float)
|
|
576
354
|
def test_returns_true_for_prop_greater_than_rule_when_the_given_prop_is_greater_than_the_rule_s_float_value_float
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than.double", {"user" => {"age" => 32.7}}, true)
|
|
580
|
-
rescue Exception => e
|
|
581
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
582
|
-
end
|
|
355
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
356
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than.double", {"user" => {"age" => 32.7}}, true)
|
|
583
357
|
end
|
|
584
358
|
|
|
585
359
|
# returns true for PROP_GREATER_THAN rule when the given prop is greater than the rule's float value (integer)
|
|
586
360
|
def test_returns_true_for_prop_greater_than_rule_when_the_given_prop_is_greater_than_the_rule_s_float_value_integer
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than.double", {"user" => {"age" => 32}}, true)
|
|
590
|
-
rescue Exception => e
|
|
591
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
592
|
-
end
|
|
361
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
362
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than.double", {"user" => {"age" => 32}}, true)
|
|
593
363
|
end
|
|
594
364
|
|
|
595
365
|
# returns false for PROP_GREATER_THAN rule when the given prop is equal to rule's value
|
|
596
366
|
def test_returns_false_for_prop_greater_than_rule_when_the_given_prop_is_equal_to_rule_s_value
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than", {"user" => {"age" => 30}}, false)
|
|
600
|
-
rescue Exception => e
|
|
601
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
602
|
-
end
|
|
367
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
368
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than", {"user" => {"age" => 30}}, false)
|
|
603
369
|
end
|
|
604
370
|
|
|
605
371
|
# returns false for PROP_GREATER_THAN rule when the given prop a string
|
|
606
372
|
def test_returns_false_for_prop_greater_than_rule_when_the_given_prop_a_string
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than", {"user" => {"age" => "100"}}, false)
|
|
610
|
-
rescue Exception => e
|
|
611
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
612
|
-
end
|
|
373
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
374
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than", {"user" => {"age" => "100"}}, false)
|
|
613
375
|
end
|
|
614
376
|
|
|
615
377
|
# returns true for PROP_GREATER_THAN_OR_EQUAL rule when the given prop is greater than the rule's value
|
|
616
378
|
def test_returns_true_for_prop_greater_than_or_equal_rule_when_the_given_prop_is_greater_than_the_rule_s_value
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than-or-equal", {"user" => {"age" => 30}}, true)
|
|
620
|
-
rescue Exception => e
|
|
621
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
622
|
-
end
|
|
379
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
380
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than-or-equal", {"user" => {"age" => 30}}, true)
|
|
623
381
|
end
|
|
624
382
|
|
|
625
383
|
# returns true for PROP_GREATER_THAN_OR_EQUAL rule when the given prop is greater than the rule's value (float)
|
|
626
384
|
def test_returns_true_for_prop_greater_than_or_equal_rule_when_the_given_prop_is_greater_than_the_rule_s_value_float
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than-or-equal", {"user" => {"age" => 30.5}}, true)
|
|
630
|
-
rescue Exception => e
|
|
631
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
632
|
-
end
|
|
385
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
386
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than-or-equal", {"user" => {"age" => 30.5}}, true)
|
|
633
387
|
end
|
|
634
388
|
|
|
635
389
|
# returns true for PROP_GREATER_THAN_OR_EQUAL rule when the given prop is equal to rule's value
|
|
636
390
|
def test_returns_true_for_prop_greater_than_or_equal_rule_when_the_given_prop_is_equal_to_rule_s_value
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than-or-equal", {"user" => {"age" => 30}}, true)
|
|
640
|
-
rescue Exception => e
|
|
641
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
642
|
-
end
|
|
391
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
392
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than-or-equal", {"user" => {"age" => 30}}, true)
|
|
643
393
|
end
|
|
644
394
|
|
|
645
395
|
# returns false for PROP_GREATER_THAN_OR_EQUAL rule when the given prop a string
|
|
646
396
|
def test_returns_false_for_prop_greater_than_or_equal_rule_when_the_given_prop_a_string
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.greater-than-or-equal", {"user" => {"age" => "100"}}, false)
|
|
650
|
-
rescue Exception => e
|
|
651
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
652
|
-
end
|
|
397
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
398
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.greater-than-or-equal", {"user" => {"age" => "100"}}, false)
|
|
653
399
|
end
|
|
654
400
|
|
|
655
401
|
# returns true for PROP_MATCHES rule when the given prop matches the regex
|
|
656
402
|
def test_returns_true_for_prop_matches_rule_when_the_given_prop_matches_the_regex
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.matches", {"user" => {"code" => "aaaaaab"}}, true)
|
|
660
|
-
rescue Exception => e
|
|
661
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
662
|
-
end
|
|
403
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
404
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.matches", {"user" => {"code" => "aaaaaab"}}, true)
|
|
663
405
|
end
|
|
664
406
|
|
|
665
407
|
# returns false for PROP_MATCHES rule when the given prop does not match the regex
|
|
666
408
|
def test_returns_false_for_prop_matches_rule_when_the_given_prop_does_not_match_the_regex
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.matches", {"user" => {"code" => "aa"}}, false)
|
|
670
|
-
rescue Exception => e
|
|
671
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
672
|
-
end
|
|
409
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
410
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.matches", {"user" => {"code" => "aa"}}, false)
|
|
673
411
|
end
|
|
674
412
|
|
|
675
413
|
# returns true for PROP_DOES_NOT_MATCH rule when the given prop does not match the regex
|
|
676
414
|
def test_returns_true_for_prop_does_not_match_rule_when_the_given_prop_does_not_match_the_regex
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.does-not-match", {"user" => {"code" => "b"}}, true)
|
|
680
|
-
rescue Exception => e
|
|
681
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
682
|
-
end
|
|
415
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
416
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.does-not-match", {"user" => {"code" => "b"}}, true)
|
|
683
417
|
end
|
|
684
418
|
|
|
685
419
|
# returns false for PROP_DOES_NOT_MATCH rule when the given prop matches the regex
|
|
686
420
|
def test_returns_false_for_prop_does_not_match_rule_when_the_given_prop_matches_the_regex
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.does-not-match", {"user" => {"code" => "aabb"}}, false)
|
|
690
|
-
rescue Exception => e
|
|
691
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
692
|
-
end
|
|
421
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
422
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.does-not-match", {"user" => {"code" => "aabb"}}, false)
|
|
693
423
|
end
|
|
694
424
|
|
|
695
425
|
# returns true for PROP_SEMVER_EQUAL rule when the given prop equals the version
|
|
696
426
|
def test_returns_true_for_prop_semver_equal_rule_when_the_given_prop_equals_the_version
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.semver-equal", {"app" => {"version" => "2.0.0"}}, true)
|
|
700
|
-
rescue Exception => e
|
|
701
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
702
|
-
end
|
|
427
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
428
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.semver-equal", {"app" => {"version" => "2.0.0"}}, true)
|
|
703
429
|
end
|
|
704
430
|
|
|
705
431
|
# returns false for PROP_SEMVER_EQUAL rule when the given prop does not equal the version
|
|
706
432
|
def test_returns_false_for_prop_semver_equal_rule_when_the_given_prop_does_not_equal_the_version
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.semver-equal", {"app" => {"version" => "2.0.1"}}, false)
|
|
710
|
-
rescue Exception => e
|
|
711
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
712
|
-
end
|
|
433
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
434
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.semver-equal", {"app" => {"version" => "2.0.1"}}, false)
|
|
713
435
|
end
|
|
714
436
|
|
|
715
437
|
# returns false for PROP_SEMVER_EQUAL rule when the given prop is not a valid semver
|
|
716
438
|
def test_returns_false_for_prop_semver_equal_rule_when_the_given_prop_is_not_a_valid_semver
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.semver-equal", {"app" => {"version" => "2.0"}}, false)
|
|
720
|
-
rescue Exception => e
|
|
721
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
722
|
-
end
|
|
439
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
440
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.semver-equal", {"app" => {"version" => "2.0"}}, false)
|
|
723
441
|
end
|
|
724
442
|
|
|
725
443
|
# returns true for PROP_SEMVER_LESS_THAN rule when the given prop is less than 2.0.0
|
|
726
444
|
def test_returns_true_for_prop_semver_less_than_rule_when_the_given_prop_is_less_than_2_0_0
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.semver-less-than", {"app" => {"version" => "1.5.1"}}, true)
|
|
730
|
-
rescue Exception => e
|
|
731
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
732
|
-
end
|
|
445
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
446
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.semver-less-than", {"app" => {"version" => "1.5.1"}}, true)
|
|
733
447
|
end
|
|
734
448
|
|
|
735
449
|
# returns false for PROP_SEMVER_LESS_THAN rule when the given prop equals the version
|
|
736
450
|
def test_returns_false_for_prop_semver_less_than_rule_when_the_given_prop_equals_the_version
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.semver-less-than", {"app" => {"version" => "2.0.0"}}, false)
|
|
740
|
-
rescue Exception => e
|
|
741
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
742
|
-
end
|
|
451
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
452
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.semver-less-than", {"app" => {"version" => "2.0.0"}}, false)
|
|
743
453
|
end
|
|
744
454
|
|
|
745
455
|
# returns false for PROP_SEMVER_LESS_THAN rule when the given prop is greater than the version
|
|
746
456
|
def test_returns_false_for_prop_semver_less_than_rule_when_the_given_prop_is_greater_than_the_version
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.semver-less-than", {"app" => {"version" => "2.2.1"}}, false)
|
|
750
|
-
rescue Exception => e
|
|
751
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
752
|
-
end
|
|
457
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
458
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.semver-less-than", {"app" => {"version" => "2.2.1"}}, false)
|
|
753
459
|
end
|
|
754
460
|
|
|
755
461
|
# returns true for PROP_SEMVER_GREATER_THAN rule when the given prop is greater than 2.0.0
|
|
756
462
|
def test_returns_true_for_prop_semver_greater_than_rule_when_the_given_prop_is_greater_than_2_0_0
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.semver-greater-than", {"app" => {"version" => "2.5.1"}}, true)
|
|
760
|
-
rescue Exception => e
|
|
761
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
762
|
-
end
|
|
463
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
464
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.semver-greater-than", {"app" => {"version" => "2.5.1"}}, true)
|
|
763
465
|
end
|
|
764
466
|
|
|
765
467
|
# returns false for PROP_SEMVER_GREATER_THAN rule when the given prop equals the version
|
|
766
468
|
def test_returns_false_for_prop_semver_greater_than_rule_when_the_given_prop_equals_the_version
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.semver-greater-than", {"app" => {"version" => "2.0.0"}}, false)
|
|
770
|
-
rescue Exception => e
|
|
771
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
772
|
-
end
|
|
469
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
470
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.semver-greater-than", {"app" => {"version" => "2.0.0"}}, false)
|
|
773
471
|
end
|
|
774
472
|
|
|
775
473
|
# returns false for PROP_SEMVER_EQUAL rule when the given prop is less than the version
|
|
776
474
|
def test_returns_false_for_prop_semver_equal_rule_when_the_given_prop_is_less_than_the_version
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.semver-greater-than", {"app" => {"version" => "0.0.5"}}, false)
|
|
780
|
-
rescue Exception => e
|
|
781
|
-
skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
|
|
782
|
-
end
|
|
475
|
+
resolver = IntegrationTestHelpers.build_resolver(@store)
|
|
476
|
+
IntegrationTestHelpers.assert_enabled(resolver, "feature-flag.semver-greater-than", {"app" => {"version" => "0.0.5"}}, false)
|
|
783
477
|
end
|
|
784
478
|
end
|