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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/VERSION +1 -1
  4. data/lib/quonfig/client.rb +109 -2
  5. data/lib/quonfig/context.rb +10 -1
  6. data/lib/quonfig/datadir.rb +2 -4
  7. data/lib/quonfig/errors/decryption_error.rb +20 -0
  8. data/lib/quonfig/errors/env_var_parse_error.rb +8 -1
  9. data/lib/quonfig/errors/invalid_environment_error.rb +19 -0
  10. data/lib/quonfig/errors/missing_environment_error.rb +18 -0
  11. data/lib/quonfig/evaluator.rb +64 -2
  12. data/lib/quonfig/http_connection.rb +1 -1
  13. data/lib/quonfig/resolver.rb +187 -2
  14. data/lib/quonfig/stdlib_formatter.rb +95 -0
  15. data/lib/quonfig/telemetry/context_shape.rb +33 -0
  16. data/lib/quonfig/telemetry/context_shape_aggregator.rb +82 -0
  17. data/lib/quonfig/telemetry/evaluation_summaries_aggregator.rb +119 -0
  18. data/lib/quonfig/telemetry/example_contexts_aggregator.rb +101 -0
  19. data/lib/quonfig/telemetry/telemetry_reporter.rb +200 -0
  20. data/lib/quonfig.rb +8 -0
  21. data/quonfig.gemspec +20 -4
  22. data/test/integration/test_context_precedence.rb +35 -117
  23. data/test/integration/test_datadir_environment.rb +15 -37
  24. data/test/integration/test_enabled.rb +157 -463
  25. data/test/integration/test_enabled_with_contexts.rb +19 -49
  26. data/test/integration/test_get.rb +43 -131
  27. data/test/integration/test_get_feature_flag.rb +7 -13
  28. data/test/integration/test_get_or_raise.rb +19 -45
  29. data/test/integration/test_get_weighted_values.rb +9 -4
  30. data/test/integration/test_helpers.rb +499 -4
  31. data/test/integration/test_post.rb +15 -5
  32. data/test/integration/test_telemetry.rb +63 -21
  33. data/test/test_client_telemetry.rb +132 -0
  34. data/test/test_context.rb +4 -1
  35. data/test/test_context_shape.rb +37 -0
  36. data/test/test_context_shape_aggregator.rb +126 -0
  37. data/test/test_datadir.rb +6 -2
  38. data/test/test_evaluation_summaries_aggregator.rb +180 -0
  39. data/test/test_example_contexts_aggregator.rb +119 -0
  40. data/test/test_http_connection.rb +1 -1
  41. data/test/test_resolver.rb +149 -2
  42. data/test/test_should_log.rb +186 -0
  43. data/test/test_stdlib_formatter.rb +195 -0
  44. data/test/test_telemetry_reporter.rb +209 -0
  45. metadata +19 -3
  46. 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_with_contexts.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,81 +16,49 @@ class TestEnabledWithContexts < Minitest::Test
14
16
 
15
17
  # returns true from global context
16
18
  def test_returns_true_from_global_context
17
- begin
18
- resolver = IntegrationTestHelpers.build_resolver(@store)
19
- IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-and", {"" => {"domain" => "prefab.cloud"}, "user" => {"key" => "michael"}}, 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.in-seg.segment-and", {"" => {"domain" => "prefab.cloud"}, "user" => {"key" => "michael"}}, true)
23
21
  end
24
22
 
25
23
  # returns false due to local context override
26
24
  def test_returns_false_due_to_local_context_override
27
- begin
28
- resolver = IntegrationTestHelpers.build_resolver(@store)
29
- IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-and", {"" => {"domain" => "prefab.cloud"}, "user" => {"key" => "james"}}, 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.in-seg.segment-and", {"" => {"domain" => "prefab.cloud"}, "user" => {"key" => "james"}}, false)
33
27
  end
34
28
 
35
29
  # returns false for untouched scope context
36
30
  def test_returns_false_for_untouched_scope_context
37
- begin
38
- resolver = IntegrationTestHelpers.build_resolver(@store)
39
- IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-and", {"" => {"domain" => "example.com"}, "user" => {"key" => "nobody"}}, false)
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.in-seg.segment-and", {"" => {"domain" => "example.com"}, "user" => {"key" => "nobody"}}, false)
43
33
  end
44
34
 
45
35
  # returns false due to partial scope context override of user.key
