cartodb-4.42/spec/models/synchronization/member_overviews_spec.rb
2024-04-06 05:25:13 +00:00

168 lines
5.7 KiB
Ruby

require_relative '../../spec_helper'
require_relative '../../../services/data-repository/backend/sequel'
require_relative '../../../services/data-repository/repository'
require_relative '../../../app/models/synchronization/member'
require 'helpers/unique_names_helper'
require 'helpers/file_server_helper'
require_relative '../../helpers/feature_flag_helper'
include UniqueNamesHelper
include CartoDB
describe Synchronization::Member do
describe "synchronizations" do
before(:all) do
@user1 = create_user(sync_tables_enabled: true)
@user2 = create_user(sync_tables_enabled: true)
@feature_flag = FactoryGirl.create(:feature_flag, name: 'create_overviews', restricted: true)
end
before(:each) do
bypass_named_maps
::Hubspot::EventsAPI.any_instance.stubs(:enabled?).returns(false)
end
after(:all) do
@user1.destroy
@user2.destroy
end
include FeatureFlagHelper
def overview_tables(user, table)
overviews = user.in_database do |db|
db.fetch %{
SELECT * FROM CDB_Overviews('#{table}'::regclass)
}
end
overviews.map(:overview_table)
end
def has_overviews?(user, table)
!overview_tables(user, table).empty?
end
def remove_overviews(user, table)
user.in_database do |db|
db.run %{
SELECT CDB_DropOverviews('#{table}'::regclass)
}
end
end
describe "synchronization" do
it 'creates overviews' do
url = 'https://wadus.com/cities-box.csv'
path = "#{Rails.root}/spec/support/data/cities-box.csv"
stub_download(url: url, filepath: path, content_disposition: false)
attrs = random_attributes(user_id: @user1.id).merge(service_item_id: url, url: url, name: 'cities_box')
member = Synchronization::Member.new(attrs).store
set_feature_flag @user1, 'create_overviews', true
# Import data without overviews needed (too few rows for overviews)
data_import = Cartodb.with_config overviews: { 'min_rows' => 1000 } do
DataImport.create(
user_id: @user1.id,
data_source: path,
synchronization_id: member.id,
service_name: 'public_url',
service_item_id: url,
updated_at: Time.now,
privacy: ::UserTable::PRIVACY_VALUES_TO_TEXTS.invert['public']
).run_import!
end
table_name = UserTable[id: data_import.table_id].name
has_overviews?(@user1, table_name).should eq false
# Now synchronize with overviews needed
Cartodb.with_config overviews: { 'min_rows' => 100 } do
member.run
end
has_overviews?(@user1, table_name).should eq true
end
it 'deletes overviews' do
url = 'https://wadus.com/cities-box.csv'
path = "#{Rails.root}/spec/support/data/cities-box.csv"
stub_download(url: url, filepath: path, content_disposition: false)
attrs = random_attributes(user_id: @user1.id).merge(service_item_id: url, url: url, name: 'cities_box')
member = Synchronization::Member.new(attrs).store
set_feature_flag @user1, 'create_overviews', true
# Import data with overviews needed (too few rows for overviews)
data_import = Cartodb.with_config overviews: { 'min_rows' => 100 } do
DataImport.create(
user_id: @user1.id,
data_source: path,
synchronization_id: member.id,
service_name: 'public_url',
service_item_id: url,
updated_at: Time.now,
privacy: ::UserTable::PRIVACY_VALUES_TO_TEXTS.invert['public']
).run_import!
end
table_name = UserTable[id: data_import.table_id].name
member.name = table_name
has_overviews?(@user1, table_name).should eq true
# Now synchronize without overviews needed
Cartodb.with_config overviews: { 'min_rows' => 1000 } do
member.run
end
has_overviews?(@user1, table_name).should eq false
end
it 'updates overviews' do
url = 'https://wadus.com/cities-box.csv'
path = "#{Rails.root}/spec/support/data/cities-box.csv"
stub_download(url: url, filepath: path, content_disposition: false)
attrs = random_attributes(user_id: @user1.id).merge(service_item_id: url, url: url, name: 'cities_box')
member = Synchronization::Member.new(attrs).store
set_feature_flag @user1, 'create_overviews', true
# Import data with overviews needed (too few rows for overviews)
data_import = Cartodb.with_config overviews: { 'min_rows' => 100 } do
DataImport.create(
user_id: @user1.id,
data_source: path,
synchronization_id: member.id,
service_name: 'public_url',
service_item_id: url,
updated_at: Time.now,
privacy: ::UserTable::PRIVACY_VALUES_TO_TEXTS.invert['public']
).run_import!
end
table_name = UserTable[id: data_import.table_id].name
has_overviews?(@user1, table_name).should eq true
# Now synchronize with overviews needed
# TODO: alter or delete overviews contents and check they're are re-generated
Cartodb.with_config overviews: { 'min_rows' => 100 } do
member.run
end
has_overviews?(@user1, table_name).should eq true
end
end
end
private
def random_attributes(attributes = {})
random = unique_integer
{
name: attributes.fetch(:name, "name#{random}"),
interval: attributes.fetch(:interval, 15 * 60 + random),
state: attributes.fetch(:state, 'enabled'),
user_id: attributes.fetch(:user_id, nil)
}
end
end