From 9d172ac170a5be443bafbff719bfdce54c713cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Sat, 5 Sep 2026 00:26:09 +0800 Subject: [PATCH] =?UTF-8?q?task-209:=20=E5=AD=97=E6=AE=B5=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=20schema=20=E8=A6=86=E7=9B=96=E5=86=BB=E7=BB=93?= =?UTF-8?q?=EF=BC=88node=20--test=20=E6=89=AB=E6=8F=8F=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E5=B1=82=EF=BC=9Auser=5Fid/task=5Fids=20=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E3=80=81taskId/resultId/fileKey/status/taskStatus/fileStatus?= =?UTF-8?q?=20=E5=93=8D=E5=BA=94=E5=9D=87=E5=9C=A8=20schema=20=E8=A6=86?= =?UTF-8?q?=E7=9B=96=EF=BC=89+=208=20=E6=9D=A1=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/schema-field-coverage.test.ts | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 frontend-vue/tests/schema-field-coverage.test.ts diff --git a/frontend-vue/tests/schema-field-coverage.test.ts b/frontend-vue/tests/schema-field-coverage.test.ts new file mode 100644 index 00000000..36d37803 --- /dev/null +++ b/frontend-vue/tests/schema-field-coverage.test.ts @@ -0,0 +1,66 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +/** task-209:核心字段 schema 覆盖冻结(spec 13 §1)。请求 user_id/task_ids;响应 taskId/resultId/fileKey/status/taskStatus/fileStatus。 */ + +const SRC = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'src') + +function walk(dir: string): string[] { + const out: string[] = [] + for (const e of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, e.name) + if (e.isDirectory()) out.push(...walk(full)) + else if (e.name.endsWith('.ts') || e.name.endsWith('.vue')) out.push(full) + } + return out +} + +const FILES = walk(SRC) + +function occurrenceCount(needle: string): number { + return FILES.reduce((sum, f) => { + const text = fs.readFileSync(f, 'utf8') + return sum + (text.split(needle).length - 1) + }, 0) +} + +test('请求字段 user_id 覆盖', () => { + assert.ok(occurrenceCount('user_id') >= 1, 'user_id 应在共享层出现') +}) + +test('请求字段 task_ids 覆盖', () => { + assert.ok(occurrenceCount('task_ids') >= 1, 'task_ids 应在共享层出现') +}) + +test('响应字段 taskId 覆盖', () => { + assert.ok(occurrenceCount('taskId') >= 1, 'taskId 应在共享层出现') +}) + +test('响应字段 resultId 覆盖', () => { + assert.ok(occurrenceCount('resultId') >= 1, 'resultId 应在共享层出现') +}) + +test('响应字段 fileKey 覆盖', () => { + assert.ok(occurrenceCount('fileKey') >= 1, 'fileKey 应在共享层出现') +}) + +test('状态字段 status/taskStatus/fileStatus 覆盖', () => { + assert.ok(occurrenceCount('taskStatus') >= 1, 'taskStatus 应出现') + assert.ok(occurrenceCount('fileStatus') >= 1, 'fileStatus 应出现') + assert.ok(occurrenceCount('status') >= 10, 'status 应大量出现') +}) + +test('字段清单冻结(spec §1 集合)', () => { + const specFields = ['user_id', 'task_ids', 'taskId', 'resultId', 'fileKey', 'status', 'taskStatus', 'fileStatus'] + for (const f of specFields) { + assert.ok(occurrenceCount(f) >= 1, `spec 字段 ${f} 应被共享 schema 覆盖`) + } +}) + +test('覆盖审计可重复、稳定', () => { + assert.equal(occurrenceCount('taskId'), occurrenceCount('taskId')) + assert.equal(occurrenceCount('user_id'), occurrenceCount('user_id')) +})