// 已读取AGENTS.md import * as fs from 'fs'; import * as path from 'path'; /** * 第八十五批:后台消息铃铛接真实待办聚合 + 清理空壳接口与空卡片。 */ describe('第八十五批后台待办消息闸门', () => { const root = path.resolve(__dirname, '../../'); const read = (p: string) => fs.readFileSync(path.join(root, p), 'utf-8'); const exists = (p: string) => fs.existsSync(path.join(root, p)); const indexCode = read('server/src/index.ts'); const repoCode = read('server/src/db/repository.ts'); const mysqlCode = read('server/src/db/mysql.ts'); const admin = 'admin/arco-design-pro-vite/src'; it('空壳接口已删除(无调用方)', () => { for (const m of [ "app.all('/api/user/save-info'", "app.all('/api/chat/list'", "app.all('/api/user/my-team/list'", "app.all('/api/user/latest-activity'", "app.all('/api/user/my-project/list'", ]) { expect(indexCode).not.toContain(m); } }); it('消息铃铛改为真实待办聚合,且需管理员鉴权', () => { expect(indexCode).toContain("app.post('/api/message/list', requireAdmin"); expect(indexCode).toContain("app.post('/api/message/read', requireAdmin"); expect(indexCode).toContain('buildAdminTodoItems'); for (const k of ['pending_orders', 'pending_audits', 'pending_withdrawals', 'pending_reports', 'pending_arbitrations']) { expect(indexCode).toContain(k); } }); it('待办已读状态持久化(数量增加会重新变未读)', () => { expect(mysqlCode).toContain('admin_message_reads'); expect(repoCode).toContain('async getAdminTodoReadCounts('); expect(repoCode).toContain('async markAdminTodosRead('); expect(repoCode).toContain('pendingOrdersCount'); }); it('后台移除空卡片与死函数', () => { for (const f of ['my-team.vue', 'latest-activity.vue', 'my-project.vue', 'latest-notification.vue']) { expect(exists(`${admin}/views/user/info/components/${f}`)).toBe(false); } expect(read(`${admin}/api/user-center.ts`)).not.toContain('queryMyTeamList'); expect(read(`${admin}/api/user-center.ts`)).not.toContain('queryLatestActivity'); expect(read(`${admin}/api/message.ts`)).not.toContain('queryChatList'); expect(read(`${admin}/views/user/info/index.vue`)).toContain('UserInfoHeader'); }); });