Add advanced Git and deployment workflows, secure backups and auditing, live Gitea integration, desktop notifications, connection validation, and the premium responsive UX refresh.
30 lines
1.9 KiB
JavaScript
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/);
|
|
});
|