57 lines
1.9 KiB
TypeScript
57 lines
1.9 KiB
TypeScript
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',
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|