87 lines
2.8 KiB
JavaScript
87 lines
2.8 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import {
|
|
conversationPackageVerifyInternals,
|
|
verifyConversationPackageManifest,
|
|
} from './mindspace-conversation-package-verify.mjs';
|
|
|
|
test('verifyConversationPackageManifest accepts readable urls and package storage objects', async () => {
|
|
const result = await verifyConversationPackageManifest(
|
|
{
|
|
packageId: 'cp_session-1',
|
|
userId: 'user-1',
|
|
sessionId: 'session-1',
|
|
storagePrefix: 'users/user-1/conversations/session-1',
|
|
artifacts: [
|
|
{
|
|
artifactId: 'ca_page',
|
|
kind: 'page',
|
|
canonicalUrl: '/api/mindspace/v1/pages/page-1/preview',
|
|
},
|
|
{
|
|
artifactId: 'ca_docx',
|
|
kind: 'docx',
|
|
storageKey: 'users/user-1/conversations/session-1/artifacts/ca_docx/report.docx',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
async statObject(key) {
|
|
return { key, exists: true };
|
|
},
|
|
},
|
|
);
|
|
|
|
assert.equal(result.ok, true);
|
|
assert.deepEqual(result.issues, []);
|
|
});
|
|
|
|
test('verifyConversationPackageManifest reports missing or unsafe artifact references', async () => {
|
|
const result = await verifyConversationPackageManifest(
|
|
{
|
|
packageId: 'cp_session-1',
|
|
userId: 'user-1',
|
|
sessionId: 'session-1',
|
|
storagePrefix: 'users/user-1/conversations/session-1',
|
|
artifacts: [
|
|
{ artifactId: 'ca_missing', kind: 'generated_file' },
|
|
{ artifactId: 'ca_missing', kind: 'generated_file', canonicalUrl: 'file:///tmp/secret.txt' },
|
|
{
|
|
artifactId: 'ca_escape',
|
|
kind: 'docx',
|
|
storageKey: 'users/user-1/other/session-1/report.docx',
|
|
},
|
|
{
|
|
artifactId: 'ca_gone',
|
|
kind: 'docx',
|
|
storageKey: 'users/user-1/conversations/session-1/report.docx',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
async statObject(key) {
|
|
return { key, exists: key !== 'users/user-1/conversations/session-1/report.docx' };
|
|
},
|
|
},
|
|
);
|
|
|
|
assert.equal(result.ok, false);
|
|
assert.deepEqual(
|
|
result.issues.map((item) => item.code),
|
|
[
|
|
'artifact_without_backing_reference',
|
|
'duplicate_artifact_id',
|
|
'invalid_canonical_url',
|
|
'storage_key_outside_package',
|
|
'missing_backing_object',
|
|
],
|
|
);
|
|
});
|
|
|
|
test('conversation package verify internals classify supported URLs', () => {
|
|
assert.equal(conversationPackageVerifyInternals.isReadableUrl('https://m.tkmind.cn/MindSpace/u/public/a.html'), true);
|
|
assert.equal(conversationPackageVerifyInternals.isReadableUrl('/api/mindspace/v1/assets/a/download'), true);
|
|
assert.equal(conversationPackageVerifyInternals.isReadableUrl('/MindSpace/u/public/a.html'), true);
|
|
assert.equal(conversationPackageVerifyInternals.isReadableUrl('file:///tmp/a.html'), false);
|
|
});
|