@@ -0,0 +1,35 @@
|
||||
// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
|
||||
// Module cron comes from the manifests (TM-R3): a module declares `schedules` beside its `jobs`, and
|
||||
// `apps/worker/src/schedules.ts` names no module, so adding one edits nothing under apps/.
|
||||
|
||||
import { readFileSync } from "node:fs"
|
||||
import { appModules } from "@app/modules"
|
||||
import { buildRegistry, defineModule } from "@conusai-kit/core"
|
||||
import { describe, expect, it } from "vitest"
|
||||
import { z } from "zod"
|
||||
import { appSchedules } from "../apps/worker/src/schedules.js"
|
||||
|
||||
describe("the worker's module cron", () => {
|
||||
it("is every schedule the manifests declare, each with its module's id", () => {
|
||||
const schedules = appSchedules({})
|
||||
expect(schedules.map((schedule) => schedule.module)).toEqual(expect.arrayContaining(["files", "account"]))
|
||||
const registry = buildRegistry([...appModules])
|
||||
for (const schedule of schedules) expect(registry.jobs[schedule.job]?.module).toBe(schedule.module)
|
||||
})
|
||||
|
||||
it("names no module in the scaffold's file", () => {
|
||||
const source = readFileSync(new URL("../apps/worker/src/schedules.ts", import.meta.url), "utf8")
|
||||
expect(source).not.toMatch(/@app\/modules\/|_SCHEDULES|defineSchedules/)
|
||||
})
|
||||
|
||||
it("refuses a schedule of a job the module does not declare, at boot", () => {
|
||||
const module = defineModule({
|
||||
id: "reports",
|
||||
version: "0.1.0",
|
||||
kit: "^0.1.0",
|
||||
jobs: { "reports.weekly": { payload: z.null(), handler: async () => undefined } },
|
||||
schedules: [{ job: "reports.nightly", cron: "0 2 * * *", scope: null }],
|
||||
})
|
||||
expect(() => buildRegistry([module])).toThrow(/reports\.nightly/)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user