prefab-cloud-ruby 0.20.0 → 0.22.0
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/.envrc.sample +3 -0
- data/.github/workflows/ruby.yml +5 -1
- data/.gitmodules +3 -0
- data/Gemfile +14 -12
- data/Gemfile.lock +24 -14
- data/README.md +12 -10
- data/Rakefile +13 -14
- data/VERSION +1 -1
- data/lib/prefab/auth_interceptor.rb +2 -1
- data/lib/prefab/cancellable_interceptor.rb +8 -7
- data/lib/prefab/client.rb +52 -27
- data/lib/prefab/config_client.rb +59 -70
- data/lib/prefab/config_loader.rb +7 -114
- data/lib/prefab/config_resolver.rb +27 -57
- data/lib/prefab/config_value_unwrapper.rb +23 -0
- data/lib/prefab/criteria_evaluator.rb +96 -0
- data/lib/prefab/errors/invalid_api_key_error.rb +1 -1
- data/lib/prefab/feature_flag_client.rb +13 -145
- data/lib/prefab/internal_logger.rb +7 -6
- data/lib/prefab/local_config_parser.rb +110 -0
- data/lib/prefab/log_path_collector.rb +98 -0
- data/lib/prefab/logger_client.rb +46 -44
- data/lib/prefab/murmer3.rb +3 -4
- data/lib/prefab/noop_cache.rb +5 -7
- data/lib/prefab/noop_stats.rb +2 -3
- data/lib/prefab/options.rb +32 -11
- data/lib/prefab/ratelimit_client.rb +11 -13
- data/lib/prefab/sse_logger.rb +3 -2
- data/lib/prefab/weighted_value_resolver.rb +42 -0
- data/lib/prefab/yaml_config_parser.rb +32 -0
- data/lib/prefab-cloud-ruby.rb +7 -2
- data/lib/prefab_pb.rb +70 -43
- data/lib/prefab_services_pb.rb +14 -1
- data/prefab-cloud-ruby.gemspec +33 -19
- data/test/.prefab.unit_tests.config.yaml +3 -2
- data/test/integration_test.rb +98 -0
- data/test/integration_test_helpers.rb +37 -0
- data/test/test_client.rb +56 -31
- data/test/test_config_client.rb +21 -20
- data/test/test_config_loader.rb +48 -37
- data/test/test_config_resolver.rb +312 -135
- data/test/test_config_value_unwrapper.rb +83 -0
- data/test/test_criteria_evaluator.rb +533 -0
- data/test/test_feature_flag_client.rb +35 -347
- data/test/test_helper.rb +18 -14
- data/test/test_integration.rb +33 -0
- data/test/test_local_config_parser.rb +78 -0
- data/test/test_log_path_collector.rb +56 -0
- data/test/test_logger.rb +52 -51
- data/test/test_options.rb +32 -0
- data/test/test_weighted_value_resolver.rb +65 -0
- metadata +30 -16
- data/lib/prefab/config_helper.rb +0 -31
- data/run_test_harness_server.sh +0 -8
- data/test/harness_server.rb +0 -64
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class IntegrationTest
|
4
|
+
attr_reader :func
|
5
|
+
attr_reader :input
|
6
|
+
attr_reader :expected
|
7
|
+
attr_reader :test_client
|
8
|
+
|
9
|
+
def initialize(test_data)
|
10
|
+
@client_overrides = parse_client_overrides(test_data['client_overrides'])
|
11
|
+
@func = parse_function(test_data['function'])
|
12
|
+
@input = parse_input(test_data['input'])
|
13
|
+
@expected = parse_expected(test_data['expected'])
|
14
|
+
test_client = :"#{test_data['client']}"
|
15
|
+
@test_client = base_client.send(test_client)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_type
|
19
|
+
if @expected[:status] == 'raise'
|
20
|
+
:raise
|
21
|
+
elsif @expected[:value].nil?
|
22
|
+
:nil
|
23
|
+
elsif @func == :feature_is_on_for?
|
24
|
+
:feature_flag
|
25
|
+
else
|
26
|
+
:simple_equality
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def parse_client_overrides(overrides)
|
33
|
+
Hash[
|
34
|
+
(overrides || {}).map do |(k, v)|
|
35
|
+
[k.to_sym, v]
|
36
|
+
end
|
37
|
+
]
|
38
|
+
end
|
39
|
+
|
40
|
+
def parse_function(function)
|
41
|
+
case function
|
42
|
+
when 'get_or_raise' then :get
|
43
|
+
when 'enabled' then :feature_is_on_for?
|
44
|
+
else :"#{function}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def parse_input(input)
|
49
|
+
if input['key']
|
50
|
+
parse_config_input(input)
|
51
|
+
elsif input['flag']
|
52
|
+
parse_ff_input(input)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def parse_config_input(input)
|
57
|
+
if !input['default'].nil?
|
58
|
+
[input['key'], input['default']]
|
59
|
+
else
|
60
|
+
[input['key']]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def parse_ff_input(input)
|
65
|
+
[input['flag'], input['lookup_key'], input['properties'] || {}]
|
66
|
+
end
|
67
|
+
|
68
|
+
def parse_expected(expected)
|
69
|
+
{
|
70
|
+
status: expected['status'],
|
71
|
+
error: parse_error_type(expected['error']),
|
72
|
+
message: expected['message'],
|
73
|
+
value: expected['value']
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
def parse_error_type(error_type)
|
78
|
+
case error_type
|
79
|
+
when 'missing_default' then Prefab::Errors::MissingDefaultError
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def base_client
|
84
|
+
@_base_client ||= Prefab::Client.new(base_client_options)
|
85
|
+
end
|
86
|
+
|
87
|
+
def base_client_options
|
88
|
+
@_options ||= Prefab::Options.new(**{
|
89
|
+
prefab_config_override_dir: 'none',
|
90
|
+
prefab_config_classpath_dir: 'test',
|
91
|
+
prefab_envs: ['unit_tests'],
|
92
|
+
prefab_datasources: Prefab::Options::DATASOURCES::ALL,
|
93
|
+
api_key: ENV['PREFAB_INTEGRATION_TEST_API_KEY'],
|
94
|
+
prefab_api_url: 'https://api.staging-prefab.cloud',
|
95
|
+
prefab_grpc_url: 'grpc.staging-prefab.cloud:443'
|
96
|
+
}.merge(@client_overrides))
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IntegrationTestHelpers
|
4
|
+
SUBMODULE_PATH = 'test/prefab-cloud-integration-test-data'
|
5
|
+
RAISE_IF_NO_TESTS_FOUND = ENV['PREFAB_INTEGRATION_TEST_RAISE'] == 'true'
|
6
|
+
|
7
|
+
def self.find_integration_tests
|
8
|
+
version = find_integration_test_version
|
9
|
+
|
10
|
+
files = find_versioned_test_files(version)
|
11
|
+
|
12
|
+
if files.none?
|
13
|
+
message = "No integration tests found for version: #{version}"
|
14
|
+
raise message if RAISE_IF_NO_TESTS_FOUND
|
15
|
+
|
16
|
+
puts message
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
files
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.find_integration_test_version
|
24
|
+
File.read(File.join(SUBMODULE_PATH, 'version')).strip
|
25
|
+
rescue StandardError => e
|
26
|
+
puts "No version found for integration tests: #{e.message}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.find_versioned_test_files(version)
|
30
|
+
if version.nil?
|
31
|
+
[]
|
32
|
+
else
|
33
|
+
Dir[File.join(SUBMODULE_PATH, "tests/#{version}/**/*")]
|
34
|
+
.select { |file| file =~ /\.ya?ml$/ }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/test/test_client.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
class TestClient < Minitest::Test
|
@@ -7,25 +8,25 @@ class TestClient < Minitest::Test
|
|
7
8
|
end
|
8
9
|
|
9
10
|
def test_get
|
10
|
-
assert_equal
|
11
|
-
assert_equal 123, @client.get(
|
11
|
+
assert_equal 'test sample value', @client.get('sample')
|
12
|
+
assert_equal 123, @client.get('sample_int')
|
12
13
|
end
|
13
14
|
|
14
15
|
def test_get_with_default
|
15
16
|
# A `false` value is not replaced with the default
|
16
|
-
assert_equal false, @client.get(
|
17
|
+
assert_equal false, @client.get('false_value', 'red')
|
17
18
|
|
18
19
|
# A falsy value is not replaced with the default
|
19
|
-
assert_equal 0, @client.get(
|
20
|
+
assert_equal 0, @client.get('zero_value', 'red')
|
20
21
|
|
21
22
|
# A missing value returns the default
|
22
|
-
assert_equal
|
23
|
+
assert_equal 'buckets', @client.get('missing_value', 'buckets')
|
23
24
|
end
|
24
25
|
|
25
26
|
def test_get_with_missing_default
|
26
27
|
# it raises by default
|
27
28
|
err = assert_raises(Prefab::Errors::MissingDefaultError) do
|
28
|
-
assert_nil @client.get(
|
29
|
+
assert_nil @client.get('missing_value')
|
29
30
|
end
|
30
31
|
|
31
32
|
assert_match(/No value found for key/, err.message)
|
@@ -33,63 +34,87 @@ class TestClient < Minitest::Test
|
|
33
34
|
|
34
35
|
# you can opt-in to return `nil` instead
|
35
36
|
client = new_client(on_no_default: Prefab::Options::ON_NO_DEFAULT::RETURN_NIL)
|
36
|
-
assert_nil client.get(
|
37
|
+
assert_nil client.get('missing_value')
|
37
38
|
end
|
38
39
|
|
39
40
|
def test_enabled
|
40
|
-
assert_equal false, @client.enabled?(
|
41
|
-
assert_equal true, @client.enabled?(
|
42
|
-
assert_equal false, @client.enabled?(
|
43
|
-
assert_equal false, @client.enabled?(
|
41
|
+
assert_equal false, @client.enabled?('does_not_exist')
|
42
|
+
assert_equal true, @client.enabled?('enabled_flag')
|
43
|
+
assert_equal false, @client.enabled?('disabled_flag')
|
44
|
+
assert_equal false, @client.enabled?('flag_with_a_value')
|
44
45
|
end
|
45
46
|
|
46
47
|
def test_ff_enabled_with_lookup_key
|
47
|
-
assert_equal false, @client.enabled?(
|
48
|
-
assert_equal true, @client.enabled?(
|
49
|
-
assert_equal true, @client.enabled?(
|
48
|
+
assert_equal false, @client.enabled?('in_lookup_key', 'jimmy')
|
49
|
+
assert_equal true, @client.enabled?('in_lookup_key', 'abc123')
|
50
|
+
assert_equal true, @client.enabled?('in_lookup_key', 'xyz987')
|
50
51
|
end
|
51
52
|
|
52
53
|
def test_ff_get_with_lookup_key
|
53
|
-
assert_nil @client.get(
|
54
|
-
assert_equal
|
54
|
+
assert_nil @client.get('in_lookup_key', 'jimmy')
|
55
|
+
assert_equal 'DEFAULT', @client.get('in_lookup_key', 'jimmy', {}, 'DEFAULT')
|
55
56
|
|
56
|
-
assert_equal true, @client.get(
|
57
|
-
assert_equal true, @client.get(
|
57
|
+
assert_equal true, @client.get('in_lookup_key', 'abc123')
|
58
|
+
assert_equal true, @client.get('in_lookup_key', 'xyz987')
|
58
59
|
end
|
59
60
|
|
60
61
|
def test_ff_enabled_with_attributes
|
61
|
-
assert_equal false, @client.enabled?(
|
62
|
-
assert_equal false, @client.enabled?(
|
63
|
-
assert_equal false, @client.enabled?(
|
62
|
+
assert_equal false, @client.enabled?('just_my_domain', 'abc123', { domain: 'gmail.com' })
|
63
|
+
assert_equal false, @client.enabled?('just_my_domain', 'abc123', { domain: 'prefab.cloud' })
|
64
|
+
assert_equal false, @client.enabled?('just_my_domain', 'abc123', { domain: 'example.com' })
|
64
65
|
end
|
65
66
|
|
66
67
|
def test_ff_get_with_attributes
|
67
|
-
assert_nil @client.get(
|
68
|
-
assert_equal
|
68
|
+
assert_nil @client.get('just_my_domain', 'abc123', { domain: 'gmail.com' })
|
69
|
+
assert_equal 'DEFAULT', @client.get('just_my_domain', 'abc123', { domain: 'gmail.com' }, 'DEFAULT')
|
69
70
|
|
70
|
-
assert_equal
|
71
|
-
assert_equal
|
71
|
+
assert_equal 'new-version', @client.get('just_my_domain', 'abc123', { domain: 'prefab.cloud' })
|
72
|
+
assert_equal 'new-version', @client.get('just_my_domain', 'abc123', { domain: 'example.com' })
|
72
73
|
end
|
73
74
|
|
74
75
|
def test_getting_feature_flag_value
|
75
|
-
assert_equal false, @client.enabled?(
|
76
|
-
assert_equal
|
76
|
+
assert_equal false, @client.enabled?('flag_with_a_value')
|
77
|
+
assert_equal 'all-features', @client.get('flag_with_a_value')
|
77
78
|
end
|
78
79
|
|
79
80
|
def test_ssl_certs
|
80
|
-
certs = @client.send(:ssl_certs).split(
|
81
|
+
certs = @client.send(:ssl_certs).split('-----BEGIN CERTIFICATE-----')
|
81
82
|
|
82
83
|
# This is a smoke test to make sure multiple certs are loaded
|
83
84
|
assert certs.length > 1
|
84
85
|
end
|
85
86
|
|
87
|
+
def test_initialization_with_an_options_object
|
88
|
+
options_hash = {
|
89
|
+
namespace: 'test-namespace',
|
90
|
+
prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY
|
91
|
+
}
|
92
|
+
|
93
|
+
options = Prefab::Options.new(options_hash)
|
94
|
+
|
95
|
+
client = Prefab::Client.new(options)
|
96
|
+
|
97
|
+
assert_equal client.namespace, 'test-namespace'
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_initialization_with_a_hash
|
101
|
+
options_hash = {
|
102
|
+
namespace: 'test-namespace',
|
103
|
+
prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY
|
104
|
+
}
|
105
|
+
|
106
|
+
client = Prefab::Client.new(options_hash)
|
107
|
+
|
108
|
+
assert_equal client.namespace, 'test-namespace'
|
109
|
+
end
|
110
|
+
|
86
111
|
private
|
87
112
|
|
88
113
|
def new_client(overrides = {})
|
89
114
|
options = Prefab::Options.new(**{
|
90
|
-
prefab_config_override_dir:
|
91
|
-
prefab_config_classpath_dir:
|
92
|
-
prefab_envs: [
|
115
|
+
prefab_config_override_dir: 'none',
|
116
|
+
prefab_config_classpath_dir: 'test',
|
117
|
+
prefab_envs: ['unit_tests'],
|
93
118
|
prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY
|
94
119
|
}.merge(overrides))
|
95
120
|
|
data/test/test_config_client.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
class TestConfigClient < Minitest::Test
|
5
6
|
def setup
|
6
7
|
options = Prefab::Options.new(
|
7
|
-
prefab_config_override_dir:
|
8
|
-
prefab_config_classpath_dir:
|
9
|
-
prefab_envs:
|
8
|
+
prefab_config_override_dir: 'none',
|
9
|
+
prefab_config_classpath_dir: 'test',
|
10
|
+
prefab_envs: 'unit_tests',
|
10
11
|
prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY
|
11
12
|
)
|
12
13
|
|
@@ -14,59 +15,59 @@ class TestConfigClient < Minitest::Test
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def test_load
|
17
|
-
assert_equal
|
18
|
-
assert_equal 123, @config_client.get(
|
19
|
-
assert_equal 12.12, @config_client.get(
|
20
|
-
assert_equal true, @config_client.get(
|
21
|
-
assert_equal :ERROR, @config_client.get(
|
18
|
+
assert_equal 'test sample value', @config_client.get('sample')
|
19
|
+
assert_equal 123, @config_client.get('sample_int')
|
20
|
+
assert_equal 12.12, @config_client.get('sample_double')
|
21
|
+
assert_equal true, @config_client.get('sample_bool')
|
22
|
+
assert_equal :ERROR, @config_client.get('log-level.app')
|
22
23
|
end
|
23
24
|
|
24
25
|
def test_initialization_timeout_error
|
25
26
|
options = Prefab::Options.new(
|
26
|
-
api_key:
|
27
|
+
api_key: '123-ENV-KEY-SDK',
|
27
28
|
initialization_timeout_sec: 0.01,
|
28
29
|
logdev: StringIO.new
|
29
30
|
)
|
30
31
|
|
31
32
|
err = assert_raises(Prefab::Errors::InitializationTimeoutError) do
|
32
|
-
Prefab::Client.new(options).config_client.get(
|
33
|
+
Prefab::Client.new(options).config_client.get('anything')
|
33
34
|
end
|
34
35
|
|
35
36
|
assert_match(/couldn't initialize in 0.01 second timeout/, err.message)
|
36
37
|
end
|
37
38
|
|
38
39
|
def test_prefab_envs_is_forgiving
|
39
|
-
assert_equal [
|
40
|
-
prefab_envs:
|
40
|
+
assert_equal ['my_env'], Prefab::Options.new(
|
41
|
+
prefab_envs: 'my_env'
|
41
42
|
).prefab_envs
|
42
43
|
|
43
|
-
assert_equal [
|
44
|
-
prefab_envs: [
|
44
|
+
assert_equal %w[my_env a_second_env], Prefab::Options.new(
|
45
|
+
prefab_envs: %w[my_env a_second_env]
|
45
46
|
).prefab_envs
|
46
47
|
end
|
47
48
|
|
48
49
|
def test_prefab_envs_env_var
|
49
|
-
ENV[
|
50
|
-
assert_equal [
|
50
|
+
ENV['PREFAB_ENVS'] = 'one,two'
|
51
|
+
assert_equal %w[one two], Prefab::Options.new.prefab_envs
|
51
52
|
end
|
52
53
|
|
53
54
|
def test_invalid_api_key_error
|
54
55
|
options = Prefab::Options.new(
|
55
|
-
api_key:
|
56
|
+
api_key: ''
|
56
57
|
)
|
57
58
|
|
58
59
|
err = assert_raises(Prefab::Errors::InvalidApiKeyError) do
|
59
|
-
Prefab::Client.new(options).config_client.get(
|
60
|
+
Prefab::Client.new(options).config_client.get('anything')
|
60
61
|
end
|
61
62
|
|
62
63
|
assert_match(/No API key/, err.message)
|
63
64
|
|
64
65
|
options = Prefab::Options.new(
|
65
|
-
api_key:
|
66
|
+
api_key: 'invalid'
|
66
67
|
)
|
67
68
|
|
68
69
|
err = assert_raises(Prefab::Errors::InvalidApiKeyError) do
|
69
|
-
Prefab::Client.new(options).config_client.get(
|
70
|
+
Prefab::Client.new(options).config_client.get('anything')
|
70
71
|
end
|
71
72
|
|
72
73
|
assert_match(/format is invalid/, err.message)
|
data/test/test_config_loader.rb
CHANGED
@@ -1,83 +1,90 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
class TestConfigLoader < Minitest::Test
|
5
6
|
def setup
|
6
7
|
options = Prefab::Options.new(
|
7
|
-
prefab_config_override_dir:
|
8
|
-
prefab_config_classpath_dir:
|
9
|
-
prefab_envs:
|
8
|
+
prefab_config_override_dir: 'none',
|
9
|
+
prefab_config_classpath_dir: 'test',
|
10
|
+
prefab_envs: 'unit_tests'
|
10
11
|
)
|
11
12
|
@loader = Prefab::ConfigLoader.new(MockBaseClient.new(options))
|
12
13
|
end
|
13
14
|
|
14
15
|
def test_load
|
15
|
-
should_be :int, 123,
|
16
|
-
should_be :string,
|
17
|
-
should_be :bool, true,
|
18
|
-
should_be :double, 12.12,
|
16
|
+
should_be :int, 123, 'sample_int'
|
17
|
+
should_be :string, 'test sample value', 'sample'
|
18
|
+
should_be :bool, true, 'sample_bool'
|
19
|
+
should_be :double, 12.12, 'sample_double'
|
19
20
|
end
|
20
21
|
|
21
22
|
def test_nested
|
22
|
-
should_be :string,
|
23
|
-
should_be :string,
|
24
|
-
should_be :log_level, :ERROR,
|
25
|
-
should_be :log_level, :WARN,
|
26
|
-
should_be :log_level, :INFO,
|
23
|
+
should_be :string, 'nested value', 'nested.values.string'
|
24
|
+
should_be :string, 'top level', 'nested.values'
|
25
|
+
should_be :log_level, :ERROR, 'log-level.app'
|
26
|
+
should_be :log_level, :WARN, 'log-level.app.controller.hello'
|
27
|
+
should_be :log_level, :INFO, 'log-level.app.controller.hello.index'
|
27
28
|
end
|
28
29
|
|
29
30
|
def test_invalid_log_level
|
30
|
-
should_be :log_level, :NOT_SET_LOG_LEVEL,
|
31
|
+
should_be :log_level, :NOT_SET_LOG_LEVEL, 'log-level.invalid'
|
31
32
|
end
|
32
33
|
|
33
34
|
def test_load_without_unit_test_env
|
34
35
|
options = Prefab::Options.new(
|
35
|
-
prefab_config_override_dir:
|
36
|
-
prefab_config_classpath_dir:
|
36
|
+
prefab_config_override_dir: 'none',
|
37
|
+
prefab_config_classpath_dir: 'test'
|
37
38
|
# no prefab_envs
|
38
39
|
)
|
39
40
|
@loader = Prefab::ConfigLoader.new(MockBaseClient.new(options))
|
40
|
-
should_be :string,
|
41
|
-
should_be :bool, true,
|
41
|
+
should_be :string, 'default sample value', 'sample'
|
42
|
+
should_be :bool, true, 'sample_bool'
|
42
43
|
end
|
43
44
|
|
44
45
|
def test_highwater
|
45
46
|
assert_equal 0, @loader.highwater_mark
|
46
|
-
@loader.set(Prefab::Config.new(id: 1, key:
|
47
|
+
@loader.set(Prefab::Config.new(id: 1, key: 'sample_int', rows: [config_row(Prefab::ConfigValue.new(int: 456))]),
|
48
|
+
'test')
|
47
49
|
assert_equal 1, @loader.highwater_mark
|
48
50
|
|
49
|
-
@loader.set(Prefab::Config.new(id: 5, key:
|
51
|
+
@loader.set(Prefab::Config.new(id: 5, key: 'sample_int', rows: [config_row(Prefab::ConfigValue.new(int: 456))]),
|
52
|
+
'test')
|
50
53
|
assert_equal 5, @loader.highwater_mark
|
51
|
-
@loader.set(Prefab::Config.new(id: 2, key:
|
54
|
+
@loader.set(Prefab::Config.new(id: 2, key: 'sample_int', rows: [config_row(Prefab::ConfigValue.new(int: 456))]),
|
55
|
+
'test')
|
52
56
|
assert_equal 5, @loader.highwater_mark
|
53
57
|
end
|
54
58
|
|
55
59
|
def test_keeps_most_recent
|
56
60
|
assert_equal 0, @loader.highwater_mark
|
57
|
-
@loader.set(Prefab::Config.new(id: 1, key:
|
61
|
+
@loader.set(Prefab::Config.new(id: 1, key: 'sample_int', rows: [config_row(Prefab::ConfigValue.new(int: 1))]),
|
62
|
+
'test')
|
58
63
|
assert_equal 1, @loader.highwater_mark
|
59
|
-
should_be :int, 1,
|
64
|
+
should_be :int, 1, 'sample_int'
|
60
65
|
|
61
|
-
@loader.set(Prefab::Config.new(id: 4, key:
|
66
|
+
@loader.set(Prefab::Config.new(id: 4, key: 'sample_int', rows: [config_row(Prefab::ConfigValue.new(int: 4))]),
|
67
|
+
'test')
|
62
68
|
assert_equal 4, @loader.highwater_mark
|
63
|
-
should_be :int, 4,
|
69
|
+
should_be :int, 4, 'sample_int'
|
64
70
|
|
65
|
-
@loader.set(Prefab::Config.new(id: 2, key:
|
71
|
+
@loader.set(Prefab::Config.new(id: 2, key: 'sample_int', rows: [config_row(Prefab::ConfigValue.new(int: 2))]),
|
72
|
+
'test')
|
66
73
|
assert_equal 4, @loader.highwater_mark
|
67
|
-
should_be :int, 4,
|
74
|
+
should_be :int, 4, 'sample_int'
|
68
75
|
end
|
69
76
|
|
70
77
|
def test_api_precedence
|
71
|
-
should_be :int, 123,
|
78
|
+
should_be :int, 123, 'sample_int'
|
72
79
|
|
73
|
-
@loader.set(Prefab::Config.new(key:
|
74
|
-
should_be :int, 456,
|
80
|
+
@loader.set(Prefab::Config.new(key: 'sample_int', rows: [config_row(Prefab::ConfigValue.new(int: 456))]), 'test')
|
81
|
+
should_be :int, 456, 'sample_int'
|
75
82
|
end
|
76
83
|
|
77
84
|
def test_api_deltas
|
78
85
|
val = Prefab::ConfigValue.new(int: 456)
|
79
|
-
config = Prefab::Config.new(key:
|
80
|
-
@loader.set(config,
|
86
|
+
config = Prefab::Config.new(key: 'sample_int', rows: [config_row(val)])
|
87
|
+
@loader.set(config, 'test')
|
81
88
|
|
82
89
|
configs = Prefab::Configs.new
|
83
90
|
configs.configs << config
|
@@ -86,11 +93,11 @@ class TestConfigLoader < Minitest::Test
|
|
86
93
|
|
87
94
|
def test_loading_tombstones_removes_entries
|
88
95
|
val = Prefab::ConfigValue.new(int: 456)
|
89
|
-
config = Prefab::Config.new(key:
|
90
|
-
@loader.set(config,
|
96
|
+
config = Prefab::Config.new(key: 'sample_int', rows: [config_row(val)], id: 2)
|
97
|
+
@loader.set(config, 'test')
|
91
98
|
|
92
|
-
config = Prefab::Config.new(key:
|
93
|
-
@loader.set(config,
|
99
|
+
config = Prefab::Config.new(key: 'sample_int', rows: [], id: 3)
|
100
|
+
@loader.set(config, 'test')
|
94
101
|
|
95
102
|
configs = Prefab::Configs.new
|
96
103
|
assert_equal configs, @loader.get_api_deltas
|
@@ -99,7 +106,11 @@ class TestConfigLoader < Minitest::Test
|
|
99
106
|
private
|
100
107
|
|
101
108
|
def should_be(type, value, key)
|
102
|
-
assert_equal type, @loader.calc_config[key][:config].rows[0].value.type
|
103
|
-
assert_equal value, @loader.calc_config[key][:config].rows[0].value.send(type)
|
109
|
+
assert_equal type, @loader.calc_config[key][:config].rows[0].values[0].value.type
|
110
|
+
assert_equal value, @loader.calc_config[key][:config].rows[0].values[0].value.send(type)
|
111
|
+
end
|
112
|
+
|
113
|
+
def config_row(value)
|
114
|
+
Prefab::ConfigRow.new(values: [Prefab::ConditionalValue.new(value: value)])
|
104
115
|
end
|
105
116
|
end
|