diff --git a/src/cli.ts b/src/cli.ts index 8cc0853..4374d76 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -7070,7 +7070,7 @@ function buildScheduledQueue( return [...postItems, ...draftItems, ...broadcastItems]; } -async function enforceSchedulingFreezePolicy(options: { +export async function enforceSchedulingFreezePolicy(options: { operation: string; freezePolicyPath: string | undefined; cataloguePath: string | undefined; diff --git a/src/test/assurance/cli-scheduling.test.ts b/src/test/assurance/cli-scheduling.test.ts new file mode 100644 index 0000000..6724974 --- /dev/null +++ b/src/test/assurance/cli-scheduling.test.ts @@ -0,0 +1,39 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { enforceSchedulingFreezePolicy } from "../../cli.js"; +import * as policyModule from "../../policy/scheduling-freeze.js"; +import * as cliModule from "../../cli.js"; + +vi.mock("../../policy/scheduling-freeze.js", () => { + return { + evaluateSchedulingFreezePolicy: vi.fn(), + buildSchedulingFreezeBlockReport: vi.fn(), + }; +}); + +describe("enforceSchedulingFreezePolicy", () => { + let originalExitCode: number | undefined; + + beforeEach(() => { + vi.resetAllMocks(); + originalExitCode = process.exitCode; + }); + + afterEach(() => { + process.exitCode = originalExitCode; + }); + + it("should return true when missing schedule At and calendar limitations exist", async () => { + vi.mocked(policyModule.evaluateSchedulingFreezePolicy).mockResolvedValue({ allowed: true }); + + // Test the specific branch where options.candidate?.scheduledAt is falsy + // This happens when we provide a candidate but no scheduledAt + const result = await enforceSchedulingFreezePolicy({ + operation: "test-op", + freezePolicyPath: "path", // need to trigger the second part of the condition (options.cataloguePath || freezePath) + cataloguePath: undefined, + candidate: { sourceFile: "test" }, // missing schedule At + }); + + expect(result).toBe(true); + }); +});