UNPKG

@sidequest/backend-test

Version:

@sidequest/backend-test is a test suite for backend implementations of Sidequest, a Node.js library for managing background jobs and distributed queues.

158 lines (153 loc) 7.2 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vitest = require('vitest'); var backend = require('./backend.cjs'); function defineClaimPendingJobTestSuite() { vitest.describe("claimPendingJob", () => { vitest.it("should claim a pending job and update its state", async () => { const twelve = new Date(); twelve.setUTCDate(12); twelve.setUTCMonth(12); twelve.setUTCFullYear(2012); // Insert a waiting job const job = { queue: "default", class: "TestJob", args: [{ foo: "bar" }], constructor_args: [{}], state: "waiting", script: "test.js", attempt: 0, max_attempts: 5, timeout: 10, available_at: twelve, unique_digest: "test", uniqueness_config: { type: "alive", }, }; const insertedJob = await backend.backend.createNewJob(job); const [claimedJob] = await backend.backend.claimPendingJob("default"); expect(claimedJob.queue).toBe(insertedJob.queue); expect(claimedJob.class).toBe(insertedJob.class); expect(claimedJob.args).toMatchObject(insertedJob.args); expect(claimedJob.constructor_args).toMatchObject(insertedJob.constructor_args); expect(claimedJob.available_at).toEqual(insertedJob.available_at); expect(claimedJob.inserted_at).toEqual(insertedJob.inserted_at); expect(claimedJob.script).toBe(insertedJob.script); expect(claimedJob.attempt).toBe(insertedJob.attempt); expect(claimedJob.max_attempts).toBe(insertedJob.max_attempts); expect(claimedJob.result).toBe(insertedJob.result); expect(claimedJob.errors).toBe(insertedJob.errors); expect(claimedJob.attempted_at).toBe(insertedJob.attempted_at); expect(claimedJob.completed_at).toBe(insertedJob.completed_at); expect(claimedJob.failed_at).toBe(insertedJob.failed_at); expect(claimedJob.canceled_at).toBe(insertedJob.canceled_at); expect(claimedJob.timeout).toBe(insertedJob.timeout); expect(claimedJob.unique_digest).toBe(insertedJob.unique_digest); expect(claimedJob.uniqueness_config).toMatchObject(insertedJob.uniqueness_config); // These should have changed expect(claimedJob.state).toBe("claimed"); expect(claimedJob.claimed_at).toEqual(expect.any(Date)); expect(claimedJob.claimed_by).toEqual(expect.any(String)); }); vitest.it("should not claim a job which is not in pending state", async () => { const job = { queue: "default", class: "TestJob", args: [{ foo: "bar" }], constructor_args: [{}], state: "waiting", script: "test.js", attempt: 0, max_attempts: 5, }; let insertedJob = await backend.backend.createNewJob(job); await backend.backend.updateJob({ ...insertedJob, state: "canceled" }); insertedJob = await backend.backend.createNewJob(job); await backend.backend.updateJob({ ...insertedJob, state: "claimed" }); insertedJob = await backend.backend.createNewJob(job); await backend.backend.updateJob({ ...insertedJob, state: "completed" }); insertedJob = await backend.backend.createNewJob(job); await backend.backend.updateJob({ ...insertedJob, state: "failed" }); insertedJob = await backend.backend.createNewJob(job); await backend.backend.updateJob({ ...insertedJob, state: "running" }); const [claimedJob] = await backend.backend.claimPendingJob("default"); expect(claimedJob).toBe(undefined); }); vitest.it("should not claim a job of a different queue", async () => { // Insert a new waiting job const job = { queue: "default", class: "TestJob", args: [{ foo: "bar" }], constructor_args: [{}], state: "waiting", script: "test.js", attempt: 0, max_attempts: 5, }; await backend.backend.createNewJob(job); await backend.backend.createNewJob({ ...job, queue: "default2" }); const claimedJobs = await backend.backend.claimPendingJob("default2", 2); expect(claimedJobs).toHaveLength(1); }); vitest.it("should claim multiple jobs", async () => { // Insert a new waiting job const job = { queue: "default", class: "TestJob", args: [{ foo: "bar" }], constructor_args: [{}], state: "waiting", script: "test.js", attempt: 0, max_attempts: 5, }; await backend.backend.createNewJob(job); await backend.backend.createNewJob(job); const claimedJobs = await backend.backend.claimPendingJob("default", 10); expect(claimedJobs).toHaveLength(2); }); vitest.it("should not claim a job from a non-existing queue", async () => { // Insert a new waiting job const job = { queue: "default", class: "TestJob", args: [{ foo: "bar" }], constructor_args: [{}], state: "waiting", script: "test.js", attempt: 0, max_attempts: 5, }; await backend.backend.createNewJob(job); await backend.backend.createNewJob(job); const claimedJobs = await backend.backend.claimPendingJob("does_not_exist", 10); expect(claimedJobs).toHaveLength(0); }); vitest.it("should claim only available jobs", async () => { // Insert a new waiting job const job = { queue: "default", class: "TestJob", args: [{ foo: "bar" }], constructor_args: [{}], state: "waiting", script: "test.js", attempt: 0, max_attempts: 5, }; await backend.backend.createNewJob(job); await backend.backend.createNewJob({ ...job, available_at: new Date(2150, 0, 1) }); const claimedJobs = await backend.backend.claimPendingJob("default", 10); expect(claimedJobs).toHaveLength(1); }); vitest.it("should not claim a job when not job is in the DB", async () => { const [claimedJob] = await backend.backend.claimPendingJob("default"); expect(claimedJob).toBe(undefined); }); }); } exports.default = defineClaimPendingJobTestSuite; //# sourceMappingURL=claimPendingJob.cjs.map