numerus/test/invoice_payment.sql
jordi fita mas ebb073166a Subsume collections into payments, and record payments in negative
This is to handle refunds, which are invoices with negative amounts,
that can be both issued or received (i.e., an “expense”).

The API provided by PostgreSQL is mostly the same, and internally it
deals with negatives, so the Go package only had to change selects of
collection.
2025-01-30 23:24:16 +01:00

143 lines
4.8 KiB
PL/PgSQL

-- Test invoice_payment
set client_min_messages to warning;
create extension if not exists pgtap;
reset client_min_messages;
begin;
select plan(23);
set search_path to numerus, auth, public;
select has_table('invoice_payment');
select has_pk('invoice_payment');
select col_is_pk('invoice_payment', array['invoice_id', 'payment_id']);
select table_privs_are('invoice_payment', 'guest', array []::text[]);
select table_privs_are('invoice_payment', 'invoicer', array ['SELECT', 'INSERT', 'UPDATE', 'DELETE']);
select table_privs_are('invoice_payment', 'admin', array ['SELECT', 'INSERT', 'UPDATE', 'DELETE']);
select table_privs_are('invoice_payment', 'authenticator', array []::text[]);
select has_column('invoice_payment', 'invoice_id');
select col_is_fk('invoice_payment', 'invoice_id');
select fk_ok('invoice_payment', 'invoice_id', 'invoice', 'invoice_id');
select col_type_is('invoice_payment', 'invoice_id', 'integer');
select col_not_null('invoice_payment', 'invoice_id');
select col_hasnt_default('invoice_payment', 'invoice_id');
select has_column('invoice_payment', 'payment_id');
select col_is_fk('invoice_payment', 'payment_id');
select fk_ok('invoice_payment', 'payment_id', 'payment', 'payment_id');
select col_type_is('invoice_payment', 'payment_id', 'integer');
select col_not_null('invoice_payment', 'payment_id');
select col_hasnt_default('invoice_payment', 'payment_id');
set client_min_messages to warning;
truncate invoice_payment cascade;
truncate payment cascade;
truncate payment_account cascade;
truncate invoice cascade;
truncate contact_tax_details cascade;
truncate contact cascade;
truncate company_user cascade;
truncate payment_method 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')
;
set constraints "company_default_payment_method_id_fkey" deferred;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id)
values (2, 1)
, (4, 5)
;
insert into contact (contact_id, company_id, name)
values ( 9, 2, 'Customer 1')
, (10, 4, 'Customer 2')
;
insert into contact_tax_details (contact_id, business_name, vatin, address, city, province, postal_code, country_code)
values (9, 'Customer 1', 'XX555', '', '', '', '', 'ES')
, (10, 'Customer 2', 'XX666', '', '', '', '', 'ES')
;
insert into invoice (invoice_id, company_id, invoice_number, contact_id, invoice_date, payment_method_id, currency_code)
values (13, 2, 'INV001', 9, '2011-01-11', 222, 'EUR')
, (14, 4, 'INV002', 10, '2022-02-22', 444, 'EUR')
;
insert into payment_account (payment_account_id, company_id, payment_account_type, name)
values (17, 2, 'cash', 'Cash 2')
, (18, 4, 'cash', 'Cash 4')
;
insert into payment (payment_id, company_id, description, payment_date, payment_account_id, amount, currency_code)
values (21, 2, 'Collection INV001', '2022-01-11', 17, 111, 'EUR')
, (22, 4, 'Collection INV002', '2022-02-23', 18, 222, 'EUR')
;
insert into invoice_payment (invoice_id, payment_id)
values (13, 21)
, (14, 22)
;
prepare invoice_payment_data as
select invoice_id, payment_id
from invoice_payment
order by invoice_id, payment_id;
set role invoicer;
select is_empty('invoice_payment_data', 'Should show no data when cookie is not set yet');
reset role;
select set_cookie('44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e/demo@tandem.blog');
select bag_eq(
'invoice_payment_data',
$$ values (13, 21)
$$,
'Should only list tax of products of the companies where demo@tandem.blog is user of'
);
reset role;
select set_cookie('12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524/admin@tandem.blog');
select bag_eq(
'invoice_payment_data',
$$ values (14, 22)
$$,
'Should only list tax of products of the companies where admin@tandem.blog is user of'
);
reset role;
select set_cookie('not-a-cookie');
select throws_ok(
'invoice_payment_data',
'42501', 'permission denied for table invoice_payment',
'Should not allow select to guest users'
);
reset role;
select *
from finish();
rollback;