Stop shipping hard-coded demo docs/projects into production builds, drop local mock items on authoritative empty server lists, and purge stale demo seed residue from localStorage on boot. Co-authored-by: Cursor <cursoragent@cursor.com>
91 lines
2.6 KiB
TypeScript
91 lines
2.6 KiB
TypeScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { mapServerProjectToProjectInfo, mergeProjectLists } from './projectAdapter';
|
|
import { Project } from '../types/projectWorkflow';
|
|
import { ProjectInfo } from '../types/workbench';
|
|
|
|
const catalog = [
|
|
{ id: 1, name: '系统管理员' },
|
|
{ id: 2, name: '张工' },
|
|
];
|
|
|
|
const serverProject: Project = {
|
|
id: 9001,
|
|
code: 'demo-9001',
|
|
name: '局域网演示项目',
|
|
status: 'active',
|
|
device_type: '超声设备',
|
|
intended_use: '跨机器一致性验证',
|
|
creator_user_id: 2,
|
|
active_workflow_key: 'main',
|
|
workflow_selection_version: 1,
|
|
created_at: '2026-09-11T08:00:00Z',
|
|
updated_at: '2026-09-11T08:00:00Z',
|
|
};
|
|
|
|
test('mapServerProjectToProjectInfo maps creator and preserves local members', () => {
|
|
const existing: ProjectInfo = {
|
|
id: 9001,
|
|
title: '旧标题',
|
|
deviceType: '旧类型',
|
|
creatorId: 2,
|
|
creatorName: '张工',
|
|
createdAt: '2026-09-10',
|
|
members: [
|
|
{
|
|
userId: 2,
|
|
userName: '张工',
|
|
role: 'creator',
|
|
status: 'active',
|
|
joinedAt: '2026-09-10',
|
|
},
|
|
{
|
|
userId: 3,
|
|
userName: '李主管',
|
|
role: 'reviewer',
|
|
status: 'active',
|
|
joinedAt: '2026-09-10',
|
|
},
|
|
],
|
|
};
|
|
|
|
const mapped = mapServerProjectToProjectInfo(serverProject, catalog, existing);
|
|
assert.equal(mapped.title, '局域网演示项目');
|
|
assert.equal(mapped.creatorName, '张工');
|
|
assert.equal(mapped.members.length, 2);
|
|
});
|
|
|
|
test('mergeProjectLists drops local-only demo seed projects by default', () => {
|
|
const localOnly: ProjectInfo = {
|
|
id: 5201,
|
|
title: 'NeuroPulse 演示',
|
|
deviceType: '超声',
|
|
creatorId: 2,
|
|
creatorName: '张工',
|
|
createdAt: '2026-09-08',
|
|
members: [],
|
|
};
|
|
const fromServer = mapServerProjectToProjectInfo(serverProject, catalog);
|
|
const merged = mergeProjectLists([localOnly], [fromServer]);
|
|
|
|
assert.equal(merged.length, 1);
|
|
assert.ok(!merged.some((p) => p.id === 5201));
|
|
assert.ok(merged.some((p) => p.id === 9001 && p.title === '局域网演示项目'));
|
|
});
|
|
|
|
test('mergeProjectLists can retain local-only demo when explicitly opted in', () => {
|
|
const localOnly: ProjectInfo = {
|
|
id: 5201,
|
|
title: 'NeuroPulse 演示',
|
|
deviceType: '超声',
|
|
creatorId: 2,
|
|
creatorName: '张工',
|
|
createdAt: '2026-09-08',
|
|
members: [],
|
|
};
|
|
const fromServer = mapServerProjectToProjectInfo(serverProject, catalog);
|
|
const merged = mergeProjectLists([localOnly], [fromServer], { dropLocalOnlyDemoSeeds: false });
|
|
assert.equal(merged.length, 2);
|
|
assert.ok(merged.some((p) => p.id === 5201));
|
|
});
|