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 = `作业 `; 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 }); } });