import assert from 'node:assert/strict'; export async function run(db){ const q=(s,p=[])=>db.query(s,p);const one=async(s,p)=>(await q(s,p)).rows[0]; const ids=['00000000-0000-4000-8000-000000000001','00000000-0000-4000-8000-000000000002','00000000-0000-4000-8000-000000000003','00000000-0000-4000-8000-000000000004']; async function actor(id,aal='aal1'){await db.exec('reset role');await q("select set_config('request.jwt.claim.sub',$1,false),set_config('request.jwt.claims',$2,false)",[id,JSON.stringify({sub:id,aal,role:'authenticated'})]);await db.exec('set role authenticated');} async function denied(s,p,re){await assert.rejects(q(s,p),re);} await db.exec(`create function realtime.send(jsonb,text,text,boolean) returns void language plpgsql as $$begin end$$;`); for(let i=0;iString(o.id)==='77').data; assert.equal(historical.prepayment,2000);assert.equal(historical.status,'Новый');assert.equal(historical.balance,5500); await q('select public.caterium_account_snapshot($1)',[ws]); await q('select * from public.sun_list_workspace_members($1)',[ws]); await q("select public.sun_employee_prepare_v28($1,'test3@example.invalid','Viewer','viewer')",[ws]); await q("select public.sun_employee_finalize_v28($1,$2,'Viewer','viewer')",[ws,ids[3]]); await actor(ids[2]);const foreign=(await one('select public.sun_create_workspace() as id')).id; assert.equal((await one('select * from public.sun_fetch_app_state($1)',[foreign])).payload.storage.sunPdfBrandLogoV1,undefined); assert.equal((await one('select public.caterium_my_sidebar_brand() as b')).b.variant,'caterium'); await denied('select * from public.sun_fetch_app_state($1)',[ws],/Access denied/); await denied('select * from public.sun_v17_clients_snapshot_v1773($1)',[ws],/Access denied/); await denied('select public.sun_dev_dashboard()',[],/administrator/); await actor(ids[3]); assert.equal((await one('select public.caterium_my_sidebar_brand() as b')).b.variant,'caterium'); await denied('select * from public.sun_save_app_state_v17($1,$2,$3,$4)',[ws,{...payload,storage:{...payload.storage,sunPdfBrandNameV1:'Hijacked'}},'viewer-brand',row.revision],/Нет права/); await denied('select * from public.sun_save_app_state_v17($1,$2,$3,$4)',[ws,{...payload,storage:{...payload.storage,sunOrders:{t:'j',v:[{id:2}]}}},'viewer',row.revision],/Нет права/); await actor(ids[0],'aal2'); for(const f of ['sun_dev_dashboard','sun_dev_list_companies','sun_dev_list_companies_v1768','sun_dev_list_users','sun_dev_list_errors','sun_dev_list_activity','sun_dev_list_trial_promos'])await q(`select * from public.${f}()`); for(const f of ['sun_dev_workspace_diagnostics','sun_dev_list_workspace_features','sun_dev_support_snapshot'])await q(`select * from public.${f}($1)`,[ws]); await q("select public.sun_dev_create_company('Recovery test company','test3@example.invalid','full',30,'[]','test')"); console.log('PASS smoke: owner onboarding, save/read, optimistic conflict, normalized catalog/orders/clients, backups, employees, cross-tenant isolation, viewer write denial, AAL2, developer RPCs'); await db.close(); }