numerus/test/product.sql
jordi fita mas e9cc331ee0 Add products section
There is still some issues with the price field, because for now it is
in cents, but do not have time now to fix that.
2023-02-04 11:32:39 +01:00

148 lines
5.0 KiB
PL/PgSQL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Test product
set client_min_messages to warning;
create extension if not exists pgtap;
reset client_min_messages;
begin;
select plan(55);
set search_path to numerus, auth, public;
select has_table('product');
select has_pk('product' );
select table_privs_are('product', 'guest', array []::text[]);
select table_privs_are('product', 'invoicer', array ['SELECT', 'INSERT', 'UPDATE', 'DELETE']);
select table_privs_are('product', 'admin', array ['SELECT', 'INSERT', 'UPDATE', 'DELETE']);
select table_privs_are('product', 'authenticator', array []::text[]);
select has_sequence('product_product_id_seq');
select sequence_privs_are('product_product_id_seq', 'guest', array[]::text[]);
select sequence_privs_are('product_product_id_seq', 'invoicer', array['USAGE']);
select sequence_privs_are('product_product_id_seq', 'admin', array['USAGE']);
select sequence_privs_are('product_product_id_seq', 'authenticator', array[]::text[]);
select has_column('product', 'product_id');
select col_is_pk('product', 'product_id');
select col_type_is('product', 'product_id', 'integer');
select col_not_null('product', 'product_id');
select col_has_default('product', 'product_id');
select col_default_is('product', 'product_id', 'nextval(''product_product_id_seq''::regclass)');
select has_column('product', 'company_id');
select col_is_fk('product', 'company_id');
select fk_ok('product', 'company_id', 'company', 'company_id');
select col_type_is('product', 'company_id', 'integer');
select col_not_null('product', 'company_id');
select col_hasnt_default('product', 'company_id');
select has_column('product', 'slug');
select col_type_is('product', 'slug', 'uuid');
select col_not_null('product', 'slug');
select col_has_default('product', 'slug');
select col_default_is('product', 'slug', 'gen_random_uuid()');
select has_column('product', 'name');
select col_type_is('product', 'name', 'text');
select col_not_null('product', 'name');
select col_hasnt_default('product', 'name');
select has_column('product', 'description');
select col_type_is('product', 'description', 'text');
select col_not_null('product', 'description');
select col_hasnt_default('product', 'description');
select has_column('product', 'price');
select col_type_is('product', 'price', 'integer');
select col_not_null('product', 'price');
select col_hasnt_default('product', 'price');
select has_column('product', 'tax_id');
select col_is_fk('product', 'tax_id');
select fk_ok('product', 'tax_id', 'tax', 'tax_id');
select col_type_is('product', 'tax_id', 'integer');
select col_not_null('product', 'tax_id');
select col_hasnt_default('product', 'tax_id');
select has_column('product', 'created_at');
select col_type_is('product', 'created_at', 'timestamp with time zone');
select col_not_null('product', 'created_at');
select col_has_default('product', 'created_at');
select col_default_is('product', 'created_at', current_timestamp);
set client_min_messages to warning;
truncate product cascade;
truncate tax 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, role, cookie, cookie_expires_at)
values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e', current_timestamp + interval '1 month')
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD')
;
insert into company_user (company_id, user_id)
values (2, 1)
, (4, 5)
;
insert into tax (tax_id, company_id, name, rate)
values (3, 2, 'IVA 21 %', 0.21)
, (6, 4, 'IVA 10 %', 0.10)
;
insert into product (company_id, name, description, price, tax_id)
values (2, 'Product 1', 'Description 1', 1200, 3)
, (4, 'Product 2', 'Description 2', 2400, 6)
;
prepare product_data as
select company_id, name
from product
order by company_id, name;
set role invoicer;
select is_empty('product_data', 'Should show no data when cookie is not set yet');
reset role;
select set_cookie('44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e/demo@tandem.blog');
select bag_eq(
'product_data',
$$ values (2, 'Product 1')
$$,
'Should only list products of the companies where demo@tandem.blog is user of'
);
reset role;
select set_cookie('12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524/admin@tandem.blog');
select bag_eq(
'product_data',
$$ values (4, 'Product 2')
$$,
'Should only list products of the companies where admin@tandem.blog is user of'
);
reset role;
select set_cookie('not-a-cookie');
select throws_ok(
'product_data',
'42501', 'permission denied for table product',
'Should not allow select to guest users'
);
reset role;
select *
from finish();
rollback;