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
data/quonfig.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: quonfig 0.0.2 ruby lib
5
+ # stub: quonfig 0.0.8 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "quonfig".freeze
9
- s.version = File.read(File.expand_path("VERSION", __dir__)).strip
9
+ s.version = "0.0.8".freeze
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Jeff Dwyer".freeze]
14
- s.date = "2026-04-22"
14
+ s.date = "2026-04-26"
15
15
  s.description = "Quonfig \u2014 feature flags and live config, stored as files in git.".freeze
16
16
  s.email = "jeff@quonfig.com".freeze
17
17
  s.extra_rdoc_files = [
@@ -57,11 +57,14 @@ Gem::Specification.new do |s|
57
57
  "lib/quonfig/duration.rb",
58
58
  "lib/quonfig/encryption.rb",
59
59
  "lib/quonfig/error.rb",
60
+ "lib/quonfig/errors/decryption_error.rb",
60
61
  "lib/quonfig/errors/env_var_parse_error.rb",
61
62
  "lib/quonfig/errors/initialization_timeout_error.rb",
63
+ "lib/quonfig/errors/invalid_environment_error.rb",
62
64
  "lib/quonfig/errors/invalid_sdk_key_error.rb",
63
65
  "lib/quonfig/errors/missing_default_error.rb",
64
66
  "lib/quonfig/errors/missing_env_var_error.rb",
67
+ "lib/quonfig/errors/missing_environment_error.rb",
65
68
  "lib/quonfig/errors/type_mismatch_error.rb",
66
69
  "lib/quonfig/errors/uninitialized_error.rb",
67
70
  "lib/quonfig/evaluation.rb",
@@ -80,11 +83,16 @@ Gem::Specification.new do |s|
80
83
  "lib/quonfig/semantic_logger_filter.rb",
81
84
  "lib/quonfig/semver.rb",
82
85
  "lib/quonfig/sse_config_client.rb",
86
+ "lib/quonfig/stdlib_formatter.rb",
87
+ "lib/quonfig/telemetry/context_shape.rb",
88
+ "lib/quonfig/telemetry/context_shape_aggregator.rb",
89
+ "lib/quonfig/telemetry/evaluation_summaries_aggregator.rb",
90
+ "lib/quonfig/telemetry/example_contexts_aggregator.rb",
91
+ "lib/quonfig/telemetry/telemetry_reporter.rb",
83
92
  "lib/quonfig/time_helpers.rb",
84
93
  "lib/quonfig/types.rb",
85
94
  "lib/quonfig/weighted_value_resolver.rb",
86
95
  "quonfig.gemspec",
87
- "scripts/generate_integration_tests.rb",
88
96
  "test/fixtures/datafile.json",
89
97
  "test/integration/test_context_precedence.rb",
90
98
  "test/integration/test_datadir_environment.rb",
@@ -105,12 +113,17 @@ Gem::Specification.new do |s|
105
113
  "test/test_caching_http_connection.rb",
106
114
  "test/test_client.rb",
107
115
  "test/test_client_network_mode.rb",
116
+ "test/test_client_telemetry.rb",
108
117
  "test/test_config_loader.rb",
109
118
  "test/test_context.rb",
119
+ "test/test_context_shape.rb",
120
+ "test/test_context_shape_aggregator.rb",
110
121
  "test/test_datadir.rb",
111
122
  "test/test_duration.rb",
112
123
  "test/test_encryption.rb",
124
+ "test/test_evaluation_summaries_aggregator.rb",
113
125
  "test/test_evaluator.rb",
126
+ "test/test_example_contexts_aggregator.rb",
114
127
  "test/test_exponential_backoff.rb",
115
128
  "test/test_fixed_size_hash.rb",
116
129
  "test/test_helper.rb",
@@ -123,7 +136,10 @@ Gem::Specification.new do |s|
123
136
  "test/test_resolver.rb",
124
137
  "test/test_semantic_logger_filter.rb",
125
138
  "test/test_semver.rb",
139
+ "test/test_should_log.rb",
126
140
  "test/test_sse_config_client.rb",
141
+ "test/test_stdlib_formatter.rb",
142
+ "test/test_telemetry_reporter.rb",
127
143
  "test/test_typed_getters.rb",
128
144
  "test/test_types.rb",
129
145
  "test/test_weighted_value_resolver.rb"
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # AUTO-GENERATED from integration-test-data/tests/eval/context_precedence.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,181 +16,97 @@ class TestContextPrecedence < Minitest::Test
14
16
 
15
17
  # returns the correct `flag` value using the global context (1)
16
18
  def test_returns_the_correct_flag_value_using_the_global_context_1
17
- begin
18
- resolver = IntegrationTestHelpers.build_resolver(@store)
19
- IntegrationTestHelpers.assert_resolved(resolver, "mixed.case.property.name", {"user" => {"isHuman" => "verified"}}, 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, "mixed.case.property.name", {"user" => {"isHuman" => "verified"}}, true)
23
21
  end
24
22
 
25
23
  # returns the correct `flag` value using the global context (2)
26
24
  def test_returns_the_correct_flag_value_using_the_global_context_2
27
- begin
28
- resolver = IntegrationTestHelpers.build_resolver(@store)
29
- IntegrationTestHelpers.assert_resolved(resolver, "mixed.case.property.name", {"user" => {"isHuman" => "?"}}, 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, "mixed.case.property.name", {"user" => {"isHuman" => "?"}}, false)
33
27
  end
34
28
 
35
29
  # returns the correct `flag` value when local context clobbers global context (1)
36
30
  def test_returns_the_correct_flag_value_when_local_context_clobbers_global_context_1
37
- begin
38
- resolver = IntegrationTestHelpers.build_resolver(@store)
39
- IntegrationTestHelpers.assert_resolved(resolver, "mixed.case.property.name", {"user" => {"isHuman" => "verified"}}, 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, "mixed.case.property.name", {"user" => {"isHuman" => "verified"}}, true)
43
33
  end
44
34
 
45
35
  # returns the correct `flag` value when local context clobbers global context (2)
46
36
  def test_returns_the_correct_flag_value_when_local_context_clobbers_global_context_2
47
- begin
48
- resolver = IntegrationTestHelpers.build_resolver(@store)
49
- IntegrationTestHelpers.assert_resolved(resolver, "mixed.case.property.name", {"user" => {"isHuman" => "?"}}, 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, "mixed.case.property.name", {"user" => {"isHuman" => "?"}}, false)
53
39
  end
54
40
 
55
41
  # returns the correct `flag` value when block context clobbers global context (1)
56
42
  def test_returns_the_correct_flag_value_when_block_context_clobbers_global_context_1
57
- begin
58
- resolver = IntegrationTestHelpers.build_resolver(@store)
59
- IntegrationTestHelpers.assert_resolved(resolver, "mixed.case.property.name", {"user" => {"isHuman" => "?"}}, 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, "mixed.case.property.name", {"user" => {"isHuman" => "?"}}, false)
63
45
  end
64
46
 
65
47
  # returns the correct `flag` value when block context clobbers global context (2)
66
48
  def test_returns_the_correct_flag_value_when_block_context_clobbers_global_context_2
67
- begin
68
- resolver = IntegrationTestHelpers.build_resolver(@store)
69
- IntegrationTestHelpers.assert_resolved(resolver, "mixed.case.property.name", {"user" => {"isHuman" => "verified"}}, 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, "mixed.case.property.name", {"user" => {"isHuman" => "verified"}}, true)
73
51
  end
74
52
 
75
53
  # returns the correct `flag` value when local context clobbers block context (1)
76
54
  def test_returns_the_correct_flag_value_when_local_context_clobbers_block_context_1
77
- begin
78
- resolver = IntegrationTestHelpers.build_resolver(@store)
79
- IntegrationTestHelpers.assert_resolved(resolver, "mixed.case.property.name", {"user" => {"isHuman" => "?"}}, 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" => "?"}}, false)
83
57
  end
84
58
 
85
59
  # returns the correct `flag` value when local context clobbers block context (2)
86
60
  def test_returns_the_correct_flag_value_when_local_context_clobbers_block_context_2
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
 
95
65
  # returns the correct `get` value using the global context (1)
96
66
  def test_returns_the_correct_get_value_using_the_global_context_1
97
- begin
98
- resolver = IntegrationTestHelpers.build_resolver(@store)
99
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@prefab.cloud"}}, "override")
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_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@prefab.cloud"}}, "override")
103
69
  end
104
70
 
105
71
  # returns the correct `get` value using the global context (2)
106
72
  def test_returns_the_correct_get_value_using_the_global_context_2
107
- begin
108
- resolver = IntegrationTestHelpers.build_resolver(@store)
109
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@example.com"}}, "default")
110
- rescue Exception => e
111
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
112
- end
113
- end
114
-
115
- # returns the correct `get` value using the global context and api context (1)
116
- def test_returns_the_correct_get_value_using_the_global_context_and_api_context_1
117
- begin
118
- resolver = IntegrationTestHelpers.build_resolver(@store)
119
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config.with.api.conditional", {"user" => {"email" => "test@prefab.cloud"}}, "override")
120
- rescue Exception => e
121
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
122
- end
123
- end
124
-
125
- # returns the correct `get` value using the global context and api context (2)
126
- def test_returns_the_correct_get_value_using_the_global_context_and_api_context_2
127
- begin
128
- resolver = IntegrationTestHelpers.build_resolver(@store)
129
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config.with.api.conditional", {"user" => {"email" => "test@example.com"}}, "api-override")
130
- rescue Exception => e
131
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
132
- end
73
+ resolver = IntegrationTestHelpers.build_resolver(@store)
74
+ IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@example.com"}}, "default")
133
75
  end
134
76
 
135
77
  # returns the correct `get` value when local context clobbers global context (1)
136
78
  def test_returns_the_correct_get_value_when_local_context_clobbers_global_context_1
137
- begin
138
- resolver = IntegrationTestHelpers.build_resolver(@store)
139
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@prefab.cloud"}}, "override")
140
- rescue Exception => e
141
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
142
- end
79
+ resolver = IntegrationTestHelpers.build_resolver(@store)
80
+ IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@prefab.cloud"}}, "override")
143
81
  end
144
82
 
145
83
  # returns the correct `get` value when local context clobbers global context (2)
146
84
  def test_returns_the_correct_get_value_when_local_context_clobbers_global_context_2
147
- begin
148
- resolver = IntegrationTestHelpers.build_resolver(@store)
149
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@example.com"}}, "default")
150
- rescue Exception => e
151
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
152
- end
85
+ resolver = IntegrationTestHelpers.build_resolver(@store)
86
+ IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@example.com"}}, "default")
153
87
  end
154
88
 
155
89
  # returns the correct `get` value when block context clobbers global context (1)
156
90
  def test_returns_the_correct_get_value_when_block_context_clobbers_global_context_1
157
- begin
158
- resolver = IntegrationTestHelpers.build_resolver(@store)
159
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@example.com"}}, "default")
160
- rescue Exception => e
161
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
162
- end
91
+ resolver = IntegrationTestHelpers.build_resolver(@store)
92
+ IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@example.com"}}, "default")
163
93
  end
164
94
 
165
95
  # returns the correct `get` value when block context clobbers global context (2)
166
96
  def test_returns_the_correct_get_value_when_block_context_clobbers_global_context_2
167
- begin
168
- resolver = IntegrationTestHelpers.build_resolver(@store)
169
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@prefab.cloud"}}, "override")
170
- rescue Exception => e
171
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
172
- end
97
+ resolver = IntegrationTestHelpers.build_resolver(@store)
98
+ IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@prefab.cloud"}}, "override")
173
99
  end
174
100
 
175
101
  # returns the correct `get` value when local context clobbers block context (1)
176
102
  def test_returns_the_correct_get_value_when_local_context_clobbers_block_context_1
177
- begin
178
- resolver = IntegrationTestHelpers.build_resolver(@store)
179
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@example.com"}}, "default")
180
- rescue Exception => e
181
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
182
- end
103
+ resolver = IntegrationTestHelpers.build_resolver(@store)
104
+ IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@example.com"}}, "default")
183
105
  end
184
106
 
185
107
  # returns the correct `get` value when local context clobbers block context (2)
186
108
  def test_returns_the_correct_get_value_when_local_context_clobbers_block_context_2
187
- begin
188
- resolver = IntegrationTestHelpers.build_resolver(@store)
189
- IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@prefab.cloud"}}, "override")
190
- rescue Exception => e
191
- skip("resolver not yet ported for this case: #{e.class}: #{e.message}")
192
- end
109
+ resolver = IntegrationTestHelpers.build_resolver(@store)
110
+ IntegrationTestHelpers.assert_resolved(resolver, "basic.rule.config", {"user" => {"email" => "test@prefab.cloud"}}, "override")
193
111
  end
194
112
  end
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # AUTO-GENERATED from integration-test-data/tests/eval/datadir_environment.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,63 +16,39 @@ class TestDatadirEnvironment < Minitest::Test
14
16
 
15
17
  # datadir with environment option gets environment-specific value
16
18
  def test_datadir_with_environment_option_gets_environment_specific_value
17
- begin
18
- client = Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir, environment: "Production")
19
- assert_equal "test4", client.get("james.test.key")
20
- rescue Exception => e
21
- skip("datadir Client.new not yet wired: #{e.class}: #{e.message}")
22
- end
19
+ client = Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir, environment: "Production")
20
+ assert_equal "test4", client.get("james.test.key")
23
21
  end
