Files
core2026/app/game-api/test/turnEngineStatus.test.ts
T

81 lines
3.1 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest';
import { CachedTurnEngineStatus, loadTurnEngineRunning } from '../src/services/turnEngineStatus.js';
describe('turn engine status projection', () => {
it('maps Gateway profile capabilities and keeps unavailable status unknown', async () => {
const activeLease = {
turnDaemonLease: {
findUnique: vi.fn(async () => ({ leaseUntil: new Date('2026-08-24T00:01:00.000Z') })),
},
};
const now = new Date('2026-08-24T00:00:00.000Z');
await expect(loadTurnEngineRunning({ get: async () => 'RUNNING' }, activeLease, 'che:default', now)).resolves.toBe(
true
);
await expect(loadTurnEngineRunning({ get: async () => 'PREOPEN' }, activeLease, 'che:default', now)).resolves.toBe(
false
);
await expect(loadTurnEngineRunning({ get: async () => 'PAUSED' }, activeLease, 'che:default', now)).resolves.toBe(
false
);
await expect(loadTurnEngineRunning({ get: async () => null }, activeLease, 'che:default', now)).resolves.toBeNull();
await expect(
loadTurnEngineRunning(
{ get: async () => Promise.reject(new Error('gateway unavailable')) },
activeLease,
'che:default',
now
)
).resolves.toBeNull();
});
it('marks a RUNNING profile stopped when its daemon lease is missing or expired', async () => {
const source = { get: async () => 'RUNNING' as const };
const now = new Date('2026-08-24T00:00:00.000Z');
await expect(
loadTurnEngineRunning(
source,
{ turnDaemonLease: { findUnique: async () => null } },
'che:default',
now
)
).resolves.toBe(false);
await expect(
loadTurnEngineRunning(
source,
{
turnDaemonLease: {
findUnique: async () => ({ leaseUntil: new Date('2026-08-23T23:59:59.999Z') }),
},
},
'che:default',
now
)
).resolves.toBe(false);
});
it('coalesces concurrent heartbeat reads and refreshes after the bounded cache window', async () => {
let now = 1_000;
const get = vi.fn(async () => 'RUNNING' as const);
const findUnique = vi.fn(async () => ({ leaseUntil: new Date('2099-01-01T00:00:00.000Z') }));
const cache = new CachedTurnEngineStatus(
{ get },
{ turnDaemonLease: { findUnique } },
'che:default',
2_000,
() => now
);
await expect(Promise.all([cache.get(), cache.get()])).resolves.toEqual([true, true]);
expect(get).toHaveBeenCalledTimes(1);
now += 1_999;
await expect(cache.get()).resolves.toBe(true);
expect(get).toHaveBeenCalledTimes(1);
now += 1;
await expect(cache.get()).resolves.toBe(true);
expect(get).toHaveBeenCalledTimes(2);
expect(findUnique).toHaveBeenCalledTimes(2);
});
});