feat: 메인 시계를 턴 엔진 상태로 표시한다
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user