46
36
  def test_returns_false_due_to_partial_scope_context_override_of_user_key
47
- begin
48
- resolver = IntegrationTestHelpers.build_resolver(@store)
49
- IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-and", {"" => {"domain" => "example.com"}, "user" => {"key" => "michael"}}, 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.in-seg.segment-and", {"" => {"domain" => "example.com"}, "user" => {"key" => "michael"}}, false)
53
39
  end
54
40
 
55
41
  # returns false due to partial scope context override of domain
56
42
  def test_returns_false_due_to_partial_scope_context_override_of_domain
57
- begin
58
- resolver = IntegrationTestHelpers.build_resolver(@store)
59
- IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-and", {"" => {"domain" => "example.com", "key" => "prefab.cloud"}, "user" => {"key" => "nobody"}}, false)
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.in-seg.segment-and", {"" => {"domain" => "example.com", "key" => "prefab.cloud"}, "user" => {"key" => "nobody"}}, false)
63
45
  end
64
46
 
65
47
  # returns true due to full scope context override of user.key and domain
66
48
  def test_returns_true_due_to_full_scope_context_override_of_user_key_and_domain
67
- begin
68
- resolver = IntegrationTestHelpers.build_resolver(@store)
69
- IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.in-seg.segment-and", {"" => {"domain" => "prefab.cloud"}, "user" => {"key" => "michael"}}, true)
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.in-seg.segment-and", {"" => {"domain" => "prefab.cloud"}, "user" => {"key" => "michael"}}, true)
73
51
  end
74
52
 
75
53
  # returns false for rule with different case on context property name
76
54
  def test_returns_false_for_rule_with_different_case_on_context_property_name
77
- begin
78
- resolver = IntegrationTestHelpers.build_resolver(@store)
79
- IntegrationTestHelpers.assert_resolved(resolver, "mixed.case.property.name", {"user" => {"IsHuman" => "verified"}}, false)
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, "mixed.case.property.name", {"user" => {"IsHuman" => "verified"}}, false)
83
57
  end
84
58
 
85
59
  # returns true for matching case on context property name
86
60
  def test_returns_true_for_matching_case_on_context_property_name
87
- begin
88
- resolver = IntegrationTestHelpers.build_resolver(@store)
89
- IntegrationTestHelpers.assert_resolved(resolver, "mixed.case.property.name", {"user" => {"isHuman" => "verified"}}, true)
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, "mixed.case.property.name", {"user" => {"isHuman" => "verified"}}, true)
93
63
  end
94
64
  end
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # AUTO-GENERATED from integration-test-data/tests/eval/get.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,211 +16,121 @@ class TestGet < Minitest::Test
14
16
 
15
17
  # get returns a found value for key
16
18
  def test_get_returns_a_found_value_for_key
17
- begin
18
- resolver = IntegrationTestHelpers.build_resolver(@store)
19
- IntegrationTestHelpers.assert_resolved(resolver, "my-test-key", {}, "my-test-value")
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_resolved(resolver, "my-test-key", {}, "my-test-value")
23
21
  end
24
22
 
25
23
  # get returns nil if value not found
26
24
  def test_get_returns_nil_if_value_not_found
27
- begin
28
- resolver = IntegrationTestHelpers.build_resolver(@store)
29
- IntegrationTestHelpers.assert_resolved(resolver, "my-missing-key", {}, nil)
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_resolved(resolver, "my-missing-key", {}, nil)
33
27
  end
34
28
 
35
29
  # get returns a default for a missing value if a default is given
36
30
  def test_get_returns_a_default_for_a_missing_value_if_a_default_is_given
37
- begin
38
- resolver = IntegrationTestHelpers.build_resolver(@store)
39
- IntegrationTestHelpers.assert_resolved(resolver, "my-missing-key", {}, "DEFAULT")
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_get_with_default(@store, "my-missing-key", {}, "DEFAULT", "DEFAULT")
43
33
  end
44
34
 
45
35
  # get ignores a provided default if the key is found
46
36
  def test_get_ignores_a_provided_default_if_the_key_is_found
47
- begin
48
- resolver = IntegrationTestHelpers.build_resolver(@store)
49
- IntegrationTestHelpers.assert_resolved(resolver, "my-test-key", {}, "my-test-value")
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_get_with_default(@store, "my-test-key", {}, "DEFAULT", "my-test-value")
53
39
  end
54
40
 
55
41
  # get can return a double
56
42
  def test_get_can_return_a_double
