Cover beta health continuity and readiness boundaries (Refs #149)
CI / checks (push) Successful in 5m29s

This commit is contained in:
2026-10-12 19:09:27 -04:00
parent f91ec4d152
commit 272055a1ed
2 changed files with 86 additions and 0 deletions
+48
View File
@@ -367,6 +367,54 @@ describe('durable beta test plans', () => {
await expect(promoteBeta(id)).rejects.toThrow('Test plan has not passed');
});
it.each(['expired', 'unhealthy', 'gap'] as const)(
'preserves healthy-minute readiness across polling variation until evidence is %s',
async (failure) => {
const id = await openPlan(defaultPlan());
const { getBeta, listBetaServers, promoteBeta } =
await import('../../src/lib/server/fleet/beta.js');
const { currentRun, readMetrics, testView } =
await import('../../src/lib/server/fleet/beta-tests.js');
await tick();
await tick();
await tick(30);
await tick(30);
const metrics = () => readMetrics(currentRun(id, names[0])!);
const expectReady = () => {
expect(getBeta(id)?.state).toBe('ready-promote');
expect(listBetaServers(id)[0].stage).toBe('ready');
expect(testView(id)?.outcome).toBe('passed');
expect(metrics()).toMatchObject({ wasHealthy: true, outages: 0 });
};
expectReady();
let minutes = metrics().values.health;
for (const seconds of [60.005, 60.048, 90]) {
await tick(seconds);
minutes += seconds / 60;
expect(metrics().values.health).toBeCloseTo(minutes);
expectReady();
}
if (failure === 'expired') {
const { betaTick } = await import('../helpers/provisioning.js');
// Re-reading the same sample cannot extend its original lifetime.
vi.setSystemTime(Date.now() + 90_000);
await betaTick();
expectReady();
expect(metrics().values.health).toBeCloseTo(minutes);
vi.setSystemTime(Date.now() + 1);
await betaTick();
} else {
await tick(failure === 'gap' ? 90.001 : 15, 0, failure === 'gap');
}
expect(metrics().values.health).toBe(0);
expect(metrics().outages).toBe(failure === 'gap' ? 0 : 1);
expect(getBeta(id)?.state).toBe('running');
expect(listBetaServers(id)[0].stage).toBe('observing');
expect(testView(id)?.outcome).toBe('active');
await expect(promoteBeta(id)).rejects.toThrow('Test plan has not passed');
}
);
it('revokes readiness if health fails while awaiting manual promotion', async () => {
const id = await openPlan({
...defaultPlan(),