Shuffle/supabase/tests/database/01_profiles.test.sql
cschlaefke 395816609f feat(db): enforce registration rules and add terms_version
Adds display name validation, terms_version, locale sync trigger and
pgTAP tests (KTO-01 criteria 1, 2, 10, 11). Includes GoTrue spike results.

Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 22:36:21 +01:00

64 lines
3.8 KiB
PL/PgSQL

-- Profile: Registrierung, Zugriff, Schutz der Spalten, Zeitstempel.
begin;
select plan(15);
-- Registrierung: ohne Altersbestätigung oder Zustimmung scheitert sie
select throws_ok(
$$insert into auth.users (id, email, raw_user_meta_data)
values (gen_random_uuid(), 'a@example.com', '{"terms_accepted":"true"}')$$,
'P0001', 'age_confirmation_required', 'Registrierung ohne Altersbestätigung scheitert');
select throws_ok(
$$insert into auth.users (id, email, raw_user_meta_data)
values (gen_random_uuid(), 'b@example.com', '{"age_confirmed":"true"}')$$,
'P0001', 'terms_acceptance_required', 'Registrierung ohne Zustimmung scheitert');
insert into auth.users (id, email, raw_user_meta_data) values
('11111111-1111-1111-1111-111111111111', 'anna@example.com',
'{"age_confirmed":"true","terms_accepted":"true","terms_version":"test","display_name":"Anna","locale":"en"}'),
('22222222-2222-2222-2222-222222222222', 'ben@example.com',
'{"age_confirmed":"true","terms_accepted":"true","terms_version":"test","display_name":"Ben"}');
select is((select count(*) from public.profiles), 2::bigint, 'Profil wird bei der Registrierung angelegt');
select is((select display_name from public.profiles where id = '22222222-2222-2222-2222-222222222222'),
'Ben', 'Anzeigename wird aus der Registrierung übernommen (Regeln der Registrierung: 05_auth_registration)');
select is((select locale from public.profiles where id = '11111111-1111-1111-1111-111111111111'),
'en', 'Sprache aus der Registrierung wird übernommen');
-- Als Anna
select set_config('request.jwt.claims', '{"sub":"11111111-1111-1111-1111-111111111111","role":"authenticated"}', true);
set local role authenticated;
select is((select count(*) from public.profiles), 1::bigint, 'Anna sieht nur ihr eigenes Profil');
select lives_ok($$update public.profiles set bio = 'Brettspielerin', city = 'Hannover' where id = '11111111-1111-1111-1111-111111111111'$$,
'Anna darf ihr Profil ändern');
select is_empty($$update public.profiles set bio = 'Fremd' where id = '22222222-2222-2222-2222-222222222222' returning 1$$,
'Anna kann fremde Profile nicht ändern');
select throws_ok($$update public.profiles set age_confirmed_at = now() where id = '11111111-1111-1111-1111-111111111111'$$,
'42501', null, 'Bestätigungen kann der Nutzer nicht ändern');
select throws_ok($$update public.profiles set deleted_at = now() where id = '11111111-1111-1111-1111-111111111111'$$,
'42501', null, 'Löschmarke kann der Nutzer nicht setzen');
select throws_ok($$update public.profiles set display_name = '' where id = '11111111-1111-1111-1111-111111111111'$$,
'23514', null, 'Leerer Anzeigename wird abgelehnt');
select throws_ok($$insert into public.profiles (id, display_name, terms_accepted_at, age_confirmed_at) values (gen_random_uuid(), 'x', now(), now())$$,
'42501', null, 'Profile werden nur durch die Registrierung angelegt');
reset role;
-- Ohne Anmeldung
set local role anon;
select throws_ok($$select * from public.profiles$$, '42501', null, 'Ohne Anmeldung kein Zugriff auf Profile');
reset role;
-- Zeitstempel: Trigger abschalten, um alte Werte zu setzen, dann normal ändern
set session_replication_role = replica;
update public.profiles set created_at = '2020-01-01', updated_at = '2020-01-01'
where id = '11111111-1111-1111-1111-111111111111';
set session_replication_role = origin;
update public.profiles set bio = 'neu', created_at = '2030-01-01'
where id = '11111111-1111-1111-1111-111111111111';
select is((select created_at from public.profiles where id = '11111111-1111-1111-1111-111111111111'),
'2020-01-01'::timestamptz, 'created_at bleibt bei Änderungen unverändert');
select ok((select updated_at from public.profiles where id = '11111111-1111-1111-1111-111111111111') > '2020-01-01'::timestamptz,
'updated_at wird bei Änderungen automatisch gesetzt');
select * from finish();
rollback;