feat(files): add v2 task and metadata workflows
This commit is contained in:
197
front/src/lib/background-tasks.test.ts
Normal file
197
front/src/lib/background-tasks.test.ts
Normal file
@@ -0,0 +1,197 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
|
||||
import {
|
||||
buildBackgroundTasksPath,
|
||||
cancelBackgroundTask,
|
||||
createMediaMetadataTask,
|
||||
getBackgroundTask,
|
||||
listBackgroundTasks,
|
||||
parseBackgroundTaskState,
|
||||
} from './background-tasks';
|
||||
|
||||
test('buildBackgroundTasksPath defaults to the first ten tasks', () => {
|
||||
assert.equal(buildBackgroundTasksPath(), '/tasks?page=0&size=10');
|
||||
});
|
||||
|
||||
test('listBackgroundTasks requests the v2 task list and unwraps the page payload', async () => {
|
||||
const originalFetch = globalThis.fetch;
|
||||
|
||||
try {
|
||||
let requestUrl = '';
|
||||
let requestMethod = '';
|
||||
globalThis.fetch = async (input, init) => {
|
||||
requestUrl = String(input);
|
||||
requestMethod = init?.method || 'GET';
|
||||
return new Response(
|
||||
JSON.stringify({
|
||||
code: 0,
|
||||
msg: 'success',
|
||||
data: {
|
||||
items: [
|
||||
{
|
||||
id: 1,
|
||||
type: 'MEDIA_META',
|
||||
status: 'QUEUED',
|
||||
userId: 7,
|
||||
publicStateJson: '{"fileId":1}',
|
||||
correlationId: 'corr-1',
|
||||
errorMessage: null,
|
||||
createdAt: '2026-04-09T10:00:00',
|
||||
updatedAt: '2026-04-09T10:00:00',
|
||||
finishedAt: null,
|
||||
},
|
||||
],
|
||||
total: 1,
|
||||
page: 0,
|
||||
size: 10,
|
||||
},
|
||||
}),
|
||||
{
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
const payload = await listBackgroundTasks();
|
||||
|
||||
assert.equal(requestUrl, '/api/v2/tasks?page=0&size=10');
|
||||
assert.equal(requestMethod, 'GET');
|
||||
assert.deepEqual(payload, {
|
||||
items: [
|
||||
{
|
||||
id: 1,
|
||||
type: 'MEDIA_META',
|
||||
status: 'QUEUED',
|
||||
userId: 7,
|
||||
publicStateJson: '{"fileId":1}',
|
||||
correlationId: 'corr-1',
|
||||
errorMessage: null,
|
||||
createdAt: '2026-04-09T10:00:00',
|
||||
updatedAt: '2026-04-09T10:00:00',
|
||||
finishedAt: null,
|
||||
},
|
||||
],
|
||||
total: 1,
|
||||
page: 0,
|
||||
size: 10,
|
||||
});
|
||||
} finally {
|
||||
globalThis.fetch = originalFetch;
|
||||
}
|
||||
});
|
||||
|
||||
test('getBackgroundTask and cancelBackgroundTask hit the task detail endpoints', async () => {
|
||||
const originalFetch = globalThis.fetch;
|
||||
|
||||
try {
|
||||
const calls: Array<{url: string; method: string}> = [];
|
||||
globalThis.fetch = async (input, init) => {
|
||||
calls.push({
|
||||
url: String(input),
|
||||
method: init?.method || 'GET',
|
||||
});
|
||||
return new Response(
|
||||
JSON.stringify({
|
||||
code: 0,
|
||||
msg: 'success',
|
||||
data: {
|
||||
id: 123,
|
||||
type: 'ARCHIVE',
|
||||
status: 'COMPLETED',
|
||||
userId: 7,
|
||||
publicStateJson: '{"worker":"noop"}',
|
||||
correlationId: null,
|
||||
errorMessage: null,
|
||||
createdAt: '2026-04-09T10:00:00',
|
||||
updatedAt: '2026-04-09T10:00:00',
|
||||
finishedAt: '2026-04-09T10:01:00',
|
||||
},
|
||||
}),
|
||||
{
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
await getBackgroundTask(123);
|
||||
await cancelBackgroundTask(123);
|
||||
|
||||
assert.deepEqual(calls, [
|
||||
{ url: '/api/v2/tasks/123', method: 'GET' },
|
||||
{ url: '/api/v2/tasks/123', method: 'DELETE' },
|
||||
]);
|
||||
} finally {
|
||||
globalThis.fetch = originalFetch;
|
||||
}
|
||||
});
|
||||
|
||||
test('createMediaMetadataTask sends the queued file task payload', async () => {
|
||||
const originalFetch = globalThis.fetch;
|
||||
|
||||
try {
|
||||
let requestUrl = '';
|
||||
let requestMethod = '';
|
||||
let requestBody = '';
|
||||
globalThis.fetch = async (input, init) => {
|
||||
requestUrl = String(input);
|
||||
requestMethod = init?.method || 'GET';
|
||||
requestBody = String(init?.body || '');
|
||||
return new Response(
|
||||
JSON.stringify({
|
||||
code: 0,
|
||||
msg: 'success',
|
||||
data: {
|
||||
id: 123,
|
||||
type: 'MEDIA_META',
|
||||
status: 'QUEUED',
|
||||
userId: 7,
|
||||
publicStateJson: '{"fileId":9}',
|
||||
correlationId: 'media-9',
|
||||
errorMessage: null,
|
||||
createdAt: '2026-04-09T10:00:00',
|
||||
updatedAt: '2026-04-09T10:00:00',
|
||||
finishedAt: null,
|
||||
},
|
||||
}),
|
||||
{
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
const payload = await createMediaMetadataTask({
|
||||
fileId: 9,
|
||||
path: '/docs/photo.png',
|
||||
correlationId: 'media-9',
|
||||
});
|
||||
|
||||
assert.equal(requestUrl, '/api/v2/tasks/media-metadata');
|
||||
assert.equal(requestMethod, 'POST');
|
||||
assert.deepEqual(JSON.parse(requestBody), {
|
||||
fileId: 9,
|
||||
path: '/docs/photo.png',
|
||||
correlationId: 'media-9',
|
||||
});
|
||||
assert.equal(payload.status, 'QUEUED');
|
||||
} finally {
|
||||
globalThis.fetch = originalFetch;
|
||||
}
|
||||
});
|
||||
|
||||
test('parseBackgroundTaskState handles valid and invalid JSON defensively', () => {
|
||||
assert.deepEqual(parseBackgroundTaskState(null), {});
|
||||
assert.deepEqual(parseBackgroundTaskState(''), {});
|
||||
assert.deepEqual(parseBackgroundTaskState('not-json'), {});
|
||||
assert.deepEqual(parseBackgroundTaskState('[]'), {});
|
||||
assert.deepEqual(parseBackgroundTaskState('{"worker":"media-metadata","fileId":9}'), {
|
||||
worker: 'media-metadata',
|
||||
fileId: 9,
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user