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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -0
- data/VERSION +1 -1
- data/lib/quonfig/bound_client.rb +26 -0
- data/lib/quonfig/client.rb +212 -3
- data/lib/quonfig/context.rb +10 -1
- data/lib/quonfig/datadir.rb +2 -4
- data/lib/quonfig/dev_context.rb +41 -0
- 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 +84 -3
- data/lib/quonfig/http_connection.rb +1 -1
- data/lib/quonfig/options.rb +4 -1
- data/lib/quonfig/resolver.rb +215 -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 +212 -0
- data/lib/quonfig.rb +10 -0
- data/quonfig.gemspec +23 -4
- data/test/integration/test_context_precedence.rb +35 -117
- data/test/integration/test_datadir_environment.rb +15 -37
- data/test/integration/test_dev_overrides.rb +40 -0
- 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 +532 -4
- data/test/integration/test_post.rb +15 -5
- data/test/integration/test_telemetry.rb +77 -21
- data/test/test_client_telemetry.rb +175 -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_dev_context.rb +163 -0
- 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 +22 -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_with_contexts.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,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
|
-
|
|
18
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
78
|
-
|
|
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
|
-
|
|
88
|
-
|
|
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
|
|
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
|
-
|
|
18
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
38
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
98
|
-
|
|
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
|
-
|
|
108
|
-
|
|
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
|
-
|
|
118
|
-
|
|
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
|
-
|
|
128
|
-
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
148
|
-
|
|
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
|
-
|
|
158
|
-
|
|
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
|
-
|
|
168
|
-
|
|
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
|
-
|
|
178
|
-
|
|
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
|
-
|
|
188
|
-
|
|
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
|
-
|
|
198
|
-
|
|
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
|
-
|
|
208
|
-
|
|
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
|
-
|
|
218
|
-
|
|
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
|
|
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
|
-
|
|
18
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|