sessionStop.test.ts 1.3 KB

123456789101112131415161718192021
  1. // @vitest-environment node
  2. import {afterEach,expect,it,vi} from 'vitest'
  3. import {waitForHermesSessionIdle} from '../../src/server/sessionStop'
  4. afterEach(()=>vi.useRealTimers())
  5. it('waits beyond the interrupt receipt until the owned native session is idle',async()=>{
  6. const rpc=vi.fn().mockResolvedValueOnce({sessions:[{id:'other',status:'idle'},{id:'mine',status:'working'}]})
  7. .mockResolvedValueOnce({sessions:[{id:'mine',status:'idle'}]})
  8. await waitForHermesSessionIdle(rpc,'mine','default',{pollMs:1})
  9. expect(rpc).toHaveBeenCalledTimes(2)
  10. expect(rpc).toHaveBeenCalledWith('session.active_list',{profile:'default',current_session_id:'mine'})
  11. })
  12. it('accepts a finalized session disappearing, but refuses malformed stop evidence',async()=>{
  13. await waitForHermesSessionIdle(async()=>({sessions:[]}),'mine','default')
  14. await expect(waitForHermesSessionIdle(async()=>({ok:true}),'mine','default')).rejects.toMatchObject({code:'session_stop_unconfirmed'})
  15. })
  16. it('times out without treating an acknowledgement or a sibling idle session as termination',async()=>{
  17. const pending=waitForHermesSessionIdle(async()=>({sessions:[{id:'mine',status:'working'},{id:'other',status:'idle'}]}),'mine','default',{timeoutMs:200,pollMs:100})
  18. const rejected=expect(pending).rejects.toMatchObject({code:'session_still_stopping'})
  19. await rejected
  20. })