feat(dataset): 补全样本原文与删除操作
This commit is contained in:
@@ -15,6 +15,7 @@ const apiPath = path.join(root, 'src/api/modules/dataset.ts')
|
||||
const adapterPath = path.join(root, 'src/mock/adapter.ts')
|
||||
const mockPath = path.join(root, 'src/mock/data.ts')
|
||||
const recordsPath = path.join(root, 'src/views/dataset/datasetRecords.ts')
|
||||
const recordEditorPath = path.join(root, 'src/views/dataset/preview/useDatasetRecordEditor.ts')
|
||||
const versionsPath = path.join(root, 'src/mock/datasetVersions.ts')
|
||||
const source = fs.readFileSync(previewPath, 'utf8')
|
||||
const previewLogicSource = source.slice(0, source.indexOf('<style'))
|
||||
@@ -27,11 +28,12 @@ const apiSource = fs.readFileSync(apiPath, 'utf8')
|
||||
const adapterSource = fs.readFileSync(adapterPath, 'utf8')
|
||||
const mockSource = fs.readFileSync(mockPath, 'utf8')
|
||||
const recordsSource = fs.readFileSync(recordsPath, 'utf8')
|
||||
const recordEditorSource = fs.readFileSync(recordEditorPath, 'utf8')
|
||||
const versionsSource = fs.readFileSync(versionsPath, 'utf8')
|
||||
const recordsModuleCode = ts.transpileModule(recordsSource, {
|
||||
compilerOptions: { module: ts.ModuleKind.ESNext, target: ts.ScriptTarget.ES2022 },
|
||||
}).outputText
|
||||
const { parseDatasetRecords, updateDatasetRecord } = await import(
|
||||
const { deleteDatasetRecord, parseDatasetRecords, updateDatasetRecord } = await import(
|
||||
`data:text/javascript;base64,${Buffer.from(recordsModuleCode).toString('base64')}`
|
||||
)
|
||||
const versionsModuleCode = ts.transpileModule(versionsSource, {
|
||||
@@ -65,6 +67,12 @@ expect(previewSurfaceSource.includes('class="record-table"'), '样本数据应
|
||||
expect(previewSurfaceSource.includes('fixed="right"'), '逐条编辑操作列应固定在表格右侧')
|
||||
expect(previewSurfaceSource.includes('v-for="fieldKey in tableFieldKeys"'), '企业表格应根据数据结构动态生成字段列')
|
||||
expect(previewSurfaceSource.includes("emit('edit', asDatasetRecord(row))"), '每条样本应向主页面发送编辑事件')
|
||||
expect(previewSurfaceSource.includes("emit('delete', asDatasetRecord(row))"), '每条样本应提供删除操作')
|
||||
expect(previewSurfaceSource.includes('label="原文参照"'), '样本列表应展示生成内容对应的原文参照')
|
||||
expect(source.includes('getDatasetFileRecordSources'), '详情页应从后端读取发布样本的真实原文')
|
||||
expect(recordEditorSource.includes('deleteDatasetRecord('), '删除样本应只修改当前文件草稿')
|
||||
expect(recordEditorSource.includes('删除后将暂存到当前草稿'), '删除样本前应说明保存版本后才生效')
|
||||
expect(source.includes('selectedFileSize'), '详情文件大小也应统一显示为 MB')
|
||||
expect(previewSurfaceSource.includes('暂存修改'), '单条编辑应先暂存到当前页面')
|
||||
expect(source.includes('hasPendingVersionChanges && isViewingActiveVersion'), '存在暂存修改时才应显示保存版本按钮')
|
||||
expect(source.includes('保存版本'), '文件工具栏应提供保存版本按钮')
|
||||
@@ -85,10 +93,10 @@ expect(source.includes('hasUnsavedChanges'), '在线编辑器应跟踪未保存
|
||||
expect(source.includes('onBeforeRouteLeave'), '离开页面时应保护未保存修改')
|
||||
expect(previewSurfaceSource.includes("event.key.toLowerCase() === 's'"), '在线编辑器应支持快捷键保存')
|
||||
expect(source.includes('loadVersions(selectedFile)'), '版本内容加载失败后应支持重新加载')
|
||||
expect(source.includes('function resetRecordEditor()'), '主页面应提供统一的编辑器状态清理函数')
|
||||
const resetEditorStart = source.indexOf('function resetRecordEditor()')
|
||||
const updateFieldStart = source.indexOf('function updateEditField', resetEditorStart)
|
||||
const resetEditorSource = source.slice(resetEditorStart, updateFieldStart)
|
||||
expect(recordEditorSource.includes('function resetRecordEditor()'), '编辑器逻辑应提供统一的状态清理函数')
|
||||
const resetEditorStart = recordEditorSource.indexOf('function resetRecordEditor()')
|
||||
const updateFieldStart = recordEditorSource.indexOf('function openRecordEditor', resetEditorStart)
|
||||
const resetEditorSource = recordEditorSource.slice(resetEditorStart, updateFieldStart)
|
||||
for (const marker of [
|
||||
'editorVisible.value = false',
|
||||
'editingRecord.value = null',
|
||||
@@ -141,6 +149,9 @@ const afterLines = updated.split('\n')
|
||||
expect(afterLines[0] === beforeLines[0] && afterLines[1] === '', '单条保存不得改写其他样本或空行')
|
||||
expect(JSON.parse(afterLines[2]).instruction === '第二条已修改', '单条保存应准确更新目标样本')
|
||||
expect(Array.isArray(JSON.parse(afterLines[2]).output), '单条保存不应丢失数组等非字符串字段类型')
|
||||
const deleted = deleteDatasetRecord(updated, 'samples.jsonl', 2)
|
||||
expect(!deleted.includes('第二条已修改'), '删除样本应准确移除目标 JSONL 记录')
|
||||
expect(deleted.split('\n')[0] === beforeLines[0], '删除样本不得改写其他 JSONL 记录')
|
||||
const invalid = parseDatasetRecords('{invalid json}', 'samples.jsonl')
|
||||
expect(invalid.records[0].kind === 'invalid' && invalid.records[0].error, '非法 JSON 行应被单独标记并给出错误')
|
||||
const repairedJson = updateDatasetRecord('{invalid json}', 'samples.json', 0, { repaired: true })
|
||||
|
||||
Reference in New Issue
Block a user