Files
ForgeFlow/tests/deployment-policy.test.mjs
NuklearRabbit 4ad698c4eb Release ForgeFlow 0.8.1
Add advanced Git and deployment workflows, secure backups and auditing, live Gitea integration, desktop notifications, connection validation, and the premium responsive UX refresh.
2026-07-26 00:42:17 +02:00

30 lines
1.9 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import policyModule from '../src/shared/deployment-policy.cjs';
const { evaluateDeploymentPolicy } = policyModule;
test('deployment freeze and maintenance windows fail closed with reasoned overrides', () => {
const profile = { deploymentPolicy: { frozen: true, freezeReason: 'Incident', requireNote: true, maintenanceWindows: [{ days: [1], start: '09:00', end: '10:00' }] } };
const now = new Date(2026, 6, 28, 12, 0); // Tuesday
assert.throws(() => evaluateDeploymentPolicy(profile, { now, note: 'Release' }), (error) => error.code === 'DEPLOYMENT_POLICY_BLOCKED');
assert.throws(() => evaluateDeploymentPolicy(profile, { now, note: 'Release', override: true }), /override reason/i);
const result = evaluateDeploymentPolicy(profile, { now, note: 'Release', override: true, reason: 'Emergency recovery' });
assert.equal(result.overridden, true);
assert.equal(result.violations.length, 2);
});
test('deployment policy accepts an in-window release with required note', () => {
const now = new Date(2026, 6, 27, 9, 30); // Monday
const profile = { deploymentPolicy: { requireNote: true, maintenanceWindows: [{ days: [1], start: '09:00', end: '10:00' }] } };
assert.equal(evaluateDeploymentPolicy(profile, { now, note: 'Version 1.2' }).allowed, true);
assert.throws(() => evaluateDeploymentPolicy(profile, { now }), /release note/i);
});
test('overnight maintenance windows continue into the following day', () => {
const profile = { deploymentPolicy: { maintenanceWindows: [{ days: [1], start: '22:00', end: '02:00' }] } };
assert.equal(evaluateDeploymentPolicy(profile, { now: new Date(2026, 6, 27, 23, 0) }).allowed, true);
assert.equal(evaluateDeploymentPolicy(profile, { now: new Date(2026, 6, 28, 1, 0) }).allowed, true);
assert.throws(() => evaluateDeploymentPolicy(profile, { now: new Date(2026, 6, 28, 3, 0) }), /outside/);
});