24
22
 
25
23
  # datadir with QUONFIG_ENVIRONMENT env var gets environment-specific value
26
24
  def test_datadir_with_quonfig_environment_env_var_gets_environment_specific_value
27
- begin
28
- IntegrationTestHelpers.with_env({"QUONFIG_ENVIRONMENT" => "Production"}) do
29
- client = Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir)
30
- assert_equal "test4", client.get("james.test.key")
31
- end
32
- rescue Exception => e
33
- skip("datadir Client.new not yet wired: #{e.class}: #{e.message}")
25
+ IntegrationTestHelpers.with_env({"QUONFIG_ENVIRONMENT" => "Production"}) do
26
+ client = Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir)
27
+ assert_equal "test4", client.get("james.test.key")
34
28
  end
35
29
  end
36
30
 
37
31
  # environment option supersedes QUONFIG_ENVIRONMENT env var
38
32
  def test_environment_option_supersedes_quonfig_environment_env_var
39
- begin
40
- IntegrationTestHelpers.with_env({"QUONFIG_ENVIRONMENT" => "nonexistent"}) do
41
- client = Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir, environment: "Production")
42
- assert_equal "test4", client.get("james.test.key")
43
- end
44
- rescue Exception => e
45
- skip("datadir Client.new not yet wired: #{e.class}: #{e.message}")
33
+ IntegrationTestHelpers.with_env({"QUONFIG_ENVIRONMENT" => "nonexistent"}) do
34
+ client = Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir, environment: "Production")
35
+ assert_equal "test4", client.get("james.test.key")
46
36
  end
