68 lines
4 KiB
PL/PgSQL
68 lines
4 KiB
PL/PgSQL
-- 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;
|