Skip to content

Commit 14cee73

Browse files
committed
Integrations tests
1 parent 207532c commit 14cee73

File tree

71 files changed

+1212
-311
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+1212
-311
lines changed

lib/splitclient-rb/cache/fetchers/split_fetcher.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def fetch_splits(fetch_options = { cache_control_headers: false, till: nil })
2828
SplitIoClient::Helpers::RepositoryHelper.update_feature_flag_repository(@splits_repository, data[:ff][:d], data[:ff][:t], @config)
2929
SplitIoClient::Helpers::RepositoryHelper.update_rule_based_segment_repository(@rule_based_segments_repository, data[:rbs][:d], data[:rbs][:t], @config)
3030
@splits_repository.set_segment_names(data[:segment_names])
31+
@rule_based_segments_repository.set_segment_names(data[:segment_names])
3132
@config.logger.debug("segments seen(#{data[:segment_names].length}): #{data[:segment_names].to_a}") if @config.debug_enabled
3233

3334
{ segment_names: data[:segment_names], success: true }

lib/splitclient-rb/clients/split_client.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def initialize(sdk_key, repositories, status_manager, config, impressions_manage
2222
@api_key = sdk_key
2323
@splits_repository = repositories[:splits]
2424
@segments_repository = repositories[:segments]
25+
@rule_based_segments_repository = repositories[:rule_based_segments]
2526
@impressions_repository = repositories[:impressions]
2627
@events_repository = repositories[:events]
2728
@status_manager = status_manager
@@ -115,6 +116,7 @@ def destroy
115116

116117
@splits_repository.clear
117118
@segments_repository.clear
119+
@rule_based_segments_repository.clear
118120

119121
SplitIoClient.load_factory_registry
120122
SplitIoClient.split_factory_registry.remove(@api_key)

lib/splitclient-rb/engine/api/splits.rb

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def since(since, since_rbs, fetch_options = { cache_control_headers: false, till
3333
@config.split_logger.log_if_transport("Feature flag changes response: #{result[:ff].to_s}")
3434

3535
unless result[:rbs][:d].empty?
36-
@config.split_logger.log_if_debug("#{result[:ff][:d].length} rule based segments retrieved. since=#{since_rbs}")
36+
@config.split_logger.log_if_debug("#{result[:rbs][:d].length} rule based segments retrieved. since=#{since_rbs}")
3737
end
3838
@config.split_logger.log_if_transport("rule based segments changes response: #{result[:rbs].to_s}")
3939

@@ -56,15 +56,24 @@ def since(since, since_rbs, fetch_options = { cache_control_headers: false, till
5656

5757
def objects_with_segment_names(objects_json)
5858
parsed_objects = JSON.parse(objects_json, symbolize_names: true)
59+
parsed_objects[:segment_names] = Set.new
5960
parsed_objects[:segment_names] =
6061
parsed_objects[:ff][:d].each_with_object(Set.new) do |split, splits|
6162
splits << Helpers::Util.segment_names_by_object(split, "IN_SEGMENT")
6263
end.flatten
63-
if not parsed_objects[:ff][:rbs].nil?
64-
parsed_objects[:segment_names].merge parsed_objects[:ff][:rbs].each_with_object(Set.new) do |rule_based_segment, rule_based_segments|
65-
rule_based_segments << Helpers::Util.segment_names_by_object(rule_based_segment, "IN_SEGMENT")
66-
end.flatten
64+
65+
parsed_objects[:rbs][:d].each do |rule_based_segment|
66+
parsed_objects[:segment_names].merge Helpers::Util.segment_names_by_object(rule_based_segment, "IN_SEGMENT")
67+
end
68+
69+
parsed_objects[:rbs][:d].each do |rule_based_segment|
70+
rule_based_segment[:excluded][:segments].each do |segment|
71+
if segment[:type] == "standard"
72+
parsed_objects[:segment_names].add(segment[:name])
73+
end
74+
end
6775
end
76+
6877
parsed_objects
6978
end
7079
end

lib/splitclient-rb/engine/matchers/rule_based_segment_matcher.rb

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,18 @@ def match?(args)
2525
rule_based_segment = @rule_based_segments_repository.get_rule_based_segment(@segment_name)
2626
return false if rule_based_segment.nil?
2727

28-
return false if rule_based_segment[:excluded][:keys].include?([args[:value]])
28+
if args[:value].nil? or args[:value].empty?
29+
key = args[:matching_key]
30+
else
31+
key = args[:value]
32+
end
33+
return false if rule_based_segment[:excluded][:keys].include?(key)
2934

3035
rule_based_segment[:excluded][:segments].each do |segment|
31-
return false if segment[:type] == 'standard' and @segments_repository.in_segment?(segment[:name], args[:value])
36+
return false if segment[:type] == 'standard' and @segments_repository.in_segment?(segment[:name], key)
3237

3338
if segment[:type] == 'rule-based'
34-
return true if match_rbs(@rule_based_segments_repository.get_rule_based_segment(segment[:name])[:conditions], args)
39+
return false if match_rbs(@rule_based_segments_repository.get_rule_based_segment(segment[:name]), args)
3540
end
3641
end
3742

@@ -49,18 +54,13 @@ def match?(args)
4954

5055
private
5156

52-
def match_rbs(conditions, args)
53-
conditions.each do |condition|
54-
next if condition.empty?
55-
56-
return true if Helpers::EvaluatorHelper::matcher_type(SplitIoClient::Condition.new(condition, @config),
57-
@segments_repository, @rule_based_segments_repository).match?(
58-
matching_key: args[:matching_key],
59-
bucketing_key: args[:value],
60-
attributes: args[:attributes]
57+
def match_rbs(rule_based_segment, args)
58+
rbs_matcher = RuleBasedSegmentMatcher.new(@segments_repository, @rule_based_segments_repository, rule_based_segment[:name], @config)
59+
return rbs_matcher.match?(
60+
matching_key: args[:matching_key],
61+
bucketing_key: args[:value],
62+
attributes: args[:attributes]
6163
)
62-
end
63-
return false
6464
end
6565
end
6666
end

lib/splitclient-rb/engine/parser/condition.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def negate
253253
# @return [void]
254254
def set_partitions
255255
partitions_list = []
256-
return partitions_list unless @data.key?('partitions')
256+
return partitions_list unless @data.key?(:partitions) or @data.key?('partitions')
257257

258258
@data[:partitions].each do |p|
259259
partition = SplitIoClient::Partition.new(p)

lib/splitclient-rb/engine/parser/evaluator.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ class Evaluator
55
def initialize(segments_repository, splits_repository, rb_segment_repository, config)
66
@splits_repository = splits_repository
77
@segments_repository = segments_repository
8+
@rb_segment_repository = rb_segment_repository
89
@config = config
910
end
1011

@@ -58,7 +59,6 @@ def match(split, keys, attributes)
5859

5960
in_rollout = true
6061
end
61-
6262
condition_matched = Helpers::EvaluatorHelper::matcher_type(condition, @segments_repository, @rb_segment_repository).match?(
6363
matching_key: keys[:matching_key],
6464
bucketing_key: keys[:bucketing_key],

lib/splitclient-rb/helpers/evaluator_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def self.matcher_type(condition, segments_repository, rb_segment_repository)
88
segments_repository.adapter.pipelined do
99
condition.matchers.each do |matcher|
1010
matchers << if matcher[:negate]
11-
condition.negation_matcher(matcher_instance(matcher[:matcherType], condition, matcher))
11+
condition.negation_matcher(matcher_instance(matcher[:matcherType], condition, matcher, segments_repository, rb_segment_repository))
1212
else
1313
matcher_instance(matcher[:matcherType], condition, matcher, segments_repository, rb_segment_repository)
1414
end

lib/splitclient-rb/split_factory.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def initialize(api_key, config_hash = {})
5555

5656
@status_manager = Engine::StatusManager.new(@config)
5757
@split_validator = SplitIoClient::Validators.new(@config)
58-
@evaluator = Engine::Parser::Evaluator.new(@segments_repository, @splits_repository, @config)
58+
@evaluator = Engine::Parser::Evaluator.new(@segments_repository, @splits_repository, @rule_based_segment_repository, @config)
5959

6060
start!
6161

@@ -179,7 +179,7 @@ def build_telemetry_components
179179
end
180180

181181
def build_fetchers
182-
@split_fetcher = SplitFetcher.new(@splits_repository, @rule_based_segments_repository, @api_key, @config, @runtime_producer)
182+
@split_fetcher = SplitFetcher.new(@splits_repository, @rule_based_segment_repository, @api_key, @config, @runtime_producer)
183183
@segment_fetcher = SegmentFetcher.new(@segments_repository, @api_key, @config, @runtime_producer)
184184
end
185185

@@ -221,7 +221,7 @@ def build_repositories
221221
end
222222
@splits_repository = SplitsRepository.new(@config, @flag_sets_repository, @flag_sets_filter)
223223
@segments_repository = SegmentsRepository.new(@config)
224-
@rule_based_segment_repository = RuleBasedSegmentRepository.new(@config)
224+
@rule_based_segment_repository = RuleBasedSegmentsRepository.new(@config)
225225
@impressions_repository = ImpressionsRepository.new(@config)
226226
@events_repository = EventsRepository.new(@config, @api_key, @runtime_producer)
227227
end

spec/allocations/splitclient-rb/clients/split_client_spec.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
let(:splits_repository) { SplitIoClient::Cache::Repositories::SplitsRepository.new(config, flag_sets_repository, flag_set_filter) }
1111
let(:segments_repository) { SplitIoClient::Cache::Repositories::SegmentsRepository.new(config) }
1212
let(:impressions_repository) { SplitIoClient::Cache::Repositories::ImpressionsRepository.new(config) }
13+
let(:rule_based_segments_repository) { SplitIoClient::Cache::Repositories::RuleBasedSegmentsRepository.new(config) }
1314
let(:impression_counter) { SplitIoClient::Engine::Common::ImpressionCounter.new }
1415
let(:evaluation_producer) { SplitIoClient::Telemetry::EvaluationProducer.new(config) }
1516
let(:impression_observer) { SplitIoClient::Observers::ImpressionObserver.new }
@@ -19,7 +20,7 @@
1920
let(:api_key) { 'SplitClient-key' }
2021
let(:telemetry_api) { SplitIoClient::Api::TelemetryApi.new(config, api_key, runtime_producer) }
2122
let(:impressions_api) { SplitIoClient::Api::Impressions.new(api_key, config, runtime_producer) }
22-
let(:evaluator) { SplitIoClient::Engine::Parser::Evaluator.new(segments_repository, splits_repository, config) }
23+
let(:evaluator) { SplitIoClient::Engine::Parser::Evaluator.new(segments_repository, splits_repository, rule_based_segments_repository, config) }
2324
let(:sender_adapter) do
2425
SplitIoClient::Cache::Senders::ImpressionsSenderAdapter.new(config,
2526
telemetry_api,

spec/cache/fetchers/segment_fetch_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
stub_request(:get, 'https://sdk.split.io/api/segmentChanges/employees?since=1473863075059')
2727
.to_return(status: 200, body: segments_json2)
2828

29-
stub_request(:get, 'https://sdk.split.io/api/splitChanges?s=1.1&since=-1')
29+
stub_request(:get, 'https://sdk.split.io/api/splitChanges?s=1.3&since=-1&rbSince=-1')
3030
.to_return(status: 200, body: splits_with_segments_json)
3131
end
3232

0 commit comments

Comments
 (0)