Files
threshold/internal/db/sqltest/tests/purge/deleted_table_tests.sql
T
Timothy Messier a92c88dfb5 refact(db): Replace get_deleted_tables function with a view
This function was returning the set of deletion tables. A view seems
better suited for this task since it would allow for applying additional
filters of the result set. This was particularly necessary to easily
make changes to some sqltests due to switching the delete trigger for
the session table.

(cherry picked from commit 32d41639892950b21fafc39b50c10b997c6d5121)
2024-09-24 14:18:54 +00:00

113 lines
3.9 KiB
PL/PgSQL

-- Copyright (c) HashiCorp, Inc.
-- SPDX-License-Identifier: BUSL-1.1
begin;
create function op_table(deletion_table_name name) returns text
as $$
select split_part(deletion_table_name, '_deleted', 1);
$$ language sql;
create function has_operational_table(deletion_table_name name) returns text
as $$
select has_table(op_table(deletion_table_name));
$$ language sql;
-- tests that the deletion table has the insert trigger
create function has_insert_trigger(deletion_table_name name) returns text
as $$
select * from collect_tap(
has_trigger(op_table(deletion_table_name), 'insert_deleted_id'),
trigger_is(op_table(deletion_table_name), 'insert_deleted_id', 'insert_deleted_id')
);
$$ language sql;
-- tests that the deletion table has the bulk insert trigger
create function has_bulk_insert_trigger(deletion_table_name name) returns text
as $$
select * from collect_tap(
has_trigger(op_table(deletion_table_name), 'bulk_insert_deleted_ids'),
trigger_is(op_table(deletion_table_name), 'bulk_insert_deleted_ids', 'bulk_insert_deleted_ids')
);
$$ language sql;
-- tests the public_id column
create function has_public_id(deletion_table_name name) returns text
as $$
select * from collect_tap(
has_column(deletion_table_name, 'public_id'),
col_not_null(deletion_table_name, 'public_id'),
col_hasnt_default(deletion_table_name, 'public_id')
);
$$ language sql;
-- tests the delete_time column
create function has_delete_time(deletion_table_name name) returns text
as $$
select * from collect_tap(
has_column(deletion_table_name, 'delete_time'),
col_not_null(deletion_table_name, 'delete_time'),
col_hasnt_default(deletion_table_name, 'delete_time')
);
$$ language sql;
-- tests for delete_time index
create function has_delete_time_index(deletion_table_name name) returns text
as $$
select case when length(deletion_table_name || '_delete_time_idx') > 63
then hasnt_index(deletion_table_name, deletion_table_name || '_delete_time_idx', 'Index name too long: ' || deletion_table_name || '_delete_time_idx')
else collect_tap(
has_index(deletion_table_name, deletion_table_name || '_delete_time_idx', 'delete_time')
) end;
$$ language sql;
-- tests the tables exist and follow the required naming pattern
create function has_correct_tables(deletetion_table_name name) returns text
as $$
select * from collect_tap(
has_table(deletetion_table_name),
has_operational_table(deletetion_table_name)
);
$$ language sql;
-- runs all the tests on a single deletion table
create function test_deletion_table(deletion_table_name name) returns text
as $$
select * from collect_tap(
has_correct_tables(deletion_table_name),
has_public_id(deletion_table_name),
has_delete_time(deletion_table_name),
has_delete_time_index(deletion_table_name),
has_insert_trigger(deletion_table_name)
);
$$ language sql;
-- like above, but using the bulk delete trigger
create function test_bulk_deletion_table(deletion_table_name name) returns text
as $$
select * from collect_tap(
has_correct_tables(deletion_table_name),
has_public_id(deletion_table_name),
has_delete_time(deletion_table_name),
has_delete_time_index(deletion_table_name),
has_bulk_insert_trigger(deletion_table_name)
);
$$ language sql;
-- 11 tests for each deletion table
select plan(a.table_count::integer)
from (
select 11 * count(*) as table_count
from deletion_table
) as a;
select test_deletion_table(a.tablename)
from deletion_table a
where a.tablename not in ('session_deleted');
select test_bulk_deletion_table(a.tablename)
from deletion_table a
where a.tablename in ('session_deleted');
select * from finish();
rollback;