campingmontagut/test/amenity.sql
jordi fita mas eeaa3b415e Add amenities section and public page
This is more or less the same as the campsites, as public information
goes, but for buildings and other amenities that the camping provides
that are not campsites.
2024-01-27 22:51:41 +01:00

210 lines
6.1 KiB
PL/PgSQL

-- Test amenity
set client_min_messages to warning;
create extension if not exists pgtap;
reset client_min_messages;
begin;
select plan(54);
set search_path to camper, public;
select has_table('amenity');
select has_pk('amenity');
select col_is_unique('amenity', array['company_id', 'label']);
select table_privs_are('amenity', 'guest', array['SELECT']);
select table_privs_are('amenity', 'employee', array['SELECT']);
select table_privs_are('amenity', 'admin', array['SELECT', 'INSERT', 'UPDATE', 'DELETE']);
select table_privs_are('amenity', 'authenticator', array[]::text[]);
select has_column('amenity', 'amenity_id');
select col_is_pk('amenity', 'amenity_id');
select col_type_is('amenity', 'amenity_id', 'integer');
select col_not_null('amenity', 'amenity_id');
select col_hasnt_default('amenity', 'amenity_id');
select has_column('amenity', 'company_id');
select col_is_fk('amenity', 'company_id');
select fk_ok('amenity', 'company_id', 'company', 'company_id');
select col_type_is('amenity', 'company_id', 'integer');
select col_not_null('amenity', 'company_id');
select col_hasnt_default('amenity', 'company_id');
select has_column('amenity', 'label');
select col_type_is('amenity', 'label', 'text');
select col_not_null('amenity', 'label');
select col_hasnt_default('amenity', 'label');
select has_column('amenity', 'name');
select col_type_is('amenity', 'name', 'text');
select col_not_null('amenity', 'name');
select col_hasnt_default('amenity', 'name');
select has_column('amenity', 'info1');
select col_type_is('amenity', 'info1', 'xml');
select col_not_null('amenity', 'info1');
select col_has_default('amenity', 'info1');
select has_column('amenity', 'info2');
select col_type_is('amenity', 'info2', 'xml');
select col_not_null('amenity', 'info2');
select col_has_default('amenity', 'info2');
select has_column('amenity', 'active');
select col_type_is('amenity', 'active', 'boolean');
select col_not_null('amenity', 'active');
select col_has_default('amenity', 'active');
select col_default_is('amenity', 'active', 'true');
set client_min_messages to warning;
truncate amenity cascade;
truncate company_host cascade;
truncate company_user cascade;
truncate company cascade;
truncate auth."user" cascade;
reset client_min_messages;
insert into auth."user" (user_id, email, name, password, cookie, cookie_expires_at)
values (1, 'demo@tandem.blog', 'Demo', 'test', '44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e', current_timestamp + interval '1 month')
, (5, 'admin@tandem.blog', 'Demo', 'test', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', '', 60, 'FR', 'USD', 'ca')
;
insert into company_user (company_id, user_id, role)
values (2, 1, 'admin')
, (4, 5, 'admin')
;
insert into company_host (company_id, host)
values (2, 'co2')
, (4, 'co4')
;
insert into amenity (company_id, label, name)
values (2, 'W1', 'Amenity W1')
, (4, 'B1', 'Amenity B1')
;
prepare amenity_data as
select company_id, label
from amenity
order by company_id, label;
set role guest;
select bag_eq(
'amenity_data',
$$ values (2, 'W1')
, (4, 'B1')
$$,
'Everyone should be able to list all amenities across all companies'
);
reset role;
select set_cookie('44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e/demo@tandem.blog', 'co2');
select lives_ok(
$$ insert into amenity(company_id, label, name) values (2, 'w2', 'Amenity W2') $$,
'Admin from company 2 should be able to insert a new amenity to that company.'
);
select bag_eq(
'amenity_data',
$$ values (2, 'W1')
, (2, 'w2')
, (4, 'B1')
$$,
'The new row should have been added'
);
select lives_ok(
$$ update amenity set label = 'W2' where company_id = 2 and label = 'w2' $$,
'Admin from company 2 should be able to update amenities of that company.'
);
select bag_eq(
'amenity_data',
$$ values (2, 'W1')
, (2, 'W2')
, (4, 'B1')
$$,
'The row should have been updated.'
);
select lives_ok(
$$ delete from amenity where company_id = 2 and label = 'W2' $$,
'Admin from company 2 should be able to delete amenities from that company.'
);
select bag_eq(
'amenity_data',
$$ values (2, 'W1')
, (4, 'B1')
$$,
'The row should have been deleted.'
);
select throws_ok(
$$ insert into amenity (company_id, label) values (4, 'W3' ) $$,
'42501', 'new row violates row-level security policy for table "amenity"',
'Admin from company 2 should NOT be able to insert new amenities to company 4.'
);
select lives_ok(
$$ update amenity set label = 'Nope' where company_id = 4 $$,
'Admin from company 2 should NOT be able to update amenity types of company 4, but no error if company_id is not changed.'
);
select bag_eq(
'amenity_data',
$$ values (2, 'W1')
, (4, 'B1')
$$,
'No row should have been changed.'
);
select throws_ok(
$$ update amenity set company_id = 4 where company_id = 2 $$,
'42501', 'new row violates row-level security policy for table "amenity"',
'Admin from company 2 should NOT be able to move amenities to company 4'
);
select lives_ok(
$$ delete from amenity where company_id = 4 $$,
'Admin from company 2 should NOT be able to delete amenity types from company 4, but not error is thrown'
);
select bag_eq(
'amenity_data',
$$ values (2, 'W1')
, (4, 'B1')
$$,
'No row should have been changed'
);
select throws_ok(
$$ insert into amenity (company_id, label, name) values (2, ' ', 'Amenity') $$,
'23514', 'new row for relation "amenity" violates check constraint "label_not_empty"',
'Should not be able to insert amenities with a blank label.'
);
select throws_ok(
$$ insert into amenity (company_id, label, name) values (2, 'AB', ' ') $$,
'23514', 'new row for relation "amenity" violates check constraint "name_not_empty"',
'Should not be able to insert amenities with a blank name.'
);
reset role;
select *
from finish();
rollback;