// 已读取AGENTS.md import * as fs from 'fs'; import * as path from 'path'; /** * 第六十八批回归闸门:列表有界 + 高频查询索引 */ describe('第六十八批分页与索引闸门', () => { const rootDir = path.resolve(__dirname, '../../'); const repoCode = fs.readFileSync(path.join(rootDir, 'server/src/db/repository.ts'), 'utf-8'); const mysqlCode = fs.readFileSync(path.join(rootDir, 'server/src/db/mysql.ts'), 'utf-8'); it('大列表查询必须有上限(避免全表下发)', () => { expect(repoCode).toContain("sql += ' ORDER BY id ASC LIMIT 500'"); expect(repoCode).toContain("sql += ' ORDER BY is_top DESC, created_at DESC LIMIT 200'"); expect(repoCode).toContain("sql += ' ORDER BY created_at DESC LIMIT 200'"); // 管理端财务流水 expect(repoCode).toContain('LIMIT 500'); }); it('提供高频查询索引(幂等)', () => { expect(mysqlCode).toContain('idx_orders_buyer'); expect(mysqlCode).toContain('idx_orders_status_created'); expect(mysqlCode).toContain('idx_fin_user'); expect(mysqlCode).toContain('idx_users_phone'); expect(mysqlCode).toContain('idx_pr_order'); // 索引创建必须在所有建表之后,避免表不存在 const createIdx = mysqlCode.indexOf('const indexDefs'); const seedCall = mysqlCode.indexOf('await seedInitialDataIfEmpty(conn)'); expect(createIdx).toBeGreaterThan(-1); expect(seedCall).toBeGreaterThan(createIdx); }); it('expert_services 懒建表后补索引', () => { expect(repoCode).toContain('ALTER TABLE expert_services ADD INDEX idx_srv_expert'); }); });