From 590b92f19045d71aed74104263e2d6ca07cd838d Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Fri, 8 May 2026 12:04:22 +0200 Subject: [PATCH] feat(core-testing): RecordingJobQueue Adds RecordingJobQueue implementing IJobQueue for use in unit tests. Records all enqueue calls with taskSlug/input/options and returns synthetic incrementing jobIds. Co-Authored-By: Claude Sonnet 4.6 --- packages/core-testing/package.json | 1 + .../core-testing/src/instrumentation/index.ts | 1 + .../recording-job-queue.test.ts | 23 +++++++++++++++++++ .../instrumentation/recording-job-queue.ts | 14 +++++++++++ pnpm-lock.yaml | 3 +++ 5 files changed, 42 insertions(+) create mode 100644 packages/core-testing/src/instrumentation/recording-job-queue.test.ts create mode 100644 packages/core-testing/src/instrumentation/recording-job-queue.ts diff --git a/packages/core-testing/package.json b/packages/core-testing/package.json index 76cee9d..87b8599 100644 --- a/packages/core-testing/package.json +++ b/packages/core-testing/package.json @@ -21,6 +21,7 @@ "test": "vitest run" }, "dependencies": { + "@repo/core-shared": "workspace:*", "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.0", diff --git a/packages/core-testing/src/instrumentation/index.ts b/packages/core-testing/src/instrumentation/index.ts index 6d50b93..cd045e9 100644 --- a/packages/core-testing/src/instrumentation/index.ts +++ b/packages/core-testing/src/instrumentation/index.ts @@ -1,2 +1,3 @@ export { RecordingTracer, type RecordedSpan } from "./recording-tracer"; export { RecordingLogger, type RecordedCapture } from "./recording-logger"; +export { RecordingJobQueue } from "./recording-job-queue"; diff --git a/packages/core-testing/src/instrumentation/recording-job-queue.test.ts b/packages/core-testing/src/instrumentation/recording-job-queue.test.ts new file mode 100644 index 0000000..739530b --- /dev/null +++ b/packages/core-testing/src/instrumentation/recording-job-queue.test.ts @@ -0,0 +1,23 @@ +import { describe, it, expect } from "vitest"; +import { RecordingJobQueue } from "@/instrumentation/recording-job-queue"; + +describe("RecordingJobQueue", () => { + it("records every enqueue call", async () => { + const queue = new RecordingJobQueue(); + const future = new Date("2030-01-01"); + await queue.enqueue("a.task", { x: 1 }); + await queue.enqueue("b.task", { y: 2 }, { runAt: future }); + expect(queue.enqueued).toEqual([ + { taskSlug: "a.task", input: { x: 1 }, options: undefined }, + { taskSlug: "b.task", input: { y: 2 }, options: { runAt: future } }, + ]); + }); + + it("returns a synthetic jobId per call", async () => { + const queue = new RecordingJobQueue(); + const a = await queue.enqueue("a", {}); + const b = await queue.enqueue("b", {}); + expect(a.jobId).toBe("recording-1"); + expect(b.jobId).toBe("recording-2"); + }); +}); diff --git a/packages/core-testing/src/instrumentation/recording-job-queue.ts b/packages/core-testing/src/instrumentation/recording-job-queue.ts new file mode 100644 index 0000000..6a59a23 --- /dev/null +++ b/packages/core-testing/src/instrumentation/recording-job-queue.ts @@ -0,0 +1,14 @@ +import type { IJobQueue } from "@repo/core-shared/jobs"; + +export class RecordingJobQueue implements IJobQueue { + readonly enqueued: { taskSlug: string; input: unknown; options?: { runAt?: Date } }[] = []; + + async enqueue( + taskSlug: string, + input: T, + options?: { runAt?: Date }, + ): Promise<{ jobId: string }> { + this.enqueued.push({ taskSlug, input, options }); + return { jobId: `recording-${this.enqueued.length}` }; + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12bae23..9cf473f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -592,6 +592,9 @@ importers: packages/core-testing: dependencies: + '@repo/core-shared': + specifier: workspace:* + version: link:../core-shared '@tanstack/react-query': specifier: ^5.59.0 version: 5.96.2(react@19.2.4)