@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
JavaScript
;
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