fix: isolate account state and ignore stale session responses

This commit is contained in:
2026-09-06 08:46:05 +03:00
parent 05c7e7ecdc
commit a291b186df
5 changed files with 109 additions and 98 deletions
+33
View File
@@ -0,0 +1,33 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import {restoreSession,setSession,getStoredUser,getToken,clearSession} from '../src/services/auth.js';
import {publicTender,USER_STATE_FIELDS,applyTenderStates} from '../src/services/tenderState.js';
test('late session restore cannot replace or clear a newer account',async()=>{
const savedStorage=globalThis.localStorage,savedFetch=globalThis.fetch;
const values=new Map();
globalThis.localStorage={getItem:k=>values.get(k)??null,setItem:(k,v)=>values.set(k,v),removeItem:k=>values.delete(k)};
try {
for(const response of [{ok:false},{ok:true,json:async()=>({success:true,user:{email:'a@test'}})}]) {
setSession('session-a',{email:'a@test'});
let resolve;globalThis.fetch=()=>new Promise(r=>resolve=r);
const pending=restoreSession();
setSession('session-b',{email:'b@test'});
resolve(response);
assert.equal((await pending).email,'b@test');
assert.equal(getToken(),'session-b');assert.equal(getStoredUser().email,'b@test');
}
setSession('session-a',{email:'a@test'});
let resolve;globalThis.fetch=()=>new Promise(r=>resolve=r);
const pending=restoreSession();clearSession();
resolve({ok:true,json:async()=>({success:true,user:{email:'a@test'}})});
assert.equal(await pending,null);assert.equal(getToken(),null);
}finally{globalThis.localStorage=savedStorage;globalThis.fetch=savedFetch;}
});
test('shared tender cache contains no preparation state and account changes clear previous state',()=>{
const source={id:'x',ikn:'2026/x',baslik:'Lab',items:[{ad:'Kit'}]};
const a={...source,...Object.fromEntries(USER_STATE_FIELDS.map(k=>[k,'private-a']))};
assert.deepEqual(publicTender(a),source);
assert.deepEqual(applyTenderStates([a].map(publicTender),{}),[source]);
const b=applyTenderStates([a].map(publicTender),{'2026/x':{data:{notes:['private-b']}}});
assert.deepEqual(b[0].notes,['private-b']);assert.equal(b[0].bidDraft,undefined);
});