fix(data): 清理旧数据并保护服务端写入

This commit is contained in:
Script Generator
2026-07-02 09:30:50 +08:00
parent 28e0c6de19
commit 916bd17a48
38 changed files with 1346 additions and 194 deletions

View File

@@ -0,0 +1,78 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { filterMembersForList, getDisplayedAccountPassword, resolveLatestEditingMember } from './member-list';
import type { Department, Member } from './members';
const departments: Department[] = [
{ id: 'dept-1', name: '产品部', order: 1, createdAt: '2024-01-01' },
{ id: 'dept-2', name: '技术部', order: 2, createdAt: '2024-01-01' },
{ id: 'dept-2-1', name: '前端组', parentId: 'dept-2', order: 1, createdAt: '2024-01-01' },
];
function member(id: string, name: string, departmentId: string): Member {
return {
id,
name,
username: name.toLowerCase(),
departmentId,
roleId: 'role-dev',
phone: '',
email: '',
password: 'Ftb@2024',
createdAt: '2024-01-01',
};
}
test('filterMembersForList matches member name keywords within the selected department tree', () => {
const members = [
member('m-1', '张三', 'dept-1'),
member('m-2', '李四', 'dept-2-1'),
member('m-3', '李四方', 'dept-2'),
member('m-4', '王五', ''),
];
const result = filterMembersForList({
members,
departments,
activeDeptId: 'dept-2',
nameKeyword: '李四',
});
assert.deepEqual(result.map((item) => item.id), ['m-2', 'm-3']);
});
test('filterMembersForList keeps unassigned admin visible only in all members when searching by name', () => {
const members = [
member('m-8', '超级管理员', ''),
member('m-1', '张三', 'dept-1'),
];
const allResult = filterMembersForList({
members,
departments,
activeDeptId: null,
nameKeyword: '超级',
});
const deptResult = filterMembersForList({
members,
departments,
activeDeptId: 'dept-1',
nameKeyword: '超级',
});
assert.deepEqual(allResult.map((item) => item.id), ['m-8']);
assert.deepEqual(deptResult, []);
});
test('resolveLatestEditingMember uses the current member record for password display', () => {
const selected = member('m-1', '张三', 'dept-1');
const latest = { ...selected, password: 'New@2026' };
assert.equal(resolveLatestEditingMember(selected, [latest])?.password, 'New@2026');
});
test('getDisplayedAccountPassword shows the latest member password before generated fallback', () => {
assert.equal(getDisplayedAccountPassword(member('m-1', '张三', 'dept-1'), 'Generated@2026'), 'Ftb@2024');
assert.equal(getDisplayedAccountPassword(null, 'Generated@2026'), 'Generated@2026');
});