From 0165dee6159fa924c9a71186ee41fe0b982c38b0 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 06:14:58 -0500 Subject: [PATCH 01/21] [FSSDK-11459] Ruby - Add SDK Multi-Region Support for Data Hosting --- .../config/datafile_project_config.rb | 3 +- lib/optimizely/event/event_factory.rb | 9 ++- lib/optimizely/event/user_event_factory.rb | 2 + lib/optimizely/event_builder.rb | 11 +++- lib/optimizely/project_config.rb | 2 + spec/config/datafile_project_config_spec.rb | 18 ++++++ spec/event/event_factory_spec.rb | 59 +++++++++--------- spec/event/user_event_factory_spec.rb | 4 ++ spec/event_builder_spec.rb | 62 ++++++++++--------- spec/spec_params.rb | 1 + 10 files changed, 111 insertions(+), 60 deletions(-) diff --git a/lib/optimizely/config/datafile_project_config.rb b/lib/optimizely/config/datafile_project_config.rb index 1f03171d..44fd0bf0 100644 --- a/lib/optimizely/config/datafile_project_config.rb +++ b/lib/optimizely/config/datafile_project_config.rb @@ -32,7 +32,7 @@ class DatafileProjectConfig < ProjectConfig :group_id_map, :rollout_id_map, :rollout_experiment_id_map, :variation_id_map, :variation_id_to_variable_usage_map, :variation_key_map, :variation_id_map_by_experiment_id, :variation_key_map_by_experiment_id, :flag_variation_map, :integration_key_map, :integrations, - :public_key_for_odp, :host_for_odp, :all_segments + :public_key_for_odp, :host_for_odp, :all_segments, :region # Boolean - denotes if Optimizely should remove the last block of visitors' IP address before storing event data attr_reader :anonymize_ip @@ -68,6 +68,7 @@ def initialize(datafile, logger, error_handler) @rollouts = config.fetch('rollouts', []) @send_flag_decisions = config.fetch('sendFlagDecisions', false) @integrations = config.fetch('integrations', []) + @region = config.fetch('region', 'US') # Json type is represented in datafile as a subtype of string for the sake of backwards compatibility. # Converting it to a first-class json type while creating Project Config diff --git a/lib/optimizely/event/event_factory.rb b/lib/optimizely/event/event_factory.rb index 9ac8a937..d8ad5913 100644 --- a/lib/optimizely/event/event_factory.rb +++ b/lib/optimizely/event/event_factory.rb @@ -28,7 +28,10 @@ class EventFactory # EventFactory builds LogEvent objects from a given user_event. class << self CUSTOM_ATTRIBUTE_FEATURE_TYPE = 'custom' - ENDPOINT = 'https://logx.optimizely.com/v1/events' + ENDPOINTS = { + US: 'https://logx.optimizely.com/v1/events', + EU: 'https://eu.logx.optimizely.com/v1/events' + } POST_HEADERS = {'Content-Type' => 'application/json'}.freeze ACTIVATE_EVENT_KEY = 'campaign_activated' @@ -64,9 +67,13 @@ def create_log_event(user_events, logger) builder.with_client_name(user_context[:client_name]) builder.with_anonymize_ip(user_context[:anonymize_ip]) builder.with_enrich_decisions(true) + builder.with_region(user_context[:region]) builder.with_visitors(visitors) event_batch = builder.build + + ENDPOINT = ENDPOINTS[user_context[:region].to_sym] || ENDPOINTS[:US] + Event.new(:post, ENDPOINT, event_batch.as_json, POST_HEADERS) end diff --git a/lib/optimizely/event/user_event_factory.rb b/lib/optimizely/event/user_event_factory.rb index f7852341..872a70b8 100644 --- a/lib/optimizely/event/user_event_factory.rb +++ b/lib/optimizely/event/user_event_factory.rb @@ -33,6 +33,7 @@ def self.create_impression_event(project_config, experiment, variation_id, metad # # Returns Event encapsulating the impression event. event_context = Optimizely::EventContext.new( + region: project_config.region, account_id: project_config.account_id, project_id: project_config.project_id, anonymize_ip: project_config.anonymize_ip, @@ -67,6 +68,7 @@ def self.create_conversion_event(project_config, event, user_id, user_attributes # Returns Event encapsulating the conversion event. event_context = Optimizely::EventContext.new( + region: project_config.region, account_id: project_config.account_id, project_id: project_config.project_id, anonymize_ip: project_config.anonymize_ip, diff --git a/lib/optimizely/event_builder.rb b/lib/optimizely/event_builder.rb index 4c743cc3..7396d1da 100644 --- a/lib/optimizely/event_builder.rb +++ b/lib/optimizely/event_builder.rb @@ -107,7 +107,10 @@ def get_common_params(project_config, user_id, attributes) end class EventBuilder < BaseEventBuilder - ENDPOINT = 'https://logx.optimizely.com/v1/events' + ENDPOINTS = { + US: 'https://logx.optimizely.com/v1/events', + EU: 'https://eu.logx.optimizely.com/v1/events' + } POST_HEADERS = {'Content-Type' => 'application/json'}.freeze ACTIVATE_EVENT_KEY = 'campaign_activated' @@ -122,10 +125,13 @@ def create_impression_event(project_config, experiment, variation_id, user_id, a # # Returns +Event+ encapsulating the impression event. + region = project_config.region || 'US' event_params = get_common_params(project_config, user_id, attributes) impression_params = get_impression_params(project_config, experiment, variation_id) event_params[:visitors][0][:snapshots].push(impression_params) + ENDPOINT = ENDPOINTS[region] + Event.new(:post, ENDPOINT, event_params, POST_HEADERS) end @@ -140,10 +146,13 @@ def create_conversion_event(project_config, event, user_id, attributes, event_ta # # Returns +Event+ encapsulating the conversion event. + region = project_config.region || 'US' event_params = get_common_params(project_config, user_id, attributes) conversion_params = get_conversion_params(event, event_tags) event_params[:visitors][0][:snapshots] = [conversion_params] + ENDPOINT = ENDPOINTS[region] + Event.new(:post, ENDPOINT, event_params, POST_HEADERS) end diff --git a/lib/optimizely/project_config.rb b/lib/optimizely/project_config.rb index 43e86441..b5094b62 100644 --- a/lib/optimizely/project_config.rb +++ b/lib/optimizely/project_config.rb @@ -62,6 +62,8 @@ def host_for_odp; end def all_segments; end + def region; end + def experiment_running?(experiment); end def get_experiment_from_key(experiment_key); end diff --git a/spec/config/datafile_project_config_spec.rb b/spec/config/datafile_project_config_spec.rb index 362141d6..05b90a5f 100644 --- a/spec/config/datafile_project_config_spec.rb +++ b/spec/config/datafile_project_config_spec.rb @@ -57,6 +57,7 @@ expect(project_config.sdk_key).to eq(config_body['sdkKey']) expect(project_config.environment_key).to eq(config_body['environmentKey']) expect(project_config.send_flag_decisions).to eq(config_body['sendFlagDecisions']) + expect(project_config.region).to eq(config_body['region']) expected_attribute_key_map = { 'browser_type' => config_body['attributes'][0], @@ -756,6 +757,23 @@ expect(project_config.rollout_experiment_id_map).to eq(expected_rollout_experiment_id_map) end + it 'should use US region when no region is specified in datafile' do + project_config = Optimizely::DatafileProjectConfig.new(config_body_JSON, logger, error_handler) + expect(project_config.region).to eq('US') + end + + it 'should parse region specified in datafile correctly' do + project_configUS = Optimizely::DatafileProjectConfig.new(config_body_JSON, logger, error_handler) + expect(project_config.region).to eq('US') + + config_bodyEU = config_body.dup + config_bodyEU['region'] = 'EU' + config_body_JSON = JSON.dump(config_bodyEU) + project_configEU = Optimizely::DatafileProjectConfig.new(config_body_JSON, logger, error_handler) + + expect(project_config.region).to eq('EU') + end + it 'should initialize properties correctly upon creating project with typed audience dict' do project_config = Optimizely::DatafileProjectConfig.new(JSON.dump(OptimizelySpec::CONFIG_DICT_WITH_TYPED_AUDIENCES), logger, error_handler) config_body = OptimizelySpec::CONFIG_DICT_WITH_TYPED_AUDIENCES diff --git a/spec/event/event_factory_spec.rb b/spec/event/event_factory_spec.rb index b92661be..00492ba0 100644 --- a/spec/event/event_factory_spec.rb +++ b/spec/event/event_factory_spec.rb @@ -34,7 +34,10 @@ allow(Time).to receive(:now).and_return(time_now) allow(SecureRandom).to receive(:uuid).and_return('a68cf1ad-0393-4e18-af87-efe8f01a7c9c') - @expected_endpoint = 'https://logx.optimizely.com/v1/events' + @expected_endpoints[:US] = { + US: 'https://logx.optimizely.com/v1/events', + EU: 'https://eu.logx.optimizely.com/v1/events' + } @expected_impression_params = { account_id: '12001', project_id: '111001', @@ -111,7 +114,7 @@ impression_event = Optimizely::UserEventFactory.create_impression_event(project_config, experiment, '111128', metadata, 'test_user', nil) log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -134,7 +137,7 @@ 'browser_type' => 'firefox') log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -184,7 +187,7 @@ impression_event = Optimizely::UserEventFactory.create_impression_event(project_config, experiment, '111128', metadata, 'test_user', attributes) log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -225,7 +228,7 @@ impression_event = Optimizely::UserEventFactory.create_impression_event(project_config, experiment, '111128', metadata, 'test_user', attributes) log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -248,7 +251,7 @@ 'browser_type' => false) log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -270,7 +273,7 @@ impression_event = Optimizely::UserEventFactory.create_impression_event(project_config, experiment, '111128', metadata, 'test_user', 'browser_type' => 0) log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -286,7 +289,7 @@ invalid_attribute: 'sorry_not_sorry') log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -294,7 +297,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, nil) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -309,7 +312,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', {'browser_type' => 'firefox'}, nil) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -322,7 +325,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -335,7 +338,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -347,7 +350,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -359,7 +362,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -375,7 +378,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -390,7 +393,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -404,7 +407,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -418,7 +421,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -432,7 +435,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -447,7 +450,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -461,7 +464,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', nil, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -487,7 +490,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', {'browser_type' => 'firefox'}, event_tags) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -520,7 +523,7 @@ impression_event = Optimizely::UserEventFactory.create_impression_event(project_config, experiment, '111128', metadata, 'test_user', user_attributes) log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -556,7 +559,7 @@ impression_event = Optimizely::UserEventFactory.create_impression_event(project_config, experiment, '111128', metadata, 'test_user', user_attributes) log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -594,7 +597,7 @@ ) log_event = Optimizely::EventFactory.create_log_event(impression_event, spy_logger) expect(log_event.params).to eq(@expected_impression_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -620,7 +623,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', user_attributes, nil) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -642,7 +645,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', user_attributes, nil) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end @@ -671,7 +674,7 @@ conversion_event = Optimizely::UserEventFactory.create_conversion_event(project_config, event, 'test_user', user_attributes, nil) log_event = Optimizely::EventFactory.create_log_event(conversion_event, spy_logger) expect(log_event.params).to eq(@expected_conversion_params) - expect(log_event.url).to eq(@expected_endpoint) + expect(log_event.url).to eq(@expected_endpoints[:US]) expect(log_event.http_verb).to eq(:post) end end diff --git a/spec/event/user_event_factory_spec.rb b/spec/event/user_event_factory_spec.rb index f9876c23..53f678f1 100644 --- a/spec/event/user_event_factory_spec.rb +++ b/spec/event/user_event_factory_spec.rb @@ -46,6 +46,7 @@ expect(impression_event.event_context[:project_id]).to eq(project_config.project_id) expect(impression_event.event_context[:revision]).to eq(project_config.revision) expect(impression_event.event_context[:anonymize_ip]).to eq(project_config.anonymize_ip) + expect(impression_event.event_context[:region]).to eq(project_config.region) expect(impression_event.bot_filtering).to eq(project_config.bot_filtering) expect(impression_event.experiment_id).to eq(experiment['id']) expect(impression_event.variation_id).to eq('111128') @@ -79,6 +80,7 @@ expect(impression_event.event_context[:project_id]).to eq(project_config.project_id) expect(impression_event.event_context[:revision]).to eq(project_config.revision) expect(impression_event.event_context[:anonymize_ip]).to eq(project_config.anonymize_ip) + expect(impression_event.event_context[:region]).to eq(project_config.region) expect(impression_event.bot_filtering).to eq(project_config.bot_filtering) expect(impression_event.experiment_id).to eq(experiment['id']) expect(impression_event.variation_id).to eq('111128') @@ -108,6 +110,7 @@ expect(conversion_event.event_context[:project_id]).to eq(project_config.project_id) expect(conversion_event.event_context[:revision]).to eq(project_config.revision) expect(conversion_event.event_context[:anonymize_ip]).to eq(project_config.anonymize_ip) + expect(impression_event.event_context[:region]).to eq(project_config.region) expect(conversion_event.event['key']).to eq(event['key']) expect(conversion_event.bot_filtering).to eq(project_config.bot_filtering) expect(conversion_event.user_id).to eq('test_user') @@ -141,6 +144,7 @@ expect(conversion_event.event_context[:project_id]).to eq(project_config.project_id) expect(conversion_event.event_context[:revision]).to eq(project_config.revision) expect(conversion_event.event_context[:anonymize_ip]).to eq(project_config.anonymize_ip) + expect(impression_event.event_context[:region]).to eq(project_config.region) expect(conversion_event.event['key']).to eq(event['key']) expect(conversion_event.bot_filtering).to eq(project_config.bot_filtering) expect(conversion_event.user_id).to eq('test_user') diff --git a/spec/event_builder_spec.rb b/spec/event_builder_spec.rb index 4201c579..9efdbb81 100644 --- a/spec/event_builder_spec.rb +++ b/spec/event_builder_spec.rb @@ -39,7 +39,10 @@ allow(Time).to receive(:now).and_return(time_now) allow(SecureRandom).to receive(:uuid).and_return('a68cf1ad-0393-4e18-af87-efe8f01a7c9c') - @expected_endpoint = 'https://logx.optimizely.com/v1/events' + @expected_endpoints = { + US: 'https://logx.optimizely.com/v1/events', + EU: 'https://eu.logx.optimizely.com/v1/events' + } @expected_impression_params = { account_id: '12001', project_id: '111001', @@ -95,7 +98,8 @@ revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } end @@ -103,7 +107,7 @@ experiment = config.get_experiment_from_key('test_experiment') impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', nil) expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end @@ -119,7 +123,7 @@ impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', 'browser_type' => 'firefox') expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end @@ -161,7 +165,7 @@ } impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', attributes) expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end @@ -194,7 +198,7 @@ } impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', attributes) expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end @@ -210,7 +214,7 @@ impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', 'browser_type' => false) expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoins[:US]) expect(impression_event.http_verb).to eq(:post) end @@ -225,7 +229,7 @@ experiment = config.get_experiment_from_key('test_experiment') impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', 'browser_type' => 0) expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end @@ -234,14 +238,14 @@ impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', invalid_attribute: 'sorry_not_sorry') expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end it 'should create a valid Event when create_conversion_event is called' do conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, nil) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -255,7 +259,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', {'browser_type' => 'firefox'}, nil) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -267,7 +271,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -279,7 +283,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -290,7 +294,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -301,7 +305,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -316,7 +320,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -330,7 +334,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -343,7 +347,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -356,7 +360,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -369,7 +373,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -383,7 +387,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -396,7 +400,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', nil, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -421,7 +425,7 @@ conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', {'browser_type' => 'firefox'}, event_tags) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -447,7 +451,7 @@ experiment = config.get_experiment_from_key('test_experiment') impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', user_attributes) expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end @@ -476,7 +480,7 @@ expect(config.send(:bot_filtering)).to eq(true) impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', user_attributes) expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end @@ -505,7 +509,7 @@ allow(config).to receive(:bot_filtering).and_return(false) impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', user_attributes) expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoint) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end @@ -530,7 +534,7 @@ } conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', user_attributes, nil) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -551,7 +555,7 @@ } conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', user_attributes, nil) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end @@ -579,7 +583,7 @@ allow(config).to receive(:bot_filtering).and_return(false) conversion_event = @event_builder.create_conversion_event(config, @event, 'test_user', user_attributes, nil) expect(conversion_event.params).to eq(@expected_conversion_params) - expect(conversion_event.url).to eq(@expected_endpoint) + expect(conversion_event.url).to eq(@expected_endpoints[:US]) expect(conversion_event.http_verb).to eq(:post) end end diff --git a/spec/spec_params.rb b/spec/spec_params.rb index e43ce3cc..8735218f 100644 --- a/spec/spec_params.rb +++ b/spec/spec_params.rb @@ -19,6 +19,7 @@ module OptimizelySpec VALID_CONFIG_BODY = { + 'region' => 'US', 'accountId' => '12001', 'projectId' => '111001', 'anonymizeIP' => false, From 73769f1e84547200c8684546c975268b963a90f1 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 06:30:36 -0500 Subject: [PATCH 02/21] Fix lint issues --- lib/optimizely/event/event_factory.rb | 4 ++-- lib/optimizely/event_builder.rb | 8 ++++---- spec/config/datafile_project_config_spec.rb | 14 +++++++------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/optimizely/event/event_factory.rb b/lib/optimizely/event/event_factory.rb index d8ad5913..3a714f56 100644 --- a/lib/optimizely/event/event_factory.rb +++ b/lib/optimizely/event/event_factory.rb @@ -72,9 +72,9 @@ def create_log_event(user_events, logger) builder.with_visitors(visitors) event_batch = builder.build - ENDPOINT = ENDPOINTS[user_context[:region].to_sym] || ENDPOINTS[:US] + endpoint = ENDPOINTS[user_context[:region].to_sym] || ENDPOINTS[:US] - Event.new(:post, ENDPOINT, event_batch.as_json, POST_HEADERS) + Event.new(:post, endpoint, event_batch.as_json, POST_HEADERS) end def build_attribute_list(user_attributes, project_config) diff --git a/lib/optimizely/event_builder.rb b/lib/optimizely/event_builder.rb index 7396d1da..9bf52758 100644 --- a/lib/optimizely/event_builder.rb +++ b/lib/optimizely/event_builder.rb @@ -130,9 +130,9 @@ def create_impression_event(project_config, experiment, variation_id, user_id, a impression_params = get_impression_params(project_config, experiment, variation_id) event_params[:visitors][0][:snapshots].push(impression_params) - ENDPOINT = ENDPOINTS[region] + endpoint = ENDPOINTS[region] - Event.new(:post, ENDPOINT, event_params, POST_HEADERS) + Event.new(:post, endpoint, event_params, POST_HEADERS) end def create_conversion_event(project_config, event, user_id, attributes, event_tags) @@ -151,9 +151,9 @@ def create_conversion_event(project_config, event, user_id, attributes, event_ta conversion_params = get_conversion_params(event, event_tags) event_params[:visitors][0][:snapshots] = [conversion_params] - ENDPOINT = ENDPOINTS[region] + endpoint = ENDPOINTS[region] - Event.new(:post, ENDPOINT, event_params, POST_HEADERS) + Event.new(:post, endpoint, event_params, POST_HEADERS) end private diff --git a/spec/config/datafile_project_config_spec.rb b/spec/config/datafile_project_config_spec.rb index 05b90a5f..74c264b3 100644 --- a/spec/config/datafile_project_config_spec.rb +++ b/spec/config/datafile_project_config_spec.rb @@ -763,15 +763,15 @@ end it 'should parse region specified in datafile correctly' do - project_configUS = Optimizely::DatafileProjectConfig.new(config_body_JSON, logger, error_handler) - expect(project_config.region).to eq('US') + project_config_us = Optimizely::DatafileProjectConfig.new(config_body_JSON, logger, error_handler) + expect(project_config_us.region).to eq('US') - config_bodyEU = config_body.dup - config_bodyEU['region'] = 'EU' - config_body_JSON = JSON.dump(config_bodyEU) - project_configEU = Optimizely::DatafileProjectConfig.new(config_body_JSON, logger, error_handler) + config_body_eu = config_body.dup + config_body_eu['region'] = 'EU' + config_body_json = JSON.dump(config_body_eu) + project_config_eu = Optimizely::DatafileProjectConfig.new(config_body_json, logger, error_handler) - expect(project_config.region).to eq('EU') + expect(project_config_eu.region).to eq('EU') end it 'should initialize properties correctly upon creating project with typed audience dict' do From f9156d016ada992d0d328e1da8e00d56386b6068 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 06:32:45 -0500 Subject: [PATCH 03/21] Fix lint --- lib/optimizely/event/event_factory.rb | 2 +- lib/optimizely/event_builder.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/optimizely/event/event_factory.rb b/lib/optimizely/event/event_factory.rb index 3a714f56..c6638034 100644 --- a/lib/optimizely/event/event_factory.rb +++ b/lib/optimizely/event/event_factory.rb @@ -31,7 +31,7 @@ class << self ENDPOINTS = { US: 'https://logx.optimizely.com/v1/events', EU: 'https://eu.logx.optimizely.com/v1/events' - } + }.freeze POST_HEADERS = {'Content-Type' => 'application/json'}.freeze ACTIVATE_EVENT_KEY = 'campaign_activated' diff --git a/lib/optimizely/event_builder.rb b/lib/optimizely/event_builder.rb index 9bf52758..c4600997 100644 --- a/lib/optimizely/event_builder.rb +++ b/lib/optimizely/event_builder.rb @@ -110,7 +110,7 @@ class EventBuilder < BaseEventBuilder ENDPOINTS = { US: 'https://logx.optimizely.com/v1/events', EU: 'https://eu.logx.optimizely.com/v1/events' - } + }.freeze POST_HEADERS = {'Content-Type' => 'application/json'}.freeze ACTIVATE_EVENT_KEY = 'campaign_activated' From a5e6faf7354616fed79d826e9c824735d1caab1b Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 06:36:42 -0500 Subject: [PATCH 04/21] Fix test --- lib/optimizely/event/entity/event_context.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/optimizely/event/entity/event_context.rb b/lib/optimizely/event/entity/event_context.rb index 65f8f18e..f26b30a2 100644 --- a/lib/optimizely/event/entity/event_context.rb +++ b/lib/optimizely/event/entity/event_context.rb @@ -26,7 +26,8 @@ def initialize( anonymize_ip:, revision:, client_name:, - client_version: + client_version:, + region: ) @account_id = account_id @project_id = project_id @@ -34,6 +35,7 @@ def initialize( @revision = revision @client_name = client_name @client_version = client_version + @region = region end def as_json @@ -43,7 +45,8 @@ def as_json anonymize_ip: @anonymize_ip, revision: @revision, client_name: @client_name, - client_version: @client_version + client_version: @client_version, + region: @region } end end From 9f477063b3c6b58f67f5253f5329e6af073edcfd Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 06:40:01 -0500 Subject: [PATCH 05/21] Add with region --- lib/optimizely/event/entity/event_batch.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/optimizely/event/entity/event_batch.rb b/lib/optimizely/event/entity/event_batch.rb index 70aca415..f67c3c54 100644 --- a/lib/optimizely/event/entity/event_batch.rb +++ b/lib/optimizely/event/entity/event_batch.rb @@ -29,13 +29,14 @@ def as_json client_version: @client_version, anonymize_ip: @anonymize_ip, enrich_decisions: @enrich_decisions, - visitors: @visitors + visitors: @visitors, + region: @region } end class Builder attr_reader :account_id, :project_id, :revision, :client_name, :client_version, - :anonymize_ip, :enrich_decisions, :visitors + :anonymize_ip, :enrich_decisions, :visitors, :region def build event_batch = EventBatch.new @@ -47,6 +48,7 @@ def build event_batch.anonymize_ip = @anonymize_ip event_batch.enrich_decisions = @enrich_decisions event_batch.visitors = @visitors + event_batch.region = @region event_batch end @@ -62,6 +64,10 @@ def with_revision(revision) @revision = revision end + def region(region) + @region = region + end + def with_client_name(client_name) @client_name = client_name end From e776eada2688ec482e14abc4a9240328ff67cdb3 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 06:41:15 -0500 Subject: [PATCH 06/21] Fix lint --- lib/optimizely/event/entity/event_batch.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optimizely/event/entity/event_batch.rb b/lib/optimizely/event/entity/event_batch.rb index f67c3c54..6dbb54d8 100644 --- a/lib/optimizely/event/entity/event_batch.rb +++ b/lib/optimizely/event/entity/event_batch.rb @@ -64,7 +64,7 @@ def with_revision(revision) @revision = revision end - def region(region) + def with_region(region) @region = region end From 884c9721f4cd5d3cdac3e0f8bb5c60de14528383 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 06:43:30 -0500 Subject: [PATCH 07/21] Fix lint issue --- lib/optimizely/event/entity/event_batch.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optimizely/event/entity/event_batch.rb b/lib/optimizely/event/entity/event_batch.rb index 6dbb54d8..b72d9c2e 100644 --- a/lib/optimizely/event/entity/event_batch.rb +++ b/lib/optimizely/event/entity/event_batch.rb @@ -18,7 +18,7 @@ module Optimizely class EventBatch attr_accessor :account_id, :project_id, :revision, :client_name, :client_version, - :anonymize_ip, :enrich_decisions, :visitors + :anonymize_ip, :enrich_decisions, :visitors, :region def as_json { From 6d0245ed0279c8ec25845babe2bfab979d8a1f52 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 06:55:05 -0500 Subject: [PATCH 08/21] Correct the Region default value --- lib/optimizely/config/datafile_project_config.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optimizely/config/datafile_project_config.rb b/lib/optimizely/config/datafile_project_config.rb index 44fd0bf0..25480c9b 100644 --- a/lib/optimizely/config/datafile_project_config.rb +++ b/lib/optimizely/config/datafile_project_config.rb @@ -68,7 +68,7 @@ def initialize(datafile, logger, error_handler) @rollouts = config.fetch('rollouts', []) @send_flag_decisions = config.fetch('sendFlagDecisions', false) @integrations = config.fetch('integrations', []) - @region = config.fetch('region', 'US') + @region = 'US' if @region.nil? || @region.empty? # Json type is represented in datafile as a subtype of string for the sake of backwards compatibility. # Converting it to a first-class json type while creating Project Config From e1ae8b5778ae24f20f2da98840876ea5212abe26 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 07:11:41 -0500 Subject: [PATCH 09/21] Fix failed tests --- .../config/datafile_project_config.rb | 3 +++ spec/optimizely_user_context_spec.rb | 9 +++++--- spec/project_spec.rb | 21 ++++++++++++------- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/optimizely/config/datafile_project_config.rb b/lib/optimizely/config/datafile_project_config.rb index 25480c9b..f859d724 100644 --- a/lib/optimizely/config/datafile_project_config.rb +++ b/lib/optimizely/config/datafile_project_config.rb @@ -68,6 +68,9 @@ def initialize(datafile, logger, error_handler) @rollouts = config.fetch('rollouts', []) @send_flag_decisions = config.fetch('sendFlagDecisions', false) @integrations = config.fetch('integrations', []) + @region = config.fetch('region', 'US') + + # Default to US region if not specified @region = 'US' if @region.nil? || @region.empty? # Json type is represented in datafile as a subtype of string for the sake of backwards compatibility. diff --git a/spec/optimizely_user_context_spec.rb b/spec/optimizely_user_context_spec.rb index 515068c0..b47550bc 100644 --- a/spec/optimizely_user_context_spec.rb +++ b/spec/optimizely_user_context_spec.rb @@ -224,7 +224,8 @@ type: 'custom', value: true }] - }] + }], + region: 'US' } stub_request(:post, impression_log_url) expect(forced_decision_project_instance.notification_center).to receive(:send_notifications) @@ -323,7 +324,8 @@ type: 'custom', value: true }] - }] + }], + region: 'US' } expect(forced_decision_project_instance.notification_center).to receive(:send_notifications) @@ -442,7 +444,8 @@ type: 'custom', value: true }] - }] + }], + region: 'US' } stub_request(:post, impression_log_url) expect(forced_decision_project_instance.notification_center).to receive(:send_notifications) diff --git a/spec/project_spec.rb b/spec/project_spec.rb index f857a5ce..e14c77ba 100644 --- a/spec/project_spec.rb +++ b/spec/project_spec.rb @@ -274,7 +274,8 @@ class InvalidErrorHandler; end # rubocop:disable Lint/ConstantDefinitionInBlock revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } end @@ -393,7 +394,8 @@ class InvalidErrorHandler; end # rubocop:disable Lint/ConstantDefinitionInBlock revision: '3', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } end @@ -1079,7 +1081,8 @@ def callback(_args); end revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } end @@ -1251,7 +1254,8 @@ def callback(_args); end revision: '3', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } end after(:example) do @@ -1615,7 +1619,8 @@ def callback(_args); end revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } end @@ -3867,7 +3872,8 @@ def callback(_args); end type: 'custom', value: true }] - }] + }], + region: 'US' } expect(project_instance.event_dispatcher).to have_received(:dispatch_event).with(Optimizely::Event.new(:post, impression_log_url, expected_params, post_headers)) end @@ -4024,7 +4030,8 @@ def callback(_args); end type: 'custom', value: true }] - }] + }], + region: 'US' } expect(project_instance.event_dispatcher).to have_received(:dispatch_event).with(Optimizely::Event.new(:post, impression_log_url, expected_params, post_headers)) end From c8a47b1bc2c652468e54dbe59c22a8ad58e0bdf9 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 07:12:59 -0500 Subject: [PATCH 10/21] Fix lint --- lib/optimizely/config/datafile_project_config.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optimizely/config/datafile_project_config.rb b/lib/optimizely/config/datafile_project_config.rb index f859d724..14e5b168 100644 --- a/lib/optimizely/config/datafile_project_config.rb +++ b/lib/optimizely/config/datafile_project_config.rb @@ -69,7 +69,7 @@ def initialize(datafile, logger, error_handler) @send_flag_decisions = config.fetch('sendFlagDecisions', false) @integrations = config.fetch('integrations', []) @region = config.fetch('region', 'US') - + # Default to US region if not specified @region = 'US' if @region.nil? || @region.empty? From 93e7a11bb94c7ecc5c54ef7c07bd5c717ce7ec8e Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 07:54:10 -0500 Subject: [PATCH 11/21] Fix test cases --- spec/event_builder_spec.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/event_builder_spec.rb b/spec/event_builder_spec.rb index 9efdbb81..80d35c7c 100644 --- a/spec/event_builder_spec.rb +++ b/spec/event_builder_spec.rb @@ -72,7 +72,8 @@ revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } @expected_conversion_params = { account_id: '12001', From 06295e69fdefe25a326318d6b7dc486108742e34 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 08:04:37 -0500 Subject: [PATCH 12/21] Fix event builder --- lib/optimizely/event_builder.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/optimizely/event_builder.rb b/lib/optimizely/event_builder.rb index c4600997..5eb7decd 100644 --- a/lib/optimizely/event_builder.rb +++ b/lib/optimizely/event_builder.rb @@ -101,7 +101,8 @@ def get_common_params(project_config, user_id, attributes) revision: project_config.revision, client_name: CLIENT_ENGINE, enrich_decisions: true, - client_version: VERSION + client_version: VERSION, + region: project_config.region || 'US' } end end From 04e3a7e9ad6541e610c11d8b7f8db8f1d5f96703 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 08:08:48 -0500 Subject: [PATCH 13/21] Fix the issue --- lib/optimizely/event_builder.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/optimizely/event_builder.rb b/lib/optimizely/event_builder.rb index 5eb7decd..3f7f519a 100644 --- a/lib/optimizely/event_builder.rb +++ b/lib/optimizely/event_builder.rb @@ -131,7 +131,7 @@ def create_impression_event(project_config, experiment, variation_id, user_id, a impression_params = get_impression_params(project_config, experiment, variation_id) event_params[:visitors][0][:snapshots].push(impression_params) - endpoint = ENDPOINTS[region] + endpoint = ENDPOINTS[region.to_sym] Event.new(:post, endpoint, event_params, POST_HEADERS) end @@ -152,7 +152,7 @@ def create_conversion_event(project_config, event, user_id, attributes, event_ta conversion_params = get_conversion_params(event, event_tags) event_params[:visitors][0][:snapshots] = [conversion_params] - endpoint = ENDPOINTS[region] + endpoint = ENDPOINTS[region.to_sym] Event.new(:post, endpoint, event_params, POST_HEADERS) end From 474d01d9e798d4cd98f4dad54486db94331a2d44 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 08:13:46 -0500 Subject: [PATCH 14/21] Fix typo --- spec/event_builder_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/event_builder_spec.rb b/spec/event_builder_spec.rb index 80d35c7c..62cf5ba1 100644 --- a/spec/event_builder_spec.rb +++ b/spec/event_builder_spec.rb @@ -215,7 +215,7 @@ impression_event = @event_builder.create_impression_event(config, experiment, '111128', 'test_user', 'browser_type' => false) expect(impression_event.params).to eq(@expected_impression_params) - expect(impression_event.url).to eq(@expected_endpoins[:US]) + expect(impression_event.url).to eq(@expected_endpoints[:US]) expect(impression_event.http_verb).to eq(:post) end From ae26cedd59a1c1dd2f513e139d33c3d1d9e0edb8 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 08:16:42 -0500 Subject: [PATCH 15/21] Correct the event name --- spec/event/user_event_factory_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/event/user_event_factory_spec.rb b/spec/event/user_event_factory_spec.rb index 53f678f1..f1ed533e 100644 --- a/spec/event/user_event_factory_spec.rb +++ b/spec/event/user_event_factory_spec.rb @@ -110,7 +110,7 @@ expect(conversion_event.event_context[:project_id]).to eq(project_config.project_id) expect(conversion_event.event_context[:revision]).to eq(project_config.revision) expect(conversion_event.event_context[:anonymize_ip]).to eq(project_config.anonymize_ip) - expect(impression_event.event_context[:region]).to eq(project_config.region) + expect(conversion_event.event_context[:region]).to eq(project_config.region) expect(conversion_event.event['key']).to eq(event['key']) expect(conversion_event.bot_filtering).to eq(project_config.bot_filtering) expect(conversion_event.user_id).to eq('test_user') @@ -144,7 +144,7 @@ expect(conversion_event.event_context[:project_id]).to eq(project_config.project_id) expect(conversion_event.event_context[:revision]).to eq(project_config.revision) expect(conversion_event.event_context[:anonymize_ip]).to eq(project_config.anonymize_ip) - expect(impression_event.event_context[:region]).to eq(project_config.region) + expect(conversion_event.event_context[:region]).to eq(project_config.region) expect(conversion_event.event['key']).to eq(event['key']) expect(conversion_event.bot_filtering).to eq(project_config.bot_filtering) expect(conversion_event.user_id).to eq('test_user') From 80d0c16666518b47ff64326bc0885e3231e6b79e Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 08:42:26 -0500 Subject: [PATCH 16/21] Fix errors --- spec/event_builder_spec.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spec/event_builder_spec.rb b/spec/event_builder_spec.rb index 62cf5ba1..d8ad706c 100644 --- a/spec/event_builder_spec.rb +++ b/spec/event_builder_spec.rb @@ -39,10 +39,9 @@ allow(Time).to receive(:now).and_return(time_now) allow(SecureRandom).to receive(:uuid).and_return('a68cf1ad-0393-4e18-af87-efe8f01a7c9c') - @expected_endpoints = { - US: 'https://logx.optimizely.com/v1/events', - EU: 'https://eu.logx.optimizely.com/v1/events' - } + @expected_endpoints = {} + @expected_endpoints[:US] = 'https://logx.optimizely.com/v1/events' + @expected_endpoints[:EU] = 'https://eu.logx.optimizely.com/v1/events' @expected_impression_params = { account_id: '12001', project_id: '111001', From fd72f773a89c534409ba609384171979ae2f71ca Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 08:55:19 -0500 Subject: [PATCH 17/21] Fix errors --- spec/event/event_factory_spec.rb | 2 +- spec/event_builder_spec.rb | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/spec/event/event_factory_spec.rb b/spec/event/event_factory_spec.rb index 00492ba0..fc779467 100644 --- a/spec/event/event_factory_spec.rb +++ b/spec/event/event_factory_spec.rb @@ -34,7 +34,7 @@ allow(Time).to receive(:now).and_return(time_now) allow(SecureRandom).to receive(:uuid).and_return('a68cf1ad-0393-4e18-af87-efe8f01a7c9c') - @expected_endpoints[:US] = { + @expected_endpoints = { US: 'https://logx.optimizely.com/v1/events', EU: 'https://eu.logx.optimizely.com/v1/events' } diff --git a/spec/event_builder_spec.rb b/spec/event_builder_spec.rb index d8ad706c..62cf5ba1 100644 --- a/spec/event_builder_spec.rb +++ b/spec/event_builder_spec.rb @@ -39,9 +39,10 @@ allow(Time).to receive(:now).and_return(time_now) allow(SecureRandom).to receive(:uuid).and_return('a68cf1ad-0393-4e18-af87-efe8f01a7c9c') - @expected_endpoints = {} - @expected_endpoints[:US] = 'https://logx.optimizely.com/v1/events' - @expected_endpoints[:EU] = 'https://eu.logx.optimizely.com/v1/events' + @expected_endpoints = { + US: 'https://logx.optimizely.com/v1/events', + EU: 'https://eu.logx.optimizely.com/v1/events' + } @expected_impression_params = { account_id: '12001', project_id: '111001', From 4dea3ec1a76c7a4d632f30171e5c720080351cbc Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 08:59:25 -0500 Subject: [PATCH 18/21] Fix test cases --- spec/event/event_factory_spec.rb | 6 ++++-- spec/event/forwarding_event_processor_spec.rb | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/spec/event/event_factory_spec.rb b/spec/event/event_factory_spec.rb index fc779467..dbf4b175 100644 --- a/spec/event/event_factory_spec.rb +++ b/spec/event/event_factory_spec.rb @@ -73,7 +73,8 @@ revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } @expected_conversion_params = { account_id: '12001', @@ -99,7 +100,8 @@ revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } end diff --git a/spec/event/forwarding_event_processor_spec.rb b/spec/event/forwarding_event_processor_spec.rb index f58d0e90..582bac30 100644 --- a/spec/event/forwarding_event_processor_spec.rb +++ b/spec/event/forwarding_event_processor_spec.rb @@ -64,7 +64,8 @@ revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } end From 904d0bd1bcc76c0acc51258b2239a21e9030ab06 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 09:28:38 -0500 Subject: [PATCH 19/21] Fix test cases --- lib/optimizely/event/entity/event_batch.rb | 4 ++-- spec/event/event_entities_spec.rb | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/optimizely/event/entity/event_batch.rb b/lib/optimizely/event/entity/event_batch.rb index b72d9c2e..d49d85a8 100644 --- a/lib/optimizely/event/entity/event_batch.rb +++ b/lib/optimizely/event/entity/event_batch.rb @@ -48,7 +48,7 @@ def build event_batch.anonymize_ip = @anonymize_ip event_batch.enrich_decisions = @enrich_decisions event_batch.visitors = @visitors - event_batch.region = @region + event_batch.region = @region || 'US' event_batch end @@ -65,7 +65,7 @@ def with_revision(revision) end def with_region(region) - @region = region + @region = region || 'US' end def with_client_name(client_name) diff --git a/spec/event/event_entities_spec.rb b/spec/event/event_entities_spec.rb index 7d747ed2..47be87dc 100644 --- a/spec/event/event_entities_spec.rb +++ b/spec/event/event_entities_spec.rb @@ -69,7 +69,8 @@ revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } @expected_conversion_payload = { @@ -103,7 +104,8 @@ revision: '42', client_name: Optimizely::CLIENT_ENGINE, enrich_decisions: true, - client_version: Optimizely::VERSION + client_version: Optimizely::VERSION, + region: 'US' } end From 7f985642a1e567752a68a0478ccdd734aeb0dcad Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 11:25:39 -0500 Subject: [PATCH 20/21] Implement copilot review comments --- lib/optimizely/event/entity/event_batch.rb | 2 +- lib/optimizely/event/event_factory.rb | 2 +- lib/optimizely/event_builder.rb | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/optimizely/event/entity/event_batch.rb b/lib/optimizely/event/entity/event_batch.rb index d49d85a8..aee5bdb7 100644 --- a/lib/optimizely/event/entity/event_batch.rb +++ b/lib/optimizely/event/entity/event_batch.rb @@ -48,7 +48,7 @@ def build event_batch.anonymize_ip = @anonymize_ip event_batch.enrich_decisions = @enrich_decisions event_batch.visitors = @visitors - event_batch.region = @region || 'US' + event_batch.region = @region.nil? || 'US': @region event_batch end diff --git a/lib/optimizely/event/event_factory.rb b/lib/optimizely/event/event_factory.rb index c6638034..b85b8951 100644 --- a/lib/optimizely/event/event_factory.rb +++ b/lib/optimizely/event/event_factory.rb @@ -72,7 +72,7 @@ def create_log_event(user_events, logger) builder.with_visitors(visitors) event_batch = builder.build - endpoint = ENDPOINTS[user_context[:region].to_sym] || ENDPOINTS[:US] + endpoint = ENDPOINTS[user_context[:region].to_s.upcase.to_sym] || ENDPOINTS[:US] Event.new(:post, endpoint, event_batch.as_json, POST_HEADERS) end diff --git a/lib/optimizely/event_builder.rb b/lib/optimizely/event_builder.rb index 3f7f519a..a5ee82a9 100644 --- a/lib/optimizely/event_builder.rb +++ b/lib/optimizely/event_builder.rb @@ -131,7 +131,7 @@ def create_impression_event(project_config, experiment, variation_id, user_id, a impression_params = get_impression_params(project_config, experiment, variation_id) event_params[:visitors][0][:snapshots].push(impression_params) - endpoint = ENDPOINTS[region.to_sym] + endpoint = ENDPOINTS[region.to_s.upcase.to_sym] Event.new(:post, endpoint, event_params, POST_HEADERS) end @@ -152,7 +152,7 @@ def create_conversion_event(project_config, event, user_id, attributes, event_ta conversion_params = get_conversion_params(event, event_tags) event_params[:visitors][0][:snapshots] = [conversion_params] - endpoint = ENDPOINTS[region.to_sym] + endpoint = ENDPOINTS[region.to_s.upcase.to_sym] Event.new(:post, endpoint, event_params, POST_HEADERS) end From 56bc8cd90625a0553e52efe0879d4fe1f7b425e9 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 30 Jun 2025 11:28:03 -0500 Subject: [PATCH 21/21] Fix lint --- lib/optimizely/event/entity/event_batch.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optimizely/event/entity/event_batch.rb b/lib/optimizely/event/entity/event_batch.rb index aee5bdb7..d49d85a8 100644 --- a/lib/optimizely/event/entity/event_batch.rb +++ b/lib/optimizely/event/entity/event_batch.rb @@ -48,7 +48,7 @@ def build event_batch.anonymize_ip = @anonymize_ip event_batch.enrich_decisions = @enrich_decisions event_batch.visitors = @visitors - event_batch.region = @region.nil? || 'US': @region + event_batch.region = @region || 'US' event_batch end