177 lines
5.2 KiB
Ruby
177 lines
5.2 KiB
Ruby
require 'uuidtools'
|
|
|
|
namespace :cartodb do
|
|
namespace :acceptance do
|
|
|
|
DEFAULT_SLEEP_TIME = 10
|
|
|
|
desc 'Acceptance tests regarding Ghost Tables trigger'
|
|
task :ghost_tables, [:username, :sleep_time] => :environment do |_t, args|
|
|
raise 'usage: rake cartodb:acceptance:ghost_tables[username]' if args[:username].blank?
|
|
@user = User.where(username: args[:username]).first
|
|
raise "user with username '#{args[:username]}' not found" unless @user
|
|
args.with_defaults(sleep_time: DEFAULT_SLEEP_TIME)
|
|
@sleep_time = args[:sleep_time].to_i
|
|
@results = []
|
|
|
|
9.times.each do |index|
|
|
reset_user
|
|
@results << send("test#{index + 1}")
|
|
end
|
|
|
|
reset_user
|
|
|
|
puts "\n=======================================\n\n"
|
|
@results.each { |result| p result }
|
|
puts "\n=======================================\n\n"
|
|
end
|
|
|
|
# helpers
|
|
|
|
def reset_user
|
|
@user.db_service.drop_ghost_tables_event_trigger
|
|
disable_feature_flag
|
|
Carto::Visualization.where(user_id: @user.id, name: 'casper').all.each(&:destroy)
|
|
@user.tables.where(name: 'casper').all.each(&:destroy)
|
|
@user.in_database.run('DROP TABLE IF EXISTS casper;')
|
|
@user.db_service.create_ghost_tables_event_trigger
|
|
end
|
|
|
|
def run_and_wait(query)
|
|
@user.in_database.run(query)
|
|
p "Waiting #{@sleep_time} seconds..."
|
|
sleep @sleep_time
|
|
end
|
|
|
|
def create_table_and_cartodbfy
|
|
run_and_wait(%{
|
|
CREATE TABLE casper ();
|
|
SELECT * FROM CDB_CartodbfyTable('casper');
|
|
})
|
|
end
|
|
|
|
def create_map
|
|
source = Carto::Visualization.where(user_id: @user.id, name: 'casper').first
|
|
map = CartoDB::Visualization::TableBlender.new(Carto::User.find(@user.id), [source.user_table]).blend
|
|
Carto::Visualization.create!(
|
|
name: 'casper',
|
|
type: Carto::Visualization::TYPE_DERIVED,
|
|
user_id: @user.id,
|
|
map_id: map.id,
|
|
privacy: Carto::Visualization::PRIVACY_PUBLIC
|
|
)
|
|
end
|
|
|
|
def enable_feature_flag
|
|
ff = FeatureFlag.where(name: 'ghost_tables_trigger_disabled').first
|
|
FeatureFlagsUser.new(feature_flag_id: ff.id, user_id: @user.id).save
|
|
@user.reload
|
|
end
|
|
|
|
def disable_feature_flag
|
|
ff = FeatureFlag.where(name: 'ghost_tables_trigger_disabled').first
|
|
FeatureFlagsUser.where(feature_flag_id: ff.id, user_id: @user.id).first.try(:destroy)
|
|
@user.reload
|
|
end
|
|
|
|
def build_result(description, condition)
|
|
result = condition ? "OK!" : "Fail!"
|
|
"#{description}... #{result}"
|
|
end
|
|
|
|
def table_linked?
|
|
@user.tables.where(name: 'casper').count == 1
|
|
end
|
|
|
|
# tests
|
|
|
|
def test1
|
|
description = "Create table"
|
|
run_and_wait("CREATE TABLE casper ();")
|
|
p build_result(description, !table_linked?)
|
|
end
|
|
|
|
def test2
|
|
description = "Create table and cartodbfy"
|
|
create_table_and_cartodbfy
|
|
p build_result(description, table_linked?)
|
|
end
|
|
|
|
def test3
|
|
description = "Select into and cartodbfy"
|
|
run_and_wait(%{
|
|
SELECT INTO casper FROM (SELECT 1) AS tmp;
|
|
SELECT * FROM CDB_CartodbfyTable('casper');
|
|
})
|
|
p build_result(description, table_linked?)
|
|
end
|
|
|
|
def test4
|
|
description = "Drop table"
|
|
create_table_and_cartodbfy
|
|
assert1 = table_linked?
|
|
|
|
run_and_wait("DROP TABLE casper;")
|
|
assert2 = !table_linked?
|
|
|
|
p build_result(description, assert1 && assert2)
|
|
end
|
|
|
|
def test5
|
|
description = "Create table and cartodbfy without trigger"
|
|
@user.db_service.drop_ghost_tables_event_trigger
|
|
create_table_and_cartodbfy
|
|
p build_result(description, !table_linked?)
|
|
end
|
|
|
|
def test6
|
|
description = "Drop and create inside a transaction"
|
|
create_table_and_cartodbfy
|
|
create_map
|
|
assert1 = Carto::Visualization.where(user_id: @user.id, type: Carto::Visualization::TYPE_DERIVED).all.count == 1
|
|
|
|
run_and_wait(%{
|
|
DROP TABLE casper;
|
|
CREATE TABLE casper ();
|
|
SELECT * FROM CDB_CartodbfyTable('casper');
|
|
})
|
|
assert2 = Carto::Visualization.where(user_id: @user.id, type: Carto::Visualization::TYPE_DERIVED).all.count == 1
|
|
|
|
p build_result(description, assert1 && assert2)
|
|
end
|
|
|
|
def test7
|
|
description = "Drop and create without transaction"
|
|
create_table_and_cartodbfy
|
|
create_map
|
|
assert1 = Carto::Visualization.where(user_id: @user.id, type: Carto::Visualization::TYPE_DERIVED).all.count == 1
|
|
|
|
run_and_wait("DROP TABLE casper;")
|
|
create_table_and_cartodbfy
|
|
assert2 = Carto::Visualization.where(user_id: @user.id, type: Carto::Visualization::TYPE_DERIVED).all.empty?
|
|
|
|
p build_result(description, assert1 && assert2)
|
|
end
|
|
|
|
def test8
|
|
description = "With ghost_tables_trigger_disabled FF"
|
|
@user.db_service.drop_ghost_tables_event_trigger
|
|
enable_feature_flag
|
|
@user.db_service.create_ghost_tables_event_trigger
|
|
|
|
create_table_and_cartodbfy
|
|
|
|
p build_result(description, !table_linked?)
|
|
end
|
|
|
|
def test9
|
|
description = "Without TIS configuration"
|
|
@user.in_database(as: :superuser).run("SELECT cartodb.CDB_Conf_RemoveConf('invalidation_service')")
|
|
|
|
create_table_and_cartodbfy
|
|
|
|
p build_result(description, !table_linked?)
|
|
end
|
|
end
|
|
end
|