36 lines
1.4 KiB
TypeScript
36 lines
1.4 KiB
TypeScript
import { test } from 'node:test';
|
|||
|
|
import assert from 'node:assert/strict';
|
||
|
|
import { classifySessionChange, SessionIdentity } from './useSessionSync';
|
||
|
|
|
||
|
|
const alice: SessionIdentity = { userId: '@alice:hs', deviceId: 'DEV1', accessToken: 'tok-1' };
|
||
|
|
|
||
|
|
test('classifySessionChange: session removed elsewhere → removed', () => {
|
||
|
|
assert.equal(classifySessionChange(alice, null), 'removed');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('classifySessionChange: nothing before or after → none', () => {
|
||
|
|
assert.equal(classifySessionChange(null, null), 'none');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('classifySessionChange: session appeared → relogin', () => {
|
||
|
|
assert.equal(classifySessionChange(null, alice), 'relogin');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('classifySessionChange: different user or device → relogin', () => {
|
||
|
|
assert.equal(classifySessionChange(alice, { ...alice, userId: '@bob:hs' }), 'relogin');
|
||
|
|
assert.equal(classifySessionChange(alice, { ...alice, deviceId: 'DEV2' }), 'relogin');
|
||
|
|
// Even when the access token also changed, the identity change wins.
|
||
|
|
assert.equal(
|
||
|
|
classifySessionChange(alice, { ...alice, deviceId: 'DEV2', accessToken: 'tok-2' }),
|
||
|
|
'relogin',
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('classifySessionChange: same user+device, new access token → rotated (no reload)', () => {
|
||
|
|
assert.equal(classifySessionChange(alice, { ...alice, accessToken: 'tok-2' }), 'rotated');
|
||
|
|
});
|
||
|
|
|
||
|
|
test('classifySessionChange: identical credentials (metadata-only rewrite) → none', () => {
|
||
|
|
assert.equal(classifySessionChange(alice, { ...alice }), 'none');
|
||
|
|
});
|