From 2e0f8bb383c9f5434a807db1d6c908f4b480e467 Mon Sep 17 00:00:00 2001 From: Jah-yee <166608075+Jah-yee@users.noreply.github.com> Date: Sun, 31 May 2026 23:16:00 +0800 Subject: [PATCH] test(cron): add focused tests for parseCronExpression Covers: - exact minute matching - wildcard fields (*) - step expressions (*/15) - range expressions (9-17) - list expressions (8,12,18) - invalid field count - empty expression Closes #2 --- src/utils/cron.test.ts | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/utils/cron.test.ts diff --git a/src/utils/cron.test.ts b/src/utils/cron.test.ts new file mode 100644 index 0000000..d104f07 --- /dev/null +++ b/src/utils/cron.test.ts @@ -0,0 +1,48 @@ +import { describe, it, expect } from "bun:test"; +import { parseCronExpression } from "./cron"; + +describe("parseCronExpression", () => { + it("parses exact minute matching", () => { + const result = parseCronExpression("30 9 * * 1-5"); + expect(result.minute).toEqual([30]); + expect(result.hour).toEqual([9]); + expect(result.dayOfWeek).toEqual([1, 2, 3, 4, 5]); + }); + + it("parses wildcard fields", () => { + const result = parseCronExpression("* * * * *"); + expect(result.minute).toEqual(Array.from({ length: 60 }, (_, i) => i)); + expect(result.hour).toEqual(Array.from({ length: 24 }, (_, i) => i)); + expect(result.dayOfMonth).toEqual(Array.from({ length: 31 }, (_, i) => i + 1)); + expect(result.month).toEqual(Array.from({ length: 12 }, (_, i) => i + 1)); + expect(result.dayOfWeek).toEqual(Array.from({ length: 7 }, (_, i) => i)); + }); + + it("parses step expressions", () => { + const result = parseCronExpression("*/15 * * * *"); + expect(result.minute).toEqual([0, 15, 30, 45]); + }); + + it("parses range expressions", () => { + const result = parseCronExpression("0 9-17 * * 1-5"); + expect(result.hour).toEqual([9, 10, 11, 12, 13, 14, 15, 16, 17]); + expect(result.dayOfWeek).toEqual([1, 2, 3, 4, 5]); + }); + + it("parses list expressions", () => { + const result = parseCronExpression("0 8,12,18 * * *"); + expect(result.hour).toEqual([8, 12, 18]); + }); + + it("throws on invalid field count", () => { + expect(() => parseCronExpression("30 9 * *")).toThrow( + "Invalid cron expression: expected 5 fields, got 4", + ); + }); + + it("throws on empty expression", () => { + expect(() => parseCronExpression("")).toThrow( + "Invalid cron expression: expected 5 fields, got 1", + ); + }); +});