feat(api): jobs routes (list/get/retry/delete, owner-only)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
53
tests/api/jobs.test.js
Normal file
53
tests/api/jobs.test.js
Normal file
@@ -0,0 +1,53 @@
|
||||
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
||||
import request from 'supertest';
|
||||
import { setup } from './helpers.js';
|
||||
import { stopBoss, waitForJob } from '../helpers/boss.js';
|
||||
import { pool } from '../../lib/db/pool.js';
|
||||
import * as queue from '../../lib/jobs/queue.js';
|
||||
import { registerWorkers } from '../../lib/jobs/index.js';
|
||||
|
||||
let app, ownerHeaders;
|
||||
beforeEach(async () => {
|
||||
({ app, ownerHeaders } = await setup());
|
||||
await queue.start();
|
||||
await registerWorkers();
|
||||
});
|
||||
afterEach(async () => { await stopBoss(); });
|
||||
|
||||
describe('jobs api', () => {
|
||||
it('GET /api/jobs returns recent jobs', async () => {
|
||||
const id = await queue.enqueue('echo', { ping: 7 });
|
||||
await waitForJob('echo', id);
|
||||
const res = await request(app).get('/api/jobs?limit=10').set(ownerHeaders);
|
||||
expect(res.status).toBe(200);
|
||||
expect(res.body.find(r => r.id === id)).toBeTruthy();
|
||||
});
|
||||
|
||||
it('GET /api/jobs/:id 404 on unknown', async () => {
|
||||
const res = await request(app)
|
||||
.get('/api/jobs/00000000-0000-0000-0000-000000000000')
|
||||
.set(ownerHeaders);
|
||||
expect(res.status).toBe(404);
|
||||
});
|
||||
|
||||
it('unauthenticated → 401', async () => {
|
||||
const res = await request(app).get('/api/jobs');
|
||||
expect(res.status).toBe(401);
|
||||
});
|
||||
|
||||
it('POST :id/retry resubmits a failed job', async () => {
|
||||
const id = await queue.enqueue('echo', { ping: 'r' });
|
||||
await waitForJob('echo', id);
|
||||
await pool.query(`UPDATE pgboss.job SET state='failed' WHERE id=$1`, [id]);
|
||||
const res = await request(app).post(`/api/jobs/${id}/retry`).set(ownerHeaders);
|
||||
expect(res.status).toBe(200);
|
||||
expect(res.body.state).toBe('retry');
|
||||
});
|
||||
|
||||
it('DELETE :id removes', async () => {
|
||||
const id = await queue.enqueue('echo', { ping: 'd' });
|
||||
await waitForJob('echo', id);
|
||||
const res = await request(app).delete(`/api/jobs/${id}`).set(ownerHeaders);
|
||||
expect(res.status).toBe(204);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user