57
- begin
58
- resolver = IntegrationTestHelpers.build_resolver(@store)
59
- IntegrationTestHelpers.assert_resolved(resolver, "my-double-key", {}, 9.95)
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_resolved(resolver, "my-double-key", {}, 9.95)
63
45
  end
64
46
 
65
47
  # get can return a string list
66
48
  def test_get_can_return_a_string_list
67
- begin
68
- resolver = IntegrationTestHelpers.build_resolver(@store)
69
- IntegrationTestHelpers.assert_resolved(resolver, "my-string-list-key", {}, ["a", "b", "c"])
70
- rescue Exception => e
71
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
72
- end
73
- end
74
-
75
- # can return an override based on the default context
76
- def test_can_return_an_override_based_on_the_default_context
77
- begin
78
- resolver = IntegrationTestHelpers.build_resolver(@store)
79
- IntegrationTestHelpers.assert_resolved(resolver, "my-overridden-key", {}, "overridden")
80
- rescue Exception => e
81
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
82
- end
49
+ resolver = IntegrationTestHelpers.build_resolver(@store)
50
+ IntegrationTestHelpers.assert_resolved(resolver, "my-string-list-key", {}, ["a", "b", "c"])
83
51
  end
84
52
 
85
53
  # can return a value provided by an environment variable
86
54
  def test_can_return_a_value_provided_by_an_environment_variable
87
- begin
88
- resolver = IntegrationTestHelpers.build_resolver(@store)
89
- IntegrationTestHelpers.assert_resolved(resolver, "prefab.secrets.encryption.key", {}, "c87ba22d8662282abe8a0e4651327b579cb64a454ab0f4c170b45b15f049a221")
90
- rescue Exception => e
91
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
92
- end
55
+ resolver = IntegrationTestHelpers.build_resolver(@store)
56
+ IntegrationTestHelpers.assert_resolved(resolver, "prefab.secrets.encryption.key", {}, "c87ba22d8662282abe8a0e4651327b579cb64a454ab0f4c170b45b15f049a221")
93
57
  end
94
58
 
95
59
  # can return a value provided by an environment variable after type coercion
96
60
  def test_can_return_a_value_provided_by_an_environment_variable_after_type_coercion
97
- begin
98
- resolver = IntegrationTestHelpers.build_resolver(@store)
99
- IntegrationTestHelpers.assert_resolved(resolver, "provided.a.number", {}, 1234)
100
- rescue Exception => e
101
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
102
- end
61
+ resolver = IntegrationTestHelpers.build_resolver(@store)
62
+ IntegrationTestHelpers.assert_resolved(resolver, "provided.a.number", {}, 1234)
103
63
  end
104
64
 
105
65
  # can decrypt and return a secret value (with decryption key in in env var)
106
66
  def test_can_decrypt_and_return_a_secret_value_with_decryption_key_in_in_env_var
107
- begin
108
- resolver = IntegrationTestHelpers.build_resolver(@store)
109
- IntegrationTestHelpers.assert_resolved(resolver, "a.secret.config", {}, "hello.world")
110
- rescue Exception => e
111
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
112
- end
67
+ resolver = IntegrationTestHelpers.build_resolver(@store)
68
+ IntegrationTestHelpers.assert_resolved(resolver, "a.secret.config", {}, "hello.world")
113
69
  end
114
70
 
115
71
  # duration 200 ms
116
72
  def test_duration_200_ms
117
- begin
118
- resolver = IntegrationTestHelpers.build_resolver(@store)
119
- IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT0.2S", {}, 200)
120
- rescue Exception => e
121
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
122
- end
73
+ resolver = IntegrationTestHelpers.build_resolver(@store)
74
+ IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT0.2S", {}, 200)
123
75
  end
124
76
 
125
77
  # duration 90S
126
78
  def test_duration_90s
127
- begin
128
- resolver = IntegrationTestHelpers.build_resolver(@store)
129
- IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT90S", {}, 90000)
130
- rescue Exception => e
131
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
132
- end
79
+ resolver = IntegrationTestHelpers.build_resolver(@store)
80
+ IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT90S", {}, 90000)
133
81
  end
134
82
 
135
83
  # duration 1.5M
136
84
  def test_duration_1_5m
137
- begin
138
- resolver = IntegrationTestHelpers.build_resolver(@store)
139
- IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT1.5M", {}, 90000)
140
- rescue Exception => e
141
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
142
- end
85
+ resolver = IntegrationTestHelpers.build_resolver(@store)
86
+ IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT1.5M", {}, 90000)
143
87
  end
