48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
decryptGameSessionToken,
|
|
encryptGameSessionToken,
|
|
parseGameSessionTokenPayload,
|
|
type GameSessionTokenPayload,
|
|
} from '../src/auth/gameToken.js';
|
|
|
|
const buildPayload = (): GameSessionTokenPayload => ({
|
|
version: 1,
|
|
profile: 'che:default',
|
|
issuedAt: '2026-07-31T09:00:00.000Z',
|
|
expiresAt: '2026-07-31T09:10:00.000Z',
|
|
sessionId: 'session-1',
|
|
user: {
|
|
id: 'user-1',
|
|
username: 'tester',
|
|
displayName: '테스트',
|
|
roles: ['user'],
|
|
picture: 'account-icon.png',
|
|
imageServer: 1,
|
|
iconUpdatedAt: '2026-07-31T08:59:00.000Z',
|
|
},
|
|
sanctions: {},
|
|
});
|
|
|
|
describe('game session token account icon revision', () => {
|
|
it('round-trips the canonical account icon revision', () => {
|
|
const payload = buildPayload();
|
|
const token = encryptGameSessionToken(payload, 'test-only-secret');
|
|
|
|
expect(decryptGameSessionToken(token, 'test-only-secret')).toEqual(payload);
|
|
});
|
|
|
|
it.each([1, {}, '2026-07-31', '2026-07-31T08:59:00Z', 'not-a-date'])(
|
|
'rejects a non-canonical icon revision: %j',
|
|
(iconUpdatedAt) => {
|
|
const payload = buildPayload() as unknown as {
|
|
user: { iconUpdatedAt: unknown };
|
|
};
|
|
payload.user.iconUpdatedAt = iconUpdatedAt;
|
|
|
|
expect(parseGameSessionTokenPayload(payload)).toBeNull();
|
|
}
|
|
);
|
|
});
|