quonfig 0.0.6 → 0.0.9

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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/VERSION +1 -1
  4. data/lib/quonfig/bound_client.rb +26 -0
  5. data/lib/quonfig/client.rb +212 -3
  6. data/lib/quonfig/context.rb +10 -1
  7. data/lib/quonfig/datadir.rb +2 -4
  8. data/lib/quonfig/dev_context.rb +41 -0
  9. data/lib/quonfig/errors/decryption_error.rb +20 -0
  10. data/lib/quonfig/errors/env_var_parse_error.rb +8 -1
  11. data/lib/quonfig/errors/invalid_environment_error.rb +19 -0
  12. data/lib/quonfig/errors/missing_environment_error.rb +18 -0
  13. data/lib/quonfig/evaluator.rb +84 -3
  14. data/lib/quonfig/http_connection.rb +1 -1
  15. data/lib/quonfig/options.rb +4 -1
  16. data/lib/quonfig/resolver.rb +215 -2
  17. data/lib/quonfig/stdlib_formatter.rb +95 -0
  18. data/lib/quonfig/telemetry/context_shape.rb +33 -0
  19. data/lib/quonfig/telemetry/context_shape_aggregator.rb +82 -0
  20. data/lib/quonfig/telemetry/evaluation_summaries_aggregator.rb +119 -0
  21. data/lib/quonfig/telemetry/example_contexts_aggregator.rb +101 -0
  22. data/lib/quonfig/telemetry/telemetry_reporter.rb +212 -0
  23. data/lib/quonfig.rb +10 -0
  24. data/quonfig.gemspec +23 -4
  25. data/test/integration/test_context_precedence.rb +35 -117
  26. data/test/integration/test_datadir_environment.rb +15 -37
  27. data/test/integration/test_dev_overrides.rb +40 -0
  28. data/test/integration/test_enabled.rb +157 -463
  29. data/test/integration/test_enabled_with_contexts.rb +19 -49
  30. data/test/integration/test_get.rb +43 -131
  31. data/test/integration/test_get_feature_flag.rb +7 -13
  32. data/test/integration/test_get_or_raise.rb +19 -45
  33. data/test/integration/test_get_weighted_values.rb +9 -4
  34. data/test/integration/test_helpers.rb +532 -4
  35. data/test/integration/test_post.rb +15 -5
  36. data/test/integration/test_telemetry.rb +77 -21
  37. data/test/test_client_telemetry.rb +175 -0
  38. data/test/test_context.rb +4 -1
  39. data/test/test_context_shape.rb +37 -0
  40. data/test/test_context_shape_aggregator.rb +126 -0
  41. data/test/test_datadir.rb +6 -2
  42. data/test/test_dev_context.rb +163 -0
  43. data/test/test_evaluation_summaries_aggregator.rb +180 -0
  44. data/test/test_example_contexts_aggregator.rb +119 -0
  45. data/test/test_http_connection.rb +1 -1
  46. data/test/test_resolver.rb +149 -2
  47. data/test/test_should_log.rb +186 -0
  48. data/test/test_stdlib_formatter.rb +195 -0
  49. data/test/test_telemetry_reporter.rb +209 -0
  50. metadata +22 -3
  51. 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 `bundle exec ruby scripts/generate_integration_tests.rb`.
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
- begin
18
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
28
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
38
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
48
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
58
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
68
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
78
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
88
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
98
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
108
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
118
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
128
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
138
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
148
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
158
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
168
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
178
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
188
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
198
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
208
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
218
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
228
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
238
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
248
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
258
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
268
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
278
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
288
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
298
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
308
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
318
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
328
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
338
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
348
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
358
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
368
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
378
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
388
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
398
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
408
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
418
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
428
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
438
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
448
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
458
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
468
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
478
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
488
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
498
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
508
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
518
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
528
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
538
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
548
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
558
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
568
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
578
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
588
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
598
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
608
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
618
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
628
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
638
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
648
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
658
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
668
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
678
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
688
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
698
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
708
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
718
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
728
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
738
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
748
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
758
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
768
- resolver = IntegrationTestHelpers.build_resolver(@store)
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
- begin
778
- resolver = IntegrationTestHelpers.build_resolver(@store)
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