144
88
 
145
89
  # duration 0.5H
146
90
  def test_duration_0_5h
147
- begin
148
- resolver = IntegrationTestHelpers.build_resolver(@store)
149
- IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT0.5H", {}, 1800000)
150
- rescue Exception => e
151
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
152
- end
91
+ resolver = IntegrationTestHelpers.build_resolver(@store)
92
+ IntegrationTestHelpers.assert_resolved(resolver, "test.duration.PT0.5H", {}, 1800000)
153
93
  end
154
94
 
155
95
  # duration test.duration.P1DT6H2M1.5S
156
96
  def test_duration_test_duration_p1dt6h2m1_5s
157
- begin
158
- resolver = IntegrationTestHelpers.build_resolver(@store)
159
- IntegrationTestHelpers.assert_resolved(resolver, "test.duration.P1DT6H2M1.5S", {}, 108121500)
160
- rescue Exception => e
161
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
162
- end
97
+ resolver = IntegrationTestHelpers.build_resolver(@store)
98
+ IntegrationTestHelpers.assert_resolved(resolver, "test.duration.P1DT6H2M1.5S", {}, 108121500)
163
99
  end
164
100
 
165
101
  # json test
166
102
  def test_json_test
167
- begin
168
- resolver = IntegrationTestHelpers.build_resolver(@store)
169
- IntegrationTestHelpers.assert_resolved(resolver, "test.json", {}, {"a" => 1, "b" => "c"})
170
- rescue Exception => e
171
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
172
- end
103
+ resolver = IntegrationTestHelpers.build_resolver(@store)
104
+ IntegrationTestHelpers.assert_resolved(resolver, "test.json", {}, {"a" => 1, "b" => "c"})
173
105
  end
174
106
 
175
107
  # get returns a native json object (not a stringified payload)
176
108
  def test_get_returns_a_native_json_object_not_a_stringified_payload
177
- begin
178
- resolver = IntegrationTestHelpers.build_resolver(@store)
179
- IntegrationTestHelpers.assert_resolved(resolver, "test.json", {}, {"a" => 1, "b" => "c"})
180
- rescue Exception => e
181
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
182
- end
109
+ resolver = IntegrationTestHelpers.build_resolver(@store)
110
+ IntegrationTestHelpers.assert_resolved(resolver, "test.json", {}, {"a" => 1, "b" => "c"})
183
111
  end
184
112
 
185
113
  # list on left side test (1)
186
114
  def test_list_on_left_side_test_1
187
- begin
188
- resolver = IntegrationTestHelpers.build_resolver(@store)
189
- IntegrationTestHelpers.assert_resolved(resolver, "left.hand.list.test", {"user" => {"name" => "james", "aka" => ["happy", "sleepy"]}}, "correct")
190
- rescue Exception => e
191
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
192
- end
115
+ resolver = IntegrationTestHelpers.build_resolver(@store)
116
+ IntegrationTestHelpers.assert_resolved(resolver, "left.hand.list.test", {"user" => {"name" => "james", "aka" => ["happy", "sleepy"]}}, "correct")
193
117
  end
194
118
 
195
119
  # list on left side test (2)
196
120
  def test_list_on_left_side_test_2
197
- begin
198
- resolver = IntegrationTestHelpers.build_resolver(@store)
199
- IntegrationTestHelpers.assert_resolved(resolver, "left.hand.list.test", {"user" => {"name" => "james", "aka" => ["a", "b"]}}, "default")
200
- rescue Exception => e
201
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
202
- end
121
+ resolver = IntegrationTestHelpers.build_resolver(@store)
122
+ IntegrationTestHelpers.assert_resolved(resolver, "left.hand.list.test", {"user" => {"name" => "james", "aka" => ["a", "b"]}}, "default")
203
123
  end
204
124
 
205
125
  # list on left side test opposite (1)
206
126
  def test_list_on_left_side_test_opposite_1
207
- begin
208
- resolver = IntegrationTestHelpers.build_resolver(@store)
209
- IntegrationTestHelpers.assert_resolved(resolver, "left.hand.test.opposite", {"user" => {"name" => "james", "aka" => ["happy", "sleepy"]}}, "default")
210
- rescue Exception => e
211
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
212
- end
127
+ resolver = IntegrationTestHelpers.build_resolver(@store)
128
+ IntegrationTestHelpers.assert_resolved(resolver, "left.hand.test.opposite", {"user" => {"name" => "james", "aka" => ["happy", "sleepy"]}}, "default")
213
129
  end
