2023-10-12 14:33:45 +00:00
-- Test campsite_type_carousel
set client_min_messages to warning ;
create extension if not exists pgtap ;
reset client_min_messages ;
begin ;
2023-12-20 18:52:14 +00:00
select plan ( 45 ) ;
2023-10-12 14:33:45 +00:00
set search_path to camper , public ;
select has_table ( ' campsite_type_carousel ' ) ;
select has_pk ( ' campsite_type_carousel ' ) ;
select col_is_pk ( ' campsite_type_carousel ' , array [ ' campsite_type_id ' , ' media_id ' ] ) ;
select table_privs_are ( ' campsite_type_carousel ' , ' guest ' , array [ ' SELECT ' ] ) ;
select table_privs_are ( ' campsite_type_carousel ' , ' employee ' , array [ ' SELECT ' ] ) ;
select table_privs_are ( ' campsite_type_carousel ' , ' admin ' , array [ ' SELECT ' , ' INSERT ' , ' UPDATE ' , ' DELETE ' ] ) ;
select table_privs_are ( ' campsite_type_carousel ' , ' authenticator ' , array [ ] : : text [ ] ) ;
select has_column ( ' campsite_type_carousel ' , ' campsite_type_id ' ) ;
select col_is_fk ( ' campsite_type_carousel ' , ' campsite_type_id ' ) ;
select fk_ok ( ' campsite_type_carousel ' , ' campsite_type_id ' , ' campsite_type ' , ' campsite_type_id ' ) ;
select col_type_is ( ' campsite_type_carousel ' , ' campsite_type_id ' , ' integer ' ) ;
select col_not_null ( ' campsite_type_carousel ' , ' campsite_type_id ' ) ;
select col_hasnt_default ( ' campsite_type_carousel ' , ' campsite_type_id ' ) ;
select has_column ( ' campsite_type_carousel ' , ' media_id ' ) ;
select col_is_fk ( ' campsite_type_carousel ' , ' media_id ' ) ;
select fk_ok ( ' campsite_type_carousel ' , ' media_id ' , ' media ' , ' media_id ' ) ;
select col_type_is ( ' campsite_type_carousel ' , ' media_id ' , ' integer ' ) ;
select col_not_null ( ' campsite_type_carousel ' , ' media_id ' ) ;
select col_hasnt_default ( ' campsite_type_carousel ' , ' media_id ' ) ;
select has_column ( ' campsite_type_carousel ' , ' caption ' ) ;
select col_type_is ( ' campsite_type_carousel ' , ' caption ' , ' text ' ) ;
select col_not_null ( ' campsite_type_carousel ' , ' caption ' ) ;
select col_hasnt_default ( ' campsite_type_carousel ' , ' caption ' ) ;
2023-12-20 18:52:14 +00:00
select has_column ( ' campsite_type_carousel ' , ' position ' ) ;
select col_type_is ( ' campsite_type_carousel ' , ' position ' , ' integer ' ) ;
select col_not_null ( ' campsite_type_carousel ' , ' position ' ) ;
select col_has_default ( ' campsite_type_carousel ' , ' position ' ) ;
select col_default_is ( ' campsite_type_carousel ' , ' position ' , ' 2147483647 ' ) ;
2023-10-12 14:33:45 +00:00
set client_min_messages to warning ;
truncate campsite_type_carousel cascade ;
truncate campsite_type cascade ;
truncate media cascade ;
truncate media_content 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 ' )
;
2024-02-27 18:45:47 +00:00
insert into company ( company_id , business_name , vatin , trade_name , phone , email , web , address , city , province , postal_code , rtc_number , tourist_tax , tourist_tax_max_days , country_code , currency_code , default_lang_tag )
values ( 2 , ' Company 2 ' , ' XX123 ' , ' ' , ' 555-555-555 ' , ' a@a ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , 60 , 7 , ' ES ' , ' EUR ' , ' ca ' )
, ( 4 , ' Company 4 ' , ' XX234 ' , ' ' , ' 666-666-666 ' , ' b@b ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , 60 , 7 , ' FR ' , ' USD ' , ' ca ' )
2023-10-12 14:33:45 +00:00
;
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 media_content ( media_type , bytes )
values ( ' image/x-xpixmap ' , ' static char *s[]={"1 1 1 1","a c #ffffff","a"}; ' )
, ( ' text/plain ' , ' content2 ' )
, ( ' text/plain ' , ' content3 ' )
, ( ' text/plain ' , ' content4 ' )
, ( ' text/plain ' , ' content5 ' )
;
insert into media ( media_id , company_id , original_filename , content_hash )
values ( 6 , 2 , ' cover2.xpm ' , sha256 ( ' static char *s[]={"1 1 1 1","a c #ffffff","a"}; ' ) )
, ( 7 , 2 , ' text2.txt ' , sha256 ( ' content2 ' ) )
, ( 8 , 2 , ' text3.txt ' , sha256 ( ' content3 ' ) )
, ( 9 , 4 , ' cover4.xpm ' , sha256 ( ' static char *s[]={"1 1 1 1","a c #ffffff","a"}; ' ) )
, ( 10 , 4 , ' text4.txt ' , sha256 ( ' content4 ' ) )
, ( 11 , 4 , ' text5.txt ' , sha256 ( ' content5 ' ) )
;
Add campsite_type_pet_cost relation to hold price of dogs in campsites
It is a separate relation, instead of having a field in campsite_type,
because not all campsite types allow dogs. I could have added a new
field to campsite_type, but then its values it would be meaningless for
campsites that do not allow dogs, and a nullable field is not a valid
solution because NULL means “unknown”, but we **do** know the price —
none.
A separate relation encodes the same information without ambiguities nor
null values, and, in fact, removed the dogs_allowed field from
campsite_type to prevent erroneous status, such as a campsite type that
allows dogs without having a cost — even if the cost is zero, it has to
be added to the new relation.
2024-02-10 05:18:30 +00:00
insert into campsite_type ( campsite_type_id , company_id , name , media_id , max_campers , bookable_nights )
values ( 21 , 2 , ' Wooden lodge ' , 6 , 7 , ' [1, 7] ' )
, ( 22 , 4 , ' Bungalow ' , 9 , 6 , ' [2, 6] ' )
2023-10-12 14:33:45 +00:00
;
insert into campsite_type_carousel ( campsite_type_id , media_id , caption )
values ( 21 , 7 , ' Caption 7 ' )
, ( 22 , 10 , ' Caption 10 ' )
;
prepare carousel_data as
select campsite_type_id , media_id , caption
from campsite_type_carousel
;
set role guest ;
select bag_eq (
' carousel_data ' ,
$ $ values ( 21 , 7 , ' Caption 7 ' )
, ( 22 , 10 , ' Caption 10 ' )
$ $ ,
' Everyone should be able to list all campsite slides across all companies '
) ;
reset role ;
select set_cookie ( ' 44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e/demo@tandem.blog ' , ' co2 ' ) ;
select lives_ok (
$ $ insert into campsite_type_carousel ( campsite_type_id , media_id , caption ) values ( 21 , 8 , ' Caption 8 ' ) $ $ ,
' Admin from company 2 should be able to insert a new slide to campsite types of that company. '
) ;
select bag_eq (
' carousel_data ' ,
$ $ values ( 21 , 7 , ' Caption 7 ' )
, ( 21 , 8 , ' Caption 8 ' )
, ( 22 , 10 , ' Caption 10 ' )
$ $ ,
' The new row should have been added '
) ;
select lives_ok (
$ $ update campsite_type_carousel set caption = ' Caption 8.8 ' where media_id = 8 $ $ ,
' Admin from company 2 should be able to update campsite type slides of that company. '
) ;
select bag_eq (
' carousel_data ' ,
$ $ values ( 21 , 7 , ' Caption 7 ' )
, ( 21 , 8 , ' Caption 8.8 ' )
, ( 22 , 10 , ' Caption 10 ' )
$ $ ,
' The row should have been updated. '
) ;
select lives_ok (
$ $ delete from campsite_type_carousel where media_id = 8 $ $ ,
' Admin from company 2 should be able to delete campsite type slides from that company. '
) ;
select bag_eq (
' carousel_data ' ,
$ $ values ( 21 , 7 , ' Caption 7 ' )
, ( 22 , 10 , ' Caption 10 ' )
$ $ ,
' The row should have been deleted. '
) ;
select throws_ok (
$ $ insert into campsite_type_carousel ( campsite_type_id , media_id , caption ) values ( 21 , 10 , ' Nope ' ) $ $ ,
' 42501 ' , ' new row violates row-level security policy for table "campsite_type_carousel" ' ,
' Admin from company 2 should NOT be able to insert a new campsite types slide from a media of company 4. '
) ;
select throws_ok (
$ $ insert into campsite_type_carousel ( campsite_type_id , media_id , caption ) values ( 22 , 8 , ' Nope ' ) $ $ ,
' 42501 ' , ' new row violates row-level security policy for table "campsite_type_carousel" ' ,
' Admin from company 2 should NOT be able to insert a slide to a campsite type of company 4. '
) ;
select lives_ok (
$ $ update campsite_type_carousel set caption = ' Nope ' where campsite_type_id = 22 $ $ ,
' Admin from company 2 should not be able to update slides of campsite types from company 4, but no error if campsite_type_id or media_id is not changed. '
) ;
select lives_ok (
$ $ update campsite_type_carousel set caption = ' Nope ' where media_id = 10 $ $ ,
' Admin from company 2 should not be able to update slides of campsite types from company 4, but no error if campsite_type_id or media_id is not changed. '
) ;
select bag_eq (
' carousel_data ' ,
$ $ values ( 21 , 7 , ' Caption 7 ' )
, ( 22 , 10 , ' Caption 10 ' )
$ $ ,
' No row should have been changed. '
) ;
select throws_ok (
$ $ update campsite_type_carousel set campsite_type_id = 22 where campsite_type_id = 21 $ $ ,
' 42501 ' , ' new row violates row-level security policy for table "campsite_type_carousel" ' ,
' Admin from company 2 should NOT be able to move slides to campsite types of company 4 '
) ;
select throws_ok (
$ $ update campsite_type_carousel set media_id = 11 where media_id = 7 $ $ ,
' 42501 ' , ' new row violates row-level security policy for table "campsite_type_carousel" ' ,
' Admin from company 2 should NOT be able to use media from company 4 '
) ;
select lives_ok (
$ $ delete from campsite_type_carousel where campsite_type_id = 22 $ $ ,
' Admin from company 2 should NOT be able to delete slides of campsite types from company 4, but not error is thrown '
) ;
select lives_ok (
$ $ delete from campsite_type_carousel where media_id = 10 $ $ ,
' Admin from company 2 should NOT be able to delete slides with media from company 4, but not error is thrown '
) ;
select bag_eq (
' carousel_data ' ,
$ $ values ( 21 , 7 , ' Caption 7 ' )
, ( 22 , 10 , ' Caption 10 ' )
$ $ ,
' No row should have been changed '
) ;
reset role ;
select *
from finish ( ) ;
rollback ;