47
37
  end
48
38
 
49
39
  # config without environment override returns default value
50
40
  def test_config_without_environment_override_returns_default_value
51
- begin
52
- client = Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir, environment: "Production")
53
- assert_equal "hello from no env row", client.get("config.with.only.default.env.row")
54
- rescue Exception => e
55
- skip("datadir Client.new not yet wired: #{e.class}: #{e.message}")
56
- end
41
+ client = Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir, environment: "Production")
42
+ assert_equal "hello from no env row", client.get("config.with.only.default.env.row")
57
43
  end
58
44
 
59
45
  # datadir without environment fails to init
60
46
  def test_datadir_without_environment_fails_to_init
61
- begin
62
- skip("init raise-case (missing_environment) — no Quonfig::Errors mapping yet")
63
- rescue Exception => e
64
- skip("datadir Client.new not yet wired: #{e.class}: #{e.message}")
65
- end
47
+ assert_raises(Quonfig::Errors::MissingEnvironmentError) { Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir) }
66
48
  end
67
49
 
68
50
  # datadir with invalid environment fails to init
69
51
  def test_datadir_with_invalid_environment_fails_to_init
70
- begin
71
- skip("init raise-case (invalid_environment) — no Quonfig::Errors mapping yet")
72
- rescue Exception => e
73
- skip("datadir Client.new not yet wired: #{e.class}: #{e.message}")
74
- end
52
+ assert_raises(Quonfig::Errors::InvalidEnvironmentError) { Quonfig::Client.new(datadir: IntegrationTestHelpers.data_dir, environment: "nonexistent") }
75
53
  end
76
54
  end