Files
MineGeo/tests/sql/map-refresh.sql

58 lines
3.7 KiB
PL/PgSQL

-- Run against the configured project; all fixture changes roll back.
begin;
do $$
declare original public.datasets; fixture uuid; job uuid; owner uuid; moderator uuid; before_path text; before_revision uuid;
begin
select * into original from public.datasets where state='published' and parent_dataset_id is null limit 1;
if not found then raise exception 'A published fixture source is required'; end if;
owner:=original.owner_id;
select id into moderator from public.profiles where role='moderator' limit 1;
if moderator is null then raise exception 'A moderator fixture is required'; end if;
insert into public.datasets(owner_id,server_id,name,source,bounds,state,map_path,panorama_count,update_state)
values(owner,original.server_id,'Refresh regression',original.source,original.bounds,'published',original.map_path,original.panorama_count,'draft') returning id into fixture;
insert into public.dataset_inputs(dataset_id,manifest,validated) select fixture,manifest,true from public.dataset_inputs where dataset_id=original.id;
begin
perform public.refresh_map(fixture,gen_random_uuid(),original.id);
raise exception 'Unauthorized refresh succeeded';
exception when others then
if sqlerrm<>'Map owner permission required' then raise; end if;
end;
perform public.refresh_map(fixture,owner,original.id);
select id into job from public.upload_jobs where dataset_id=fixture;
if not exists(select 1 from public.upload_jobs where id=job and kind='map' and state='queued' and source_dataset_id=original.id) then raise exception 'Queue missing'; end if;
begin
perform public.refresh_map(fixture,owner,original.id);
raise exception 'Duplicate refresh succeeded';
exception when others then
if sqlerrm<>'A render is already in progress' then raise; end if;
end;
begin
perform public.submit_draft(fixture,owner);
raise exception 'Submission raced with rendering';
exception when others then
if sqlerrm<>'Wait for map rendering to finish before submitting' then raise; end if;
end;
update public.upload_jobs set state='running',lease_owner='regression',lease_until=now()+interval '2 minutes' where id=job;
perform public.complete_job(job,'regression',0,'');
if (select map_path from public.datasets where id=fixture) is distinct from original.map_path then raise exception 'Live map changed before approval'; end if;
if (select manifest->>'mapPath' from public.dataset_inputs where dataset_id=fixture) <> fixture::text||'/maps/'||job::text||'.webp' then raise exception 'Draft map missing'; end if;
perform public.submit_draft(fixture,owner);
perform public.publish_dataset(fixture,moderator,'approve');
select revision_id,map_path into before_revision,before_path from public.datasets where id=fixture;
if before_path<>fixture::text||'/maps/'||job::text||'.webp' then raise exception 'Approved map was not published'; end if;
perform public.refresh_map(fixture,owner,original.id);
select id into job from public.upload_jobs where dataset_id=fixture;
update public.upload_jobs set state='running',lease_owner='regression',lease_until=now()+interval '2 minutes' where id=job;
perform public.complete_job(job,'regression',0,'');
if (select manifest->>'mapPath' from public.revisions where id=before_revision)<>before_path then raise exception 'Existing game revision changed'; end if;
update public.upload_jobs set state='failed' where id=job;
update public.datasets set bounds=jsonb_set(bounds,'{maxX}',to_jsonb((bounds->>'maxX')::int+1)) where id=fixture;
begin
perform public.refresh_map(fixture,owner,original.id);
raise exception 'Mismatched bounds accepted';
exception when others then
if sqlerrm<>'Capture boundaries must match the map exactly' then raise; end if;
end;
end; $$;
rollback;