-- Profile: Registrierung, Zugriff, Schutz der Spalten, Zeitstempel. begin; select plan(16); -- 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","display_name":"Anna","locale":"en"}'), ('22222222-2222-2222-2222-222222222222', 'ben@example.com', '{"age_confirmed":"true","terms_accepted":"true"}'), ('33333333-3333-3333-3333-333333333333', 'cara@example.com', '{"age_confirmed":"true","terms_accepted":"true","display_name":"123456789012345678901234567890-zu-lang"}'); select is((select count(*) from public.profiles), 3::bigint, 'Profil wird bei der Registrierung angelegt'); select is((select display_name from public.profiles where id = '22222222-2222-2222-2222-222222222222'), 'ben', 'Ohne Anzeigename dient der Teil vor dem @ der E-Mail'); select is((select char_length(display_name) from public.profiles where id = '33333333-3333-3333-3333-333333333333'), 30, 'Zu langer Anzeigename wird auf 30 Zeichen gekürzt'); 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;