Files

94 lines
2.6 KiB
JavaScript

const assert = require('node:assert/strict');
const { test } = require('node:test');
const {
createLocalApiTaskListRoute,
} = require('../dist/task/taskListRoute.js');
function task(taskId, overrides = {}) {
return {
projectId: 'prj_default',
taskId,
revision: 2,
name: `Task ${taskId}`,
description: 'secret-adjacent',
kind: 'command',
spec: { schema: 'qinglong/command@v1', config: { command: ['private'] } },
labels: { private: 'value' },
enabled: true,
mutationId: 'mutation-private',
contentDigest: 'digest-private',
createdAtMs: 10,
updatedAtMs: 20,
...overrides,
};
}
test('returns the shared bounded Project Task list projection', async () => {
const calls = [];
const route = createLocalApiTaskListRoute({
async listTaskDefinitions(query) {
calls.push(query);
return {
definitions: [task('task-a', { enabled: false })],
truncated: true,
next: { taskId: 'task-a' },
};
},
});
const response = await route.handle({
projectId: 'prj_default',
input: { limit: 1 },
});
assert.deepEqual(calls, [{ projectId: 'prj_default', limit: 1 }]);
assert.deepEqual(response, {
statusCode: 200,
body: {
tasks: [
{
taskId: 'task-a',
revision: 2,
name: 'Task task-a',
kind: 'command',
specSchema: 'qinglong/command@v1',
enabled: false,
updatedAtMs: 20,
},
],
hasMore: true,
next: { taskId: 'task-a' },
},
});
assert.equal(JSON.stringify(response).includes('secret-adjacent'), false);
assert.equal(JSON.stringify(response).includes('private'), false);
});
test('fails closed on cross-Project, malformed and unavailable pages', async () => {
for (const page of [
{
definitions: [task('task-a', { projectId: 'prj_other' })],
truncated: false,
},
{
definitions: [task('task-a', { kind: 'invented' })],
truncated: false,
},
]) {
const route = createLocalApiTaskListRoute({
async listTaskDefinitions() { return page; },
});
assert.deepEqual(
await route.handle({ projectId: 'prj_default', input: {} }),
{ statusCode: 503, body: { code: 'task_list_unavailable' } },
);
}
const unavailable = createLocalApiTaskListRoute({
async listTaskDefinitions() { throw new Error('offline'); },
});
assert.deepEqual(
await unavailable.handle({ projectId: 'prj_default', input: {} }),
{ statusCode: 503, body: { code: 'task_list_unavailable' } },
);
assert.throws(() => createLocalApiTaskListRoute({}), TypeError);
});