214
130
 
215
131
  # list on left side test (3)
216
132
  def test_list_on_left_side_test_3
217
- begin
218
- resolver = IntegrationTestHelpers.build_resolver(@store)
219
- IntegrationTestHelpers.assert_resolved(resolver, "left.hand.test.opposite", {"user" => {"name" => "james", "aka" => ["a", "b"]}}, "correct")
220
- rescue Exception => e
221
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
222
- end
133
+ resolver = IntegrationTestHelpers.build_resolver(@store)
134
+ IntegrationTestHelpers.assert_resolved(resolver, "left.hand.test.opposite", {"user" => {"name" => "james", "aka" => ["a", "b"]}}, "correct")
223
135
  end
224
136
  end
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # AUTO-GENERATED from integration-test-data/tests/eval/get_feature_flag.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,21 +16,13 @@ class TestGetFeatureFlag < Minitest::Test
14
16
 
15
17
  # get returns the underlying value for a feature flag
16
18
  def test_get_returns_the_underlying_value_for_a_feature_flag
17
- begin
18
- resolver = IntegrationTestHelpers.build_resolver(@store)
19
- IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.integer", {}, 3)
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_resolved(resolver, "feature-flag.integer", {}, 3)
23
21
  end
24
22
 
25
23
  # get returns the underlying value for a feature flag that matches the highest precedent rule
26
24
  def test_get_returns_the_underlying_value_for_a_feature_flag_that_matches_the_highest_precedent_rule
27
- begin
28
- resolver = IntegrationTestHelpers.build_resolver(@store)
29
- IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.integer", {"user" => {"key" => "michael"}}, 5)
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_resolved(resolver, "feature-flag.integer", {"user" => {"key" => "michael"}}, 5)
33
27
  end
34
28
  end
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # AUTO-GENERATED from integration-test-data/tests/eval/get_or_raise.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,73 +16,45 @@ class TestGetOrRaise < Minitest::Test
14
16
 
15
17
  # get_or_raise can raise an error if value not found
16
18
  def test_get_or_raise_can_raise_an_error_if_value_not_found
17
- begin
18
- resolver = IntegrationTestHelpers.build_resolver(@store)
19
- ctx = Quonfig::Context.new({})
20
- assert_raises(Quonfig::Errors::MissingDefaultError) { resolver.get("my-missing-key", ctx) }
21
- rescue Minitest::Assertion => e
22
- skip("resolver not yet raising Quonfig::Errors::MissingDefaultError: #{e.message}")
23
- rescue Exception => e
24
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
25
- end
19
+ resolver = IntegrationTestHelpers.build_resolver(@store)
20
+ ctx = Quonfig::Context.new({})
21
+ assert_raises(Quonfig::Errors::MissingDefaultError) { resolver.get("my-missing-key", ctx) }
26
22
  end
27
23
 
28
24
  # get_or_raise returns a default value instead of raising
29
25
  def test_get_or_raise_returns_a_default_value_instead_of_raising
30
- begin
31
- resolver = IntegrationTestHelpers.build_resolver(@store)
32
- IntegrationTestHelpers.assert_resolved(resolver, "my-missing-key", {}, "DEFAULT")
33
- rescue Exception => e
34
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
35
- end
26
+ resolver = IntegrationTestHelpers.build_resolver(@store)
27
+ IntegrationTestHelpers.assert_get_with_default(@store, "my-missing-key", {}, "DEFAULT", "DEFAULT")
36
28
  end
37
29
 
38
30
  # get_or_raise raises the correct error if it doesn't raise on init timeout
39
31
  def test_get_or_raise_raises_the_correct_error_if_it_doesn_t_raise_on_init_timeout
40
- begin
41
- resolver = IntegrationTestHelpers.build_resolver(@store)
42
- ctx = Quonfig::Context.new({})
43
- assert_raises(Quonfig::Errors::MissingDefaultError) { resolver.get("any-key", ctx) }
44
- rescue Minitest::Assertion => e
45
- skip("resolver not yet raising Quonfig::Errors::MissingDefaultError: #{e.message}")
46
- rescue Exception => e
47
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
48
- end
32
+ IntegrationTestHelpers.assert_client_construction_raises("any-key", 0.01, "https://app.staging-prefab.cloud", "return", "get_or_raise", Quonfig::Errors::MissingDefaultError)
49
33
  end
