76 lines
2.5 KiB
JavaScript
76 lines
2.5 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import fs from 'node:fs';
|
|
import os from 'node:os';
|
|
import path from 'node:path';
|
|
import test from 'node:test';
|
|
import {
|
|
ensureRegisteredDatasetFromHtml,
|
|
inferInsertColumnsFromHtml,
|
|
} from './page-data-workspace-ensure.mjs';
|
|
import { evaluatePageDataFinishGuard } from './mindspace-page-data-finish-guard.mjs';
|
|
|
|
const HOMEWORK_HTML = `<!doctype html><html><head><title>作业</title></head><body>
|
|
<script src="/assets/page-data-client.js"></script>
|
|
<script>
|
|
MindSpacePageData.createClient({ apiBase: '/api' }).insertRow('homework_records', {
|
|
student_name: 'a',
|
|
record_date: '2026-07-12',
|
|
chinese: '已完成',
|
|
math: '已完成',
|
|
english: '已完成',
|
|
note: ''
|
|
});
|
|
</script></body></html>`;
|
|
|
|
test('inferInsertColumnsFromHtml parses insertRow object keys', () => {
|
|
const columns = inferInsertColumnsFromHtml(HOMEWORK_HTML, 'homework_records');
|
|
assert.deepEqual(columns, [
|
|
'student_name',
|
|
'record_date',
|
|
'chinese',
|
|
'math',
|
|
'english',
|
|
'note',
|
|
]);
|
|
});
|
|
|
|
test('ensureRegisteredDatasetFromHtml creates sqlite registry from html', async () => {
|
|
const workspaceRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'page-data-ensure-'));
|
|
try {
|
|
await ensureRegisteredDatasetFromHtml({
|
|
workspaceRoot,
|
|
html: HOMEWORK_HTML,
|
|
datasetName: 'homework_records',
|
|
});
|
|
const dbPath = path.join(workspaceRoot, '.mindspace', 'private-data.sqlite');
|
|
assert.ok(fs.existsSync(dbPath));
|
|
} finally {
|
|
fs.rmSync(workspaceRoot, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test('evaluatePageDataFinishGuard detects unbound homework html even when user only confirms', () => {
|
|
const publishDir = fs.mkdtempSync(path.join(os.tmpdir(), 'page-data-guard-homework-'));
|
|
try {
|
|
fs.mkdirSync(path.join(publishDir, 'public'), { recursive: true });
|
|
fs.writeFileSync(path.join(publishDir, 'public', 'homework.html'), HOMEWORK_HTML, 'utf8');
|
|
const evaluation = evaluatePageDataFinishGuard({
|
|
publishDir,
|
|
agentText: '确认发布',
|
|
messages: [{
|
|
createdAt: Date.now(),
|
|
content: [{
|
|
type: 'toolRequest',
|
|
toolCall: { value: { name: 'write_file', arguments: { path: 'public/homework.html' } } },
|
|
}],
|
|
}],
|
|
});
|
|
assert.equal(evaluation.pageDataIntent, false);
|
|
assert.equal(evaluation.structuralPageData, true);
|
|
assert.equal(evaluation.unboundFiles.length, 1);
|
|
assert.equal(evaluation.needsRepair, true);
|
|
} finally {
|
|
fs.rmSync(publishDir, { recursive: true, force: true });
|
|
}
|
|
});
|