import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; import { CALL_REJOIN_MAX_AGE_MS, decideRejoin, RejoinContext } from './callRejoin'; const base: RejoinContext = { record: { roomId: '!r', deviceId: 'DEV', joinedAt: 900_000, lastSeen: 1_000_000, microphone: true, video: false, }, mode: 'ask', now: 1_060_000, myDeviceId: 'DEV', roomJoined: true, ownMemberDevices: [], memberCount: 2, }; describe('decideRejoin', () => { it('asks by default when the call is still going', () => { assert.deepEqual(decideRejoin(base), { action: 'ask', roomId: '!r' }); assert.deepEqual(decideRejoin({ ...base, mode: 'auto' }), { action: 'auto', roomId: '!r' }); }); it('does nothing when off, stale, another device, or no record', () => { assert.deepEqual(decideRejoin({ ...base, mode: 'off' }), { action: 'none' }); assert.deepEqual(decideRejoin({ ...base, record: undefined }), { action: 'none' }); assert.deepEqual(decideRejoin({ ...base, now: 1_000_000 + CALL_REJOIN_MAX_AGE_MS + 1 }), { action: 'none', }); assert.deepEqual(decideRejoin({ ...base, myDeviceId: 'OTHER' }), { action: 'none' }); assert.deepEqual(decideRejoin({ ...base, roomJoined: false }), { action: 'none' }); }); it('skips when we already rejoined from another device', () => { assert.deepEqual(decideRejoin({ ...base, ownMemberDevices: ['PHONE'], memberCount: 2 }), { action: 'none', }); }); it('skips when only our own stale membership is left', () => { assert.deepEqual(decideRejoin({ ...base, ownMemberDevices: ['DEV'], memberCount: 1 }), { action: 'none', }); assert.deepEqual(decideRejoin({ ...base, ownMemberDevices: [], memberCount: 0 }), { action: 'none', }); assert.deepEqual(decideRejoin({ ...base, ownMemberDevices: ['DEV'], memberCount: 2 }), { action: 'ask', roomId: '!r', }); }); });