prefab-cloud-ruby 0.7.0 → 0.10.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/Gemfile +1 -0
- data/Gemfile.lock +24 -0
- data/README.md +9 -0
- data/VERSION +1 -1
- data/lib/prefab/client.rb +14 -8
- data/lib/prefab/config_client.rb +48 -17
- data/lib/prefab/config_loader.rb +12 -10
- data/lib/prefab/config_resolver.rb +34 -38
- data/lib/prefab/feature_flag_client.rb +10 -9
- data/lib/prefab-cloud-ruby.rb +2 -0
- data/lib/prefab_pb.rb +36 -26
- data/lib/prefab_services_pb.rb +17 -3
- data/prefab-cloud-ruby.gemspec +5 -3
- data/run_test_harness_server.sh +1 -1
- data/test/harness_server.rb +11 -3
- data/test/test_config_loader.rb +20 -20
- data/test/test_config_resolver.rb +69 -52
- data/test/test_feature_flag_client.rb +53 -53
- data/test/test_helper.rb +27 -6
- data/test/test_logger.rb +0 -10
- metadata +16 -2
data/run_test_harness_server.sh
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL=debug PREFAB_CLOUD_HTTP=true
|
1
|
+
PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL=debug PREFAB_CLOUD_HTTP=true PREFAB_GRPC_URL="localhost:50051" ruby -Ilib test/harness_server.rb
|
2
2
|
#GRPC_TRACE=all GRPC_VERBOSITY=DEBUG PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL=debug PREFAB_CLOUD_HTTP=true PREFAB_API_KEY="1|local_development_api_key" PREFAB_API_URL="localhost:50051" ruby -Ilib test/harness_server.rb
|
data/test/harness_server.rb
CHANGED
@@ -15,31 +15,39 @@ class RackApp
|
|
15
15
|
|
16
16
|
key = props["key"]
|
17
17
|
namespace = props["namespace"]
|
18
|
-
|
18
|
+
project_env_id = props["project_env_id"]
|
19
19
|
user_key = props["user_key"]
|
20
20
|
is_feature_flag = !props["feature_flag"].nil?
|
21
21
|
|
22
22
|
client = Prefab::Client.new(
|
23
|
-
api_key: "1-#{
|
23
|
+
api_key: "1-#{project_env_id}-local_development_api_key-SDK", #sets environment
|
24
24
|
namespace: namespace,
|
25
25
|
)
|
26
26
|
|
27
27
|
puts "Key #{key}"
|
28
28
|
puts "User #{user_key}"
|
29
|
-
puts "
|
29
|
+
puts "project_env_id #{project_env_id}"
|
30
30
|
puts "Namespace #{namespace}"
|
31
31
|
puts "Props! #{props}"
|
32
32
|
puts "is_feature_flag! #{is_feature_flag}"
|
33
33
|
|
34
|
+
puts client.config_client.to_s
|
35
|
+
|
34
36
|
if is_feature_flag
|
35
37
|
puts "EVALFF #{key} #{user_key}"
|
36
38
|
rtn = client.feature_flag_client.get(key, user_key, []).to_s
|
37
39
|
else
|
38
40
|
rtn = client.config_client.get(key).to_s
|
39
41
|
end
|
42
|
+
|
40
43
|
puts "return #{rtn}"
|
41
44
|
|
42
45
|
[200, { "Content-Type" => "text/plain" }, rtn]
|
46
|
+
|
47
|
+
rescue Exception => e
|
48
|
+
puts "ERROR #{e.message}"
|
49
|
+
puts e.backtrace
|
50
|
+
[500, { "Content-Type" => "text/plain" }, e.message]
|
43
51
|
end
|
44
52
|
end
|
45
53
|
|
data/test/test_config_loader.rb
CHANGED
@@ -16,26 +16,26 @@ class TestConfigLoader < Minitest::Test
|
|
16
16
|
|
17
17
|
def test_highwater
|
18
18
|
assert_equal 0, @loader.highwater_mark
|
19
|
-
@loader.set(Prefab::
|
19
|
+
@loader.set(Prefab::Config.new(id: 1, key: "sample_int", rows: [Prefab::ConfigRow.new(value: Prefab::ConfigValue.new(int: 456))]))
|
20
20
|
assert_equal 1, @loader.highwater_mark
|
21
21
|
|
22
|
-
@loader.set(Prefab::
|
22
|
+
@loader.set(Prefab::Config.new(id: 5, key: "sample_int", rows: [Prefab::ConfigRow.new(value: Prefab::ConfigValue.new(int: 456))]))
|
23
23
|
assert_equal 5, @loader.highwater_mark
|
24
|
-
@loader.set(Prefab::
|
24
|
+
@loader.set(Prefab::Config.new(id: 2, key: "sample_int", rows: [Prefab::ConfigRow.new(value: Prefab::ConfigValue.new(int: 456))]))
|
25
25
|
assert_equal 5, @loader.highwater_mark
|
26
26
|
end
|
27
27
|
|
28
28
|
def test_keeps_most_recent
|
29
29
|
assert_equal 0, @loader.highwater_mark
|
30
|
-
@loader.set(Prefab::
|
30
|
+
@loader.set(Prefab::Config.new(id: 1, key: "sample_int", rows: [Prefab::ConfigRow.new(value: Prefab::ConfigValue.new(int: 1))]))
|
31
31
|
assert_equal 1, @loader.highwater_mark
|
32
32
|
should_be :int, 1, "sample_int"
|
33
33
|
|
34
|
-
@loader.set(Prefab::
|
34
|
+
@loader.set(Prefab::Config.new(id: 4, key: "sample_int", rows: [Prefab::ConfigRow.new(value: Prefab::ConfigValue.new(int: 4))]))
|
35
35
|
assert_equal 4, @loader.highwater_mark
|
36
36
|
should_be :int, 4, "sample_int"
|
37
37
|
|
38
|
-
@loader.set(Prefab::
|
38
|
+
@loader.set(Prefab::Config.new(id: 2, key: "sample_int", rows: [Prefab::ConfigRow.new(value: Prefab::ConfigValue.new(int: 2))]))
|
39
39
|
assert_equal 4, @loader.highwater_mark
|
40
40
|
should_be :int, 4, "sample_int"
|
41
41
|
end
|
@@ -43,37 +43,37 @@ class TestConfigLoader < Minitest::Test
|
|
43
43
|
def test_api_precedence
|
44
44
|
should_be :int, 123, "sample_int"
|
45
45
|
|
46
|
-
@loader.set(Prefab::
|
46
|
+
@loader.set(Prefab::Config.new(key: "sample_int", rows: [Prefab::ConfigRow.new(value: Prefab::ConfigValue.new(int: 456))]))
|
47
47
|
should_be :int, 456, "sample_int"
|
48
48
|
end
|
49
49
|
|
50
50
|
def test_api_deltas
|
51
51
|
val = Prefab::ConfigValue.new(int: 456)
|
52
|
-
|
53
|
-
@loader.set(
|
52
|
+
config = Prefab::Config.new(key: "sample_int", rows: [Prefab::ConfigRow.new(value: val)])
|
53
|
+
@loader.set(config)
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
assert_equal
|
55
|
+
configs = Prefab::Configs.new
|
56
|
+
configs.configs << config
|
57
|
+
assert_equal configs, @loader.get_api_deltas
|
58
58
|
end
|
59
59
|
|
60
60
|
def test_loading_tombstones_removes_entries
|
61
61
|
val = Prefab::ConfigValue.new(int: 456)
|
62
|
-
|
63
|
-
@loader.set(
|
62
|
+
config = Prefab::Config.new(key: "sample_int", rows: [Prefab::ConfigRow.new(value: val)])
|
63
|
+
@loader.set(config)
|
64
64
|
|
65
|
-
|
66
|
-
@loader.set(
|
65
|
+
config = Prefab::Config.new(key: "sample_int", rows: [])
|
66
|
+
@loader.set(config)
|
67
67
|
|
68
|
-
|
69
|
-
assert_equal
|
68
|
+
configs = Prefab::Configs.new
|
69
|
+
assert_equal configs, @loader.get_api_deltas
|
70
70
|
end
|
71
71
|
|
72
72
|
private
|
73
73
|
|
74
74
|
def should_be(type, value, key)
|
75
|
-
assert_equal type, @loader.calc_config[key].
|
76
|
-
assert_equal value, @loader.calc_config[key].
|
75
|
+
assert_equal type, @loader.calc_config[key].rows[0].value.type
|
76
|
+
assert_equal value, @loader.calc_config[key].rows[0].value.send(type)
|
77
77
|
end
|
78
78
|
|
79
79
|
end
|
@@ -2,45 +2,58 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class TestConfigResolver < Minitest::Test
|
4
4
|
|
5
|
+
STAGING_ENV_ID = 1
|
6
|
+
PRODUCTION_ENV_ID = 2
|
7
|
+
TEST_ENV_ID = 3
|
8
|
+
|
5
9
|
def test_resolution
|
6
10
|
@loader = MockConfigLoader.new
|
7
11
|
|
8
12
|
loaded_values = {
|
9
|
-
"key" => Prefab::
|
13
|
+
"key" => Prefab::Config.new(
|
10
14
|
key: "key",
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
15
|
+
rows: [
|
16
|
+
Prefab::ConfigRow.new(
|
17
|
+
value: Prefab::ConfigValue.new(string: "value_no_env_default"),
|
18
|
+
),
|
19
|
+
Prefab::ConfigRow.new(
|
20
|
+
project_env_id: TEST_ENV_ID,
|
21
|
+
value: Prefab::ConfigValue.new(string: "value_none"),
|
22
|
+
),
|
23
|
+
Prefab::ConfigRow.new(
|
24
|
+
project_env_id: TEST_ENV_ID,
|
25
|
+
namespace: "projectA",
|
26
|
+
value: Prefab::ConfigValue.new(string: "valueA"),
|
27
|
+
),
|
28
|
+
Prefab::ConfigRow.new(
|
29
|
+
project_env_id: TEST_ENV_ID,
|
30
|
+
namespace: "projectB",
|
31
|
+
value: Prefab::ConfigValue.new(string: "valueB"),
|
32
|
+
),
|
33
|
+
Prefab::ConfigRow.new(
|
34
|
+
project_env_id: TEST_ENV_ID,
|
35
|
+
namespace: "projectB.subprojectX",
|
36
|
+
value: Prefab::ConfigValue.new(string: "projectB.subprojectX"),
|
37
|
+
),
|
38
|
+
Prefab::ConfigRow.new(
|
39
|
+
project_env_id: TEST_ENV_ID,
|
40
|
+
namespace: "projectB.subprojectY",
|
41
|
+
value: Prefab::ConfigValue.new(string: "projectB.subprojectY"),
|
42
|
+
),
|
43
|
+
|
44
|
+
]
|
34
45
|
),
|
35
|
-
"key2" => Prefab::
|
46
|
+
"key2" => Prefab::Config.new(
|
36
47
|
key: "key2",
|
37
|
-
|
48
|
+
rows: [
|
49
|
+
value: Prefab::ConfigValue.new(string: "valueB2"),
|
50
|
+
]
|
38
51
|
)
|
39
52
|
}
|
40
53
|
|
41
54
|
@loader.stub :calc_config, loaded_values do
|
42
55
|
|
43
|
-
@resolverA = resolver_for_namespace("", @loader,
|
56
|
+
@resolverA = resolver_for_namespace("", @loader, project_env_id: PRODUCTION_ENV_ID)
|
44
57
|
assert_equal "value_no_env_default", @resolverA.get("key")
|
45
58
|
|
46
59
|
## below here in the test env
|
@@ -91,34 +104,34 @@ class TestConfigResolver < Minitest::Test
|
|
91
104
|
end
|
92
105
|
|
93
106
|
def test_special_ff_variant_copying
|
107
|
+
|
94
108
|
@loader = MockConfigLoader.new
|
95
109
|
loaded_values = {
|
96
|
-
"ff" => Prefab::
|
110
|
+
"ff" => Prefab::Config.new(
|
97
111
|
key: "ff",
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
default: Prefab::ConfigValue.new(feature_flag: Prefab::FeatureFlag.new(
|
112
|
+
variants: [
|
113
|
+
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
114
|
+
Prefab::FeatureFlagVariant.new(string: "default"),
|
115
|
+
Prefab::FeatureFlagVariant.new(string: "env"),
|
116
|
+
],
|
117
|
+
rows: [
|
118
|
+
{ value: Prefab::ConfigValue.new(feature_flag: Prefab::FeatureFlag.new(
|
119
|
+
inactive_variant_idx: 0,
|
120
|
+
default: Prefab::VariantDistribution.new(variant_idx: 1)
|
121
|
+
)) },
|
122
|
+
{ project_env_id: TEST_ENV_ID,
|
123
|
+
value: Prefab::ConfigValue.new(feature_flag: Prefab::FeatureFlag.new(
|
111
124
|
inactive_variant_idx: 0,
|
112
|
-
default: Prefab::VariantDistribution.new(variant_idx: 2)
|
113
|
-
|
125
|
+
default: Prefab::VariantDistribution.new(variant_idx: 2)
|
126
|
+
)) }
|
114
127
|
]
|
115
128
|
)
|
116
129
|
}
|
117
130
|
@loader.stub :calc_config, loaded_values do
|
118
131
|
resolver = Prefab::ConfigResolver.new(MockBaseClient.new, @loader)
|
119
|
-
|
120
|
-
assert_equal 3,
|
121
|
-
assert_equal %w(inactive default env),
|
132
|
+
config = resolver.get_config("ff")
|
133
|
+
assert_equal 3, config.variants.size
|
134
|
+
assert_equal %w(inactive default env), config.variants.map(&:string)
|
122
135
|
end
|
123
136
|
end
|
124
137
|
|
@@ -127,13 +140,17 @@ class TestConfigResolver < Minitest::Test
|
|
127
140
|
@loader = MockConfigLoader.new
|
128
141
|
|
129
142
|
loaded_values = {
|
130
|
-
"Key:With:Colons" => Prefab::
|
143
|
+
"Key:With:Colons" => Prefab::Config.new(
|
131
144
|
key: "Key:With:Colons",
|
132
|
-
|
145
|
+
rows: [Prefab::ConfigRow.new(
|
146
|
+
value: Prefab::ConfigValue.new(string: "value")
|
147
|
+
)]
|
133
148
|
),
|
134
|
-
"proj:apikey" => Prefab::
|
149
|
+
"proj:apikey" => Prefab::Config.new(
|
135
150
|
key: "proj:apikey",
|
136
|
-
|
151
|
+
rows: [Prefab::ConfigRow.new(
|
152
|
+
value: Prefab::ConfigValue.new(string: "v2")
|
153
|
+
)]
|
137
154
|
)
|
138
155
|
}
|
139
156
|
|
@@ -171,8 +188,8 @@ class TestConfigResolver < Minitest::Test
|
|
171
188
|
end
|
172
189
|
end
|
173
190
|
|
174
|
-
def resolver_for_namespace(namespace, loader,
|
175
|
-
Prefab::ConfigResolver.new(MockBaseClient.new(namespace: namespace,
|
191
|
+
def resolver_for_namespace(namespace, loader, project_env_id: TEST_ENV_ID)
|
192
|
+
Prefab::ConfigResolver.new(MockBaseClient.new(namespace: namespace, project_env_id: project_env_id), loader)
|
176
193
|
end
|
177
194
|
|
178
195
|
end
|
@@ -13,12 +13,12 @@ class TestFeatureFlagClient < Minitest::Test
|
|
13
13
|
def test_pct
|
14
14
|
feature = "FlagName"
|
15
15
|
|
16
|
+
variants = [
|
17
|
+
Prefab::FeatureFlagVariant.new(bool: false),
|
18
|
+
Prefab::FeatureFlagVariant.new(bool: true)
|
19
|
+
]
|
16
20
|
flag = Prefab::FeatureFlag.new(
|
17
21
|
active: true,
|
18
|
-
variants: [
|
19
|
-
Prefab::FeatureFlagVariant.new(bool: false),
|
20
|
-
Prefab::FeatureFlagVariant.new(bool: true)
|
21
|
-
],
|
22
22
|
inactive_variant_idx: 0,
|
23
23
|
default: Prefab::VariantDistribution.new(variant_weights:
|
24
24
|
Prefab::VariantWeights.new(weights: [
|
@@ -32,52 +32,52 @@ class TestFeatureFlagClient < Minitest::Test
|
|
32
32
|
)
|
33
33
|
|
34
34
|
assert_equal false,
|
35
|
-
@client.evaluate(feature, "hashes high", [], flag)
|
35
|
+
@client.evaluate(feature, "hashes high", [], flag, variants)
|
36
36
|
assert_equal true,
|
37
|
-
@client.evaluate(feature, "hashes low", [], flag)
|
37
|
+
@client.evaluate(feature, "hashes low", [], flag, variants)
|
38
38
|
end
|
39
39
|
|
40
40
|
def test_basic_active_inactive
|
41
41
|
feature = "FlagName"
|
42
|
+
variants = [
|
43
|
+
Prefab::FeatureFlagVariant.new(bool: false),
|
44
|
+
Prefab::FeatureFlagVariant.new(bool: true)
|
45
|
+
]
|
42
46
|
flag = Prefab::FeatureFlag.new(
|
43
47
|
active: true,
|
44
|
-
variants: [
|
45
|
-
Prefab::FeatureFlagVariant.new(bool: false),
|
46
|
-
Prefab::FeatureFlagVariant.new(bool: true)
|
47
|
-
],
|
48
48
|
inactive_variant_idx: 0,
|
49
49
|
default: Prefab::VariantDistribution.new(variant_idx: 1)
|
50
50
|
)
|
51
51
|
assert_equal true,
|
52
|
-
@client.evaluate(feature, "hashes high", [], flag)
|
52
|
+
@client.evaluate(feature, "hashes high", [], flag, variants)
|
53
53
|
assert_equal true,
|
54
|
-
@client.evaluate(feature, "hashes low", [], flag)
|
54
|
+
@client.evaluate(feature, "hashes low", [], flag, variants)
|
55
55
|
|
56
|
+
variants = [
|
57
|
+
Prefab::FeatureFlagVariant.new(bool: false),
|
58
|
+
Prefab::FeatureFlagVariant.new(bool: true)
|
59
|
+
]
|
56
60
|
flag = Prefab::FeatureFlag.new(
|
57
61
|
active: false,
|
58
|
-
variants: [
|
59
|
-
Prefab::FeatureFlagVariant.new(bool: false),
|
60
|
-
Prefab::FeatureFlagVariant.new(bool: true)
|
61
|
-
],
|
62
62
|
inactive_variant_idx: 0,
|
63
63
|
default: Prefab::VariantDistribution.new(variant_idx: 1)
|
64
64
|
)
|
65
65
|
assert_equal false,
|
66
|
-
@client.evaluate(feature, "hashes high", [], flag)
|
66
|
+
@client.evaluate(feature, "hashes high", [], flag, variants)
|
67
67
|
assert_equal false,
|
68
|
-
@client.evaluate(feature, "hashes low", [], flag)
|
68
|
+
@client.evaluate(feature, "hashes low", [], flag, variants)
|
69
69
|
end
|
70
70
|
|
71
71
|
def test_user_targets
|
72
72
|
|
73
73
|
feature = "FlagName"
|
74
|
+
variants = [
|
75
|
+
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
76
|
+
Prefab::FeatureFlagVariant.new(string: "user target"),
|
77
|
+
Prefab::FeatureFlagVariant.new(string: "default"),
|
78
|
+
]
|
74
79
|
flag = Prefab::FeatureFlag.new(
|
75
80
|
active: true,
|
76
|
-
variants: [
|
77
|
-
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
78
|
-
Prefab::FeatureFlagVariant.new(string: "user target"),
|
79
|
-
Prefab::FeatureFlagVariant.new(string: "default"),
|
80
|
-
],
|
81
81
|
inactive_variant_idx: 0,
|
82
82
|
user_targets: [
|
83
83
|
variant_idx: 1,
|
@@ -87,22 +87,22 @@ class TestFeatureFlagClient < Minitest::Test
|
|
87
87
|
)
|
88
88
|
|
89
89
|
assert_equal "user target",
|
90
|
-
@client.evaluate(feature, "user:1", [], flag)
|
90
|
+
@client.evaluate(feature, "user:1", [], flag, variants)
|
91
91
|
assert_equal "default",
|
92
|
-
@client.evaluate(feature, "user:2", [], flag)
|
92
|
+
@client.evaluate(feature, "user:2", [], flag, variants)
|
93
93
|
assert_equal "user target",
|
94
|
-
@client.evaluate(feature, "user:3", [], flag)
|
94
|
+
@client.evaluate(feature, "user:3", [], flag, variants)
|
95
95
|
end
|
96
96
|
|
97
97
|
def test_inclusion_rule
|
98
98
|
feature = "FlagName"
|
99
|
+
variants = [
|
100
|
+
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
101
|
+
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
102
|
+
Prefab::FeatureFlagVariant.new(string: "default"),
|
103
|
+
]
|
99
104
|
flag = Prefab::FeatureFlag.new(
|
100
105
|
active: true,
|
101
|
-
variants: [
|
102
|
-
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
103
|
-
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
104
|
-
Prefab::FeatureFlagVariant.new(string: "default"),
|
105
|
-
],
|
106
106
|
inactive_variant_idx: 0,
|
107
107
|
rules: [Prefab::Rule.new(
|
108
108
|
distribution: Prefab::VariantDistribution.new(variant_idx: 1),
|
@@ -115,9 +115,9 @@ class TestFeatureFlagClient < Minitest::Test
|
|
115
115
|
)
|
116
116
|
|
117
117
|
assert_equal "rule target",
|
118
|
-
@client.evaluate(feature, "user:1", [], flag)
|
118
|
+
@client.evaluate(feature, "user:1", [], flag, variants)
|
119
119
|
assert_equal "default",
|
120
|
-
@client.evaluate(feature, "user:2", [], flag)
|
120
|
+
@client.evaluate(feature, "user:2", [], flag, variants)
|
121
121
|
|
122
122
|
end
|
123
123
|
|
@@ -135,7 +135,7 @@ class TestFeatureFlagClient < Minitest::Test
|
|
135
135
|
|
136
136
|
def test_segments
|
137
137
|
segment_key = "prefab-segment-beta-group"
|
138
|
-
@mock_base_client.mock_this_config(segment_key,
|
138
|
+
@mock_base_client.config_client.mock_this_config(segment_key,
|
139
139
|
Prefab::Segment.new(
|
140
140
|
name: "Beta Group",
|
141
141
|
includes: ["user:1"]
|
@@ -143,13 +143,13 @@ class TestFeatureFlagClient < Minitest::Test
|
|
143
143
|
)
|
144
144
|
|
145
145
|
feature = "FlagName"
|
146
|
+
variants = [
|
147
|
+
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
148
|
+
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
149
|
+
Prefab::FeatureFlagVariant.new(string: "default"),
|
150
|
+
]
|
146
151
|
flag = Prefab::FeatureFlag.new(
|
147
152
|
active: true,
|
148
|
-
variants: [
|
149
|
-
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
150
|
-
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
151
|
-
Prefab::FeatureFlagVariant.new(string: "default"),
|
152
|
-
],
|
153
153
|
inactive_variant_idx: 0,
|
154
154
|
rules: [Prefab::Rule.new(
|
155
155
|
distribution: Prefab::VariantDistribution.new(variant_idx: 1),
|
@@ -162,15 +162,15 @@ class TestFeatureFlagClient < Minitest::Test
|
|
162
162
|
)
|
163
163
|
|
164
164
|
assert_equal "rule target",
|
165
|
-
@client.evaluate(feature, "user:1", [], flag)
|
165
|
+
@client.evaluate(feature, "user:1", [], flag, variants)
|
166
166
|
assert_equal "default",
|
167
|
-
@client.evaluate(feature, "user:2", [], flag)
|
167
|
+
@client.evaluate(feature, "user:2", [], flag, variants)
|
168
168
|
|
169
169
|
end
|
170
170
|
|
171
171
|
def test_in_multiple_segments_has_or_behavior
|
172
172
|
segment_key_one = "prefab-segment-segment-1"
|
173
|
-
@mock_base_client.mock_this_config(segment_key_one,
|
173
|
+
@mock_base_client.config_client.mock_this_config(segment_key_one,
|
174
174
|
Prefab::Segment.new(
|
175
175
|
name: "Segment-1",
|
176
176
|
includes: ["user:1", "user:2"],
|
@@ -178,7 +178,7 @@ class TestFeatureFlagClient < Minitest::Test
|
|
178
178
|
)
|
179
179
|
)
|
180
180
|
segment_key_two = "prefab-segment-segment-2"
|
181
|
-
@mock_base_client.mock_this_config(segment_key_two,
|
181
|
+
@mock_base_client.config_client.mock_this_config(segment_key_two,
|
182
182
|
Prefab::Segment.new(
|
183
183
|
name: "Segment-2",
|
184
184
|
includes: ["user:3", "user:4"],
|
@@ -187,13 +187,13 @@ class TestFeatureFlagClient < Minitest::Test
|
|
187
187
|
)
|
188
188
|
|
189
189
|
feature = "FlagName"
|
190
|
+
variants = [
|
191
|
+
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
192
|
+
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
193
|
+
Prefab::FeatureFlagVariant.new(string: "default"),
|
194
|
+
]
|
190
195
|
flag = Prefab::FeatureFlag.new(
|
191
196
|
active: true,
|
192
|
-
variants: [
|
193
|
-
Prefab::FeatureFlagVariant.new(string: "inactive"),
|
194
|
-
Prefab::FeatureFlagVariant.new(string: "rule target"),
|
195
|
-
Prefab::FeatureFlagVariant.new(string: "default"),
|
196
|
-
],
|
197
197
|
inactive_variant_idx: 0,
|
198
198
|
rules: [Prefab::Rule.new(
|
199
199
|
distribution: Prefab::VariantDistribution.new(variant_idx: 1),
|
@@ -206,15 +206,15 @@ class TestFeatureFlagClient < Minitest::Test
|
|
206
206
|
)
|
207
207
|
|
208
208
|
assert_equal "rule target",
|
209
|
-
@client.evaluate(feature, "user:1", [], flag)
|
209
|
+
@client.evaluate(feature, "user:1", [], flag, variants)
|
210
210
|
assert_equal "rule target",
|
211
|
-
@client.evaluate(feature, "user:2", [], flag), "matches segment 1"
|
211
|
+
@client.evaluate(feature, "user:2", [], flag, variants), "matches segment 1"
|
212
212
|
assert_equal "rule target",
|
213
|
-
@client.evaluate(feature, "user:3", [], flag)
|
213
|
+
@client.evaluate(feature, "user:3", [], flag, variants)
|
214
214
|
assert_equal "rule target",
|
215
|
-
@client.evaluate(feature, "user:4", [], flag)
|
215
|
+
@client.evaluate(feature, "user:4", [], flag, variants)
|
216
216
|
assert_equal "default",
|
217
|
-
@client.evaluate(feature, "user:5", [], flag)
|
217
|
+
@client.evaluate(feature, "user:5", [], flag, variants)
|
218
218
|
|
219
219
|
end
|
220
220
|
end
|
data/test/test_helper.rb
CHANGED
@@ -2,29 +2,50 @@ require 'minitest/autorun'
|
|
2
2
|
require 'prefab-cloud-ruby'
|
3
3
|
|
4
4
|
class MockBaseClient
|
5
|
-
|
5
|
+
STAGING_ENV_ID = 1
|
6
|
+
PRODUCTION_ENV_ID = 2
|
7
|
+
TEST_ENV_ID = 3
|
8
|
+
attr_reader :namespace, :logger, :project_env_id, :config_client
|
6
9
|
|
7
|
-
def initialize(
|
8
|
-
@
|
10
|
+
def initialize(project_env_id: TEST_ENV_ID, namespace: "")
|
11
|
+
@project_env_id = project_env_id
|
9
12
|
@namespace = namespace
|
10
13
|
@logger = Logger.new($stdout)
|
11
|
-
@
|
14
|
+
@config_client = MockConfigClient.new
|
12
15
|
end
|
13
16
|
|
14
17
|
def project_id
|
15
18
|
1
|
16
19
|
end
|
17
20
|
|
21
|
+
def project_env_id
|
22
|
+
@project_env_id
|
23
|
+
end
|
24
|
+
|
18
25
|
def log_internal level, message
|
19
26
|
end
|
20
27
|
|
21
|
-
def
|
22
|
-
@config_values[key]
|
28
|
+
def config_value key
|
29
|
+
@config_values[key]
|
23
30
|
end
|
24
31
|
|
32
|
+
end
|
33
|
+
|
34
|
+
class MockConfigClient
|
35
|
+
def initialize(config_values = {})
|
36
|
+
@config_values = config_values
|
37
|
+
end
|
25
38
|
def get(key)
|
26
39
|
@config_values[key]
|
27
40
|
end
|
41
|
+
|
42
|
+
def get_config(key)
|
43
|
+
Prefab::Config.new(value: @config_values[key], key: key)
|
44
|
+
end
|
45
|
+
|
46
|
+
def mock_this_config key, config_value
|
47
|
+
@config_values[key] = config_value
|
48
|
+
end
|
28
49
|
end
|
29
50
|
|
30
51
|
class MockConfigLoader
|
data/test/test_logger.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prefab-cloud-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Dwyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -44,6 +44,20 @@ dependencies:
|
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ld-eventsource
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
62
|
name: grpc
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|