50
34
 
51
35
  # get_or_raise can raise an error if the client does not initialize in time
52
36
  def test_get_or_raise_can_raise_an_error_if_the_client_does_not_initialize_in_time
53
- skip('initialization_timeout not tested')
37
+ IntegrationTestHelpers.assert_initialization_timeout_error("any-key", 0.01, "https://app.staging-prefab.cloud", "raise")
54
38
  end
55
39
 
56
40
  # raises an error if a config is provided by a missing environment variable
57
41
  def test_raises_an_error_if_a_config_is_provided_by_a_missing_environment_variable
58
- begin
59
- resolver = IntegrationTestHelpers.build_resolver(@store)
60
- ctx = Quonfig::Context.new({})
61
- assert_raises(Quonfig::Errors::MissingEnvVarError) { resolver.get("provided.by.missing.env.var", ctx) }
62
- rescue Minitest::Assertion => e
63
- skip("resolver not yet raising Quonfig::Errors::MissingEnvVarError: #{e.message}")
64
- rescue Exception => e
65
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
66
- end
42
+ resolver = IntegrationTestHelpers.build_resolver(@store)
43
+ ctx = Quonfig::Context.new({})
44
+ assert_raises(Quonfig::Errors::MissingEnvVarError) { resolver.get("provided.by.missing.env.var", ctx) }
67
45
  end
68
46
 
69
47
  # raises an error if an env-var-provided config cannot be coerced to configured type
70
48
  def test_raises_an_error_if_an_env_var_provided_config_cannot_be_coerced_to_configured_type
71
- begin
72
- resolver = IntegrationTestHelpers.build_resolver(@store)
73
- ctx = Quonfig::Context.new({})
74
- assert_raises(Quonfig::Errors::EnvVarParseError) { resolver.get("provided.not.a.number", ctx) }
75
- rescue Minitest::Assertion => e
76
- skip("resolver not yet raising Quonfig::Errors::EnvVarParseError: #{e.message}")
77
- rescue Exception => e
78
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
79
- end
49
+ resolver = IntegrationTestHelpers.build_resolver(@store)
50
+ ctx = Quonfig::Context.new({})
51
+ assert_raises(Quonfig::Errors::EnvVarParseError) { resolver.get("provided.not.a.number", ctx) }
80
52
  end
81
53
 
82
54
  # raises an error for decryption failure
83
55
  def test_raises_an_error_for_decryption_failure
84
- skip("raise-case (unable_to_decrypt) — no Quonfig::Errors mapping yet")
56
+ resolver = IntegrationTestHelpers.build_resolver(@store)
57
+ ctx = Quonfig::Context.new({})
58
+ assert_raises(Quonfig::Errors::DecryptionError) { resolver.get("a.broken.secret.config", ctx) }
85
59
  end
86
60
  end
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # AUTO-GENERATED from integration-test-data/tests/eval/get_weighted_values.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,16 +16,19 @@ class TestGetWeightedValues < Minitest::Test
14
16
 
15
17
  # weighted value is consistent 1
16
18
  def test_weighted_value_is_consistent_1
17
- skip("weighted resolver not yet ported to JSON criteria (qfg-dk6.x)")
19
+ resolver = IntegrationTestHelpers.build_resolver(@store)
20
+ IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.weighted", {"user" => {"tracking_id" => "a72c15f5"}}, 1)
18
21
  end
19
22
 
20
23
  # weighted value is consistent 2
21
24
  def test_weighted_value_is_consistent_2
22
- skip("weighted resolver not yet ported to JSON criteria (qfg-dk6.x)")
25
+ resolver = IntegrationTestHelpers.build_resolver(@store)
26
+ IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.weighted", {"user" => {"tracking_id" => "92a202f2"}}, 2)
23
27
  end
24
28
 
25
29
  # weighted value is consistent 3
26
30
  def test_weighted_value_is_consistent_3
27
- skip("weighted resolver not yet ported to JSON criteria (qfg-dk6.x)")
31
+ resolver = IntegrationTestHelpers.build_resolver(@store)
32
+ IntegrationTestHelpers.assert_resolved(resolver, "feature-flag.weighted", {"user" => {"tracking_id" => "8f414100"}}, 3)
28
33
  end
29
34
  end