-- 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;
