Skip to content

Commit fe73911

Browse files
fix: block odp calls on datafile (#330)
* block odp calls on datafile
1 parent 9f750d6 commit fe73911

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

lib/optimizely.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,14 +905,30 @@ def send_odp_event(action:, identifiers:, type: Helpers::Constants::ODP_MANAGER_
905905
@logger.log(Logger::ERROR, 'ODP events must have at least one key-value pair in identifiers.')
906906
return
907907
end
908+
909+
unless is_valid
910+
@logger.log(Logger::ERROR, InvalidProjectConfigError.new('send_odp_event').message)
911+
return
912+
end
913+
908914
@odp_manager.send_event(type: type, action: action, identifiers: identifiers, data: data)
909915
end
910916

911917
def identify_user(user_id:)
918+
unless is_valid
919+
@logger.log(Logger::ERROR, InvalidProjectConfigError.new('identify_user').message)
920+
return
921+
end
922+
912923
@odp_manager.identify_user(user_id: user_id)
913924
end
914925

915926
def fetch_qualified_segments(user_id:, options: [])
927+
unless is_valid
928+
@logger.log(Logger::ERROR, InvalidProjectConfigError.new('fetch_qualified_segments').message)
929+
return
930+
end
931+
916932
@odp_manager.fetch_qualified_segments(user_id: user_id, options: options)
917933
end
918934

spec/project_spec.rb

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4733,10 +4733,10 @@ def save(key, value); end
47334733
it 'should revert to default cache when custom cache is invalid' do
47344734
class InvalidCustomCache; end # rubocop:disable Lint/ConstantDefinitionInBlock
47354735

4736-
stub_request(:get, 'https://cdn.optimizely.com/datafiles/sdk-key.json')
4736+
stub_request(:get, "https://cdn.optimizely.com/datafiles/#{sdk_key}.json")
47374737
.to_return(status: 200, body: config_body_integrations_JSON)
47384738
sdk_settings = Optimizely::Helpers::OptimizelySdkSettings.new(odp_segments_cache: InvalidCustomCache.new)
4739-
project = Optimizely::Project.new(nil, nil, spy_logger, error_handler, false, nil, 'sdk-key', nil, nil, nil, [], {}, sdk_settings)
4739+
project = Optimizely::Project.new(nil, nil, spy_logger, error_handler, false, nil, sdk_key, nil, nil, nil, [], {}, sdk_settings)
47404740

47414741
segment_manager = project.odp_manager.instance_variable_get('@segment_manager')
47424742
expect(segment_manager.instance_variable_get('@segments_cache')).to be_a Optimizely::LRUCache
@@ -4757,7 +4757,7 @@ def reset; end
47574757
def fetch_qualified_segments(user_key, user_value, options); end
47584758
end
47594759

4760-
stub_request(:get, 'https://cdn.optimizely.com/datafiles/sdk-key.json')
4760+
stub_request(:get, "https://cdn.optimizely.com/datafiles/#{sdk_key}.json")
47614761
.to_return(status: 200, body: config_body_integrations_JSON)
47624762
sdk_settings = Optimizely::Helpers::OptimizelySdkSettings.new(odp_segment_manager: CustomSegmentManager.new)
47634763
project = Optimizely::Project.new(config_body_integrations_JSON, nil, spy_logger, error_handler, false, nil, nil, nil, nil, nil, [], {}, sdk_settings)
@@ -4773,10 +4773,10 @@ def fetch_qualified_segments(user_key, user_value, options); end
47734773
it 'should revert to default segment manager when custom manager is invalid' do
47744774
class InvalidSegmentManager; end # rubocop:disable Lint/ConstantDefinitionInBlock
47754775

4776-
stub_request(:get, 'https://cdn.optimizely.com/datafiles/sdk-key.json')
4776+
stub_request(:get, "https://cdn.optimizely.com/datafiles/#{sdk_key}.json")
47774777
.to_return(status: 200, body: config_body_integrations_JSON)
47784778
sdk_settings = Optimizely::Helpers::OptimizelySdkSettings.new(odp_segment_manager: InvalidSegmentManager.new)
4779-
project = Optimizely::Project.new(nil, nil, spy_logger, error_handler, false, nil, 'sdk-key', nil, nil, nil, [], {}, sdk_settings)
4779+
project = Optimizely::Project.new(nil, nil, spy_logger, error_handler, false, nil, sdk_key, nil, nil, nil, [], {}, sdk_settings)
47804780

47814781
segment_manager = project.odp_manager.instance_variable_get('@segment_manager')
47824782
expect(segment_manager).to be_a Optimizely::OdpSegmentManager
@@ -4796,10 +4796,10 @@ def stop!; end
47964796
def running?; end
47974797
end
47984798

4799-
stub_request(:get, 'https://cdn.optimizely.com/datafiles/sdk-key.json')
4799+
stub_request(:get, "https://cdn.optimizely.com/datafiles/#{sdk_key}.json")
48004800
.to_return(status: 200, body: config_body_integrations_JSON)
48014801
sdk_settings = Optimizely::Helpers::OptimizelySdkSettings.new(odp_event_manager: CustomEventManager.new)
4802-
project = Optimizely::Project.new(nil, nil, spy_logger, error_handler, false, nil, 'sdk-key', nil, nil, nil, [], {}, sdk_settings)
4802+
project = Optimizely::Project.new(nil, nil, spy_logger, error_handler, false, nil, sdk_key, nil, nil, nil, [], {}, sdk_settings)
48034803
event_manager = project.odp_manager.instance_variable_get('@event_manager')
48044804
expect(event_manager).to be_a CustomEventManager
48054805
project.send_odp_event(action: 'test', identifiers: {wow: 'great'})
@@ -4811,10 +4811,10 @@ def running?; end
48114811
it 'should revert to default event manager when custom manager is invalid' do
48124812
class InvalidEventManager; end # rubocop:disable Lint/ConstantDefinitionInBlock
48134813

4814-
stub_request(:get, 'https://cdn.optimizely.com/datafiles/sdk-key.json')
4814+
stub_request(:get, "https://cdn.optimizely.com/datafiles/#{sdk_key}.json")
48154815
.to_return(status: 200, body: config_body_integrations_JSON)
48164816
sdk_settings = Optimizely::Helpers::OptimizelySdkSettings.new(odp_event_manager: InvalidEventManager.new)
4817-
project = Optimizely::Project.new(nil, nil, spy_logger, error_handler, false, nil, 'sdk-key', nil, nil, nil, [], {}, sdk_settings)
4817+
project = Optimizely::Project.new(nil, nil, spy_logger, error_handler, false, nil, sdk_key, nil, nil, nil, [], {}, sdk_settings)
48184818

48194819
event_manager = project.odp_manager.instance_variable_get('@event_manager')
48204820
expect(event_manager).to be_a Optimizely::OdpEventManager
@@ -4843,8 +4843,6 @@ class InvalidEventManager; end # rubocop:disable Lint/ConstantDefinitionInBlock
48434843
expect(spy_logger).not_to receive(:log).with(Logger::ERROR, anything)
48444844
project = Optimizely::Project.new(nil, nil, spy_logger, nil, false, nil, sdk_key)
48454845

4846-
# wait until project_config ready
4847-
project.send(:project_config)
48484846
sleep 0.1 until project.odp_manager.instance_variable_get('@event_manager').instance_variable_get('@event_queue').empty?
48494847

48504848
project.send_odp_event(type: 'wow', action: 'great', identifiers: {amazing: 'fantastic'}, data: {})
@@ -4859,8 +4857,10 @@ class InvalidEventManager; end # rubocop:disable Lint/ConstantDefinitionInBlock
48594857
custom_project_instance.close
48604858
end
48614859

4862-
it 'should log debug if datafile not ready' do
4863-
expect(spy_logger).to receive(:log).once.with(Logger::DEBUG, 'ODP event queue: cannot send before config has been set.')
4860+
it 'should log error if datafile is invalid' do
4861+
stub_request(:get, "https://cdn.optimizely.com/datafiles/#{sdk_key}.json")
4862+
.to_return(status: 200, body: nil)
4863+
expect(spy_logger).to receive(:log).once.with(Logger::ERROR, "Optimizely instance is not valid. Failing 'send_odp_event'.")
48644864
project = Optimizely::Project.new(nil, nil, spy_logger, nil, false, nil, sdk_key)
48654865
project.send_odp_event(type: 'wow', action: 'great', identifiers: {amazing: 'fantastic'}, data: {})
48664866
project.close
@@ -4872,7 +4872,6 @@ class InvalidEventManager; end # rubocop:disable Lint/ConstantDefinitionInBlock
48724872
expect(spy_logger).to receive(:log).once.with(Logger::ERROR, 'ODP is not enabled.')
48734873
sdk_settings = Optimizely::Helpers::OptimizelySdkSettings.new(disable_odp: true)
48744874
project = Optimizely::Project.new(nil, nil, spy_logger, error_handler, false, nil, sdk_key, nil, nil, nil, [], {}, sdk_settings)
4875-
sleep 0.1 until project.config_manager.ready?
48764875
project.send_odp_event(type: 'wow', action: 'great', identifiers: {amazing: 'fantastic'}, data: {})
48774876
project.close
48784877
end

0 commit comments

Comments
 (0)