cartodb-4.42/services/importer/spec/unit/connector_runner_spec.rb
2024-04-06 05:25:13 +00:00

349 lines
11 KiB
Ruby

require_relative '../../../../spec/spec_helper'
require_relative '../../lib/importer/connector_runner'
require_relative '../../lib/importer/job'
require_relative '../doubles/importer_stats'
require_relative '../doubles/loader'
require_relative '../doubles/log'
require_relative '../doubles/indexer'
require_relative '../factories/pg_connection'
require_relative '../doubles/user'
require_relative '../../../../spec/helpers/feature_flag_helper'
require_relative '../doubles/connector'
describe CartoDB::Importer2::ConnectorRunner do
before(:all) do
@user = create_user
@user.save
@pg_options = @user.db_service.db_configuration_for
@feature_flag = FactoryGirl.create(:feature_flag, name: 'carto-connectors', restricted: true)
@fake_log = CartoDB::Importer2::Doubles::Log.new(@user)
@providers = %w(dummy)
@fake_log.clear
Carto::Connector::PROVIDERS << DummyConnectorProvider
Carto::Connector::PROVIDERS << DummyConnectorProviderWithModifiedDate
Carto::Connector.providers(all: true).keys.each do |provider_name|
Carto::ConnectorProvider.create! name: provider_name
end
end
before(:each) do
CartoDB::Stats::Aggregator.stubs(:read_config).returns({})
@fake_log.clear
end
after(:all) do
@user.destroy
@feature_flag.destroy
Carto::Connector.providers(all: true).keys.each do |provider_name|
Carto::ConnectorProvider.find_by_name(provider_name).destroy
end
Carto::Connector::PROVIDERS.delete DummyConnectorProvider
end
after(:each) do
DummyConnectorProvider.copies.clear
DummyConnectorProviderWithModifiedDate.copies.clear
end
include FeatureFlagHelper
describe 'with working connectors' do
it "Succeeds if parameters are correct" do
with_feature_flag @user, 'carto-connectors', true do
parameters = {
table: 'thetable',
req1: 'a',
req2: 'b',
opt1: 'c'
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
@providers.each do |provider|
config = { provider => { 'enabled' => true } }
Cartodb.with_config connectors: config do
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
connector.success?.should be true
connector.provider_name.should eq provider
end
end
DummyConnectorProvider.copies.size.should eq 1
DummyConnectorProvider.copies[0][0].should eq 'cdb_importer'
DummyConnectorProvider.copies[0][1].should match /\Aimporter_/
end
end
it "Fails if parameters are invalid" do
with_feature_flag @user, 'carto-connectors', true do
parameters = {
table: 'thetable',
req1: 'a',
req2: 'b',
invalid_parameter: 'xyz'
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
@providers.each do |provider|
config = { provider => { 'enabled' => true } }
Cartodb.with_config connectors: config do
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
connector.success?.should be false
connector.provider_name.should eq provider
@fake_log.to_s.should match /Invalid parameters: invalid_parameter/m
end
end
end
end
it "Fails if parameters are missing" do
with_feature_flag @user, 'carto-connectors', true do
parameters = {
table: 'thetable',
req1: 'a',
opt1: 'c'
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
@providers.each do |provider|
config = { provider => { 'enabled' => true } }
Cartodb.with_config connectors: config do
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
connector.success?.should be false
connector.provider_name.should eq provider
@fake_log.to_s.should match /Error Missing required parameters req2/m
end
end
end
end
it "Fails without the feature flag" do
with_feature_flag @user, 'carto-connectors', false do
parameters = {
table: 'thetable',
req1: 'a',
req2: 'b'
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
@providers.each do |provider|
config = { provider => { 'enabled' => true } }
Cartodb.with_config connectors: config do
expect {
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
}.to raise_error(Carto::Connector::ConnectorsDisabledError)
end
end
end
end
it "Fails if provider is not available" do
with_feature_flag @user, 'carto-connectors', true do
parameters = {
table: 'thetable',
req1: 'a',
req2: 'b',
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
@providers.each do |provider|
config = { provider => { 'enabled' => false } }
Cartodb.with_config connectors: config do
expect {
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
}.to raise_error(Carto::Connector::ConnectorsDisabledError)
end
end
end
end
end
describe 'with failing connectors' do
it "Always fails" do
with_feature_flag @user, 'carto-connectors', true do
parameters = {
table: 'thetable',
req1: 'a',
req2: 'b'
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
@providers.each do |provider|
Carto::Connector.provider_class(provider).failing_with('COPY ERROR') do
config = { provider => { 'enabled' => true } }
Cartodb.with_config connectors: config do
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
connector.success?.should be false
connector.provider_name.should eq provider
@fake_log.to_s.should match /COPY ERROR/m
end
end
end
end
end
end
describe 'with invalid provider' do
it "Fails at creation" do
with_feature_flag @user, 'carto-connectors', true do
parameters = {
provider: 'invalid_provider',
table: 'thetable',
req1: 'a',
req2: 'b'
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
expect {
CartoDB::Importer2::ConnectorRunner.new(parameters.to_json, options)
}.to raise_error(Carto::Connector::InvalidParametersError)
end
end
end
it "Fails if provider is not available for the user" do
@providers.each do |provider|
connector_provider = Carto::ConnectorProvider.find_by_name(provider)
Carto::ConnectorConfiguration.create!(
connector_provider_id: connector_provider.id,
user_id: @user.id,
enabled: false
)
end
with_feature_flag @user, 'carto-connectors', true do
parameters = {
table: 'thetable',
req1: 'a',
req2: 'b'
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
@providers.each do |provider|
config = { provider => { 'enabled' => true } }
Cartodb.with_config connectors: config do
expect {
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
}.to raise_error(Carto::Connector::ConnectorsDisabledError)
end
end
end
Carto::ConnectorConfiguration.where(user_id: @user.id).destroy_all
end
it "Passes global configuration limits to the provider" do
with_feature_flag @user, 'carto-connectors', true do
parameters = {
table: 'thetable',
req1: 'a',
req2: 'b',
opt1: 'c'
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
@providers.each do |provider|
config = { provider => { 'enabled' => true, 'max_rows' => 10 } }
Cartodb.with_config connectors: config do
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
end
end
DummyConnectorProvider.copies.map(&:last).uniq.should eq [{enabled: true, max_rows: 10}]
end
end
it "Avoids copying data that hasn't changed" do
with_feature_flag @user, 'carto-connectors', true do
parameters = {
table: 'thetable',
req1: 'a',
req2: 'b',
opt1: 'c'
}
provider = DummyConnectorProviderWithModifiedDate.provider_id
date_the_data_was_modified = DummyConnectorProviderWithModifiedDate::LAST_MODIFIED
date_the_data_was_last_copied = date_the_data_was_modified
options = {
pg: @pg_options,
log: @fake_log,
user: @user,
previous_last_modified: date_the_data_was_last_copied
}
config = { provider => { 'enabled' => true } }
Cartodb.with_config connectors: config do
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
connector.success?.should be true
connector.provider_name.should eq provider
end
DummyConnectorProviderWithModifiedDate.copies.size.should eq 0
end
end
it "Copies data that has changed" do
with_feature_flag @user, 'carto-connectors', true do
parameters = {
table: 'thetable',
req1: 'a',
req2: 'b',
opt1: 'c'
}
options = {
pg: @pg_options,
log: @fake_log,
user: @user
}
provider = DummyConnectorProviderWithModifiedDate.provider_id
date_the_data_was_modified = DummyConnectorProviderWithModifiedDate::LAST_MODIFIED
date_the_data_was_last_copied = date_the_data_was_modified - 1
config = { provider => { 'enabled' => true }, previous_last_modified: date_the_data_was_last_copied }
Cartodb.with_config connectors: config do
connector = CartoDB::Importer2::ConnectorRunner.new(parameters.merge(provider: provider).to_json, options)
connector.run
connector.success?.should be true
connector.provider_name.should eq provider
end
DummyConnectorProviderWithModifiedDate.copies.size.should eq 1
DummyConnectorProviderWithModifiedDate.copies[0][0].should eq 'cdb_importer'
DummyConnectorProviderWithModifiedDate.copies[0][1].should match /\Aimporter_/
end
end
end