-- pgTAP: tasks completion-consistency CHECK constraint — Fase 3 -- Run with: psql -U postgres -d postgres -f supabase/tests/005_tasks_rls.sql -- -- The completion CHECK constraint is the SQL invariant that backs the UI: -- completed_at NOT NULL ⇔ completed_by NOT NULL ⇔ is_completed = true CREATE EXTENSION IF NOT EXISTS pgtap; BEGIN; SELECT plan(5); -- Reuse the seeded collective + admin (Ana) to satisfy FKs without RLS gymnastics. DO $$ DECLARE v_list_id uuid; v_task_id uuid; BEGIN INSERT INTO public.task_lists (collective_id, name, created_by) VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'pgtap list', '11111111-1111-1111-1111-111111111111') RETURNING id INTO v_list_id; -- Stash for assertions PERFORM set_config('pgtap.list_id', v_list_id::text, false); END $$; -- T-PG-01: insert with default (is_completed=false, no completed_*) succeeds SELECT lives_ok( $$ INSERT INTO public.tasks (list_id, title, created_by) VALUES (current_setting('pgtap.list_id')::uuid, 'pgtap incomplete task', '11111111-1111-1111-1111-111111111111') $$, 'T-PG-01: incomplete task can be inserted with NULL completed_by/completed_at' ); -- T-PG-02: insert is_completed=true + completed_by + completed_at succeeds SELECT lives_ok( $$ INSERT INTO public.tasks (list_id, title, is_completed, completed_by, completed_at, created_by) VALUES (current_setting('pgtap.list_id')::uuid, 'pgtap completed task', true, '11111111-1111-1111-1111-111111111111', now(), '11111111-1111-1111-1111-111111111111') $$, 'T-PG-02: complete task with completed_by + completed_at succeeds' ); -- T-PG-03: is_completed=true with NULL completed_by violates CHECK SELECT throws_ok( $$ INSERT INTO public.tasks (list_id, title, is_completed, completed_by, completed_at, created_by) VALUES (current_setting('pgtap.list_id')::uuid, 'pgtap broken', true, NULL, now(), '11111111-1111-1111-1111-111111111111') $$, '23514', NULL, 'T-PG-03: is_completed=true without completed_by raises CHECK violation (23514)' ); -- T-PG-04: is_completed=false with completed_by set violates CHECK SELECT throws_ok( $$ INSERT INTO public.tasks (list_id, title, is_completed, completed_by, completed_at, created_by) VALUES (current_setting('pgtap.list_id')::uuid, 'pgtap broken-2', false, '11111111-1111-1111-1111-111111111111', now(), '11111111-1111-1111-1111-111111111111') $$, '23514', NULL, 'T-PG-04: is_completed=false with completed_by set raises CHECK violation' ); -- T-PG-05: is_completed=true with completed_by but NULL completed_at violates CHECK SELECT throws_ok( $$ INSERT INTO public.tasks (list_id, title, is_completed, completed_by, completed_at, created_by) VALUES (current_setting('pgtap.list_id')::uuid, 'pgtap broken-3', true, '11111111-1111-1111-1111-111111111111', NULL, '11111111-1111-1111-1111-111111111111') $$, '23514', NULL, 'T-PG-05: is_completed=true with NULL completed_at raises CHECK violation' ); SELECT * FROM finish(); ROLLBACK;