import { CrmRadarService } from '../../../src/modules/crm/service/radar'; describe('性能与防 OOM: 雷达国家分布与时段统计原生 SQL 聚合机制', () => { let radarService: CrmRadarService; let mockQb: any; let mockTrackRepo: any; beforeEach(() => { mockQb = { select: jest.fn().mockReturnThis(), addSelect: jest.fn().mockReturnThis(), groupBy: jest.fn().mockReturnThis(), where: jest.fn().mockReturnThis(), getRawMany: jest.fn().mockResolvedValue([ { country: 'United Arab Emirates', visitorCount: '30', avgStayDurationMs: '45000' }, { country: 'Germany', visitorCount: '20', avgStayDurationMs: '30000' }, { country: 'United States', visitorCount: '10', avgStayDurationMs: '20000' }, ]), }; mockTrackRepo = { createQueryBuilder: jest.fn().mockReturnValue(mockQb), find: jest.fn(), }; radarService = new CrmRadarService(); radarService.crmTrackEntity = mockTrackRepo; }); it('getCountryDistribution 必须使用 createQueryBuilder 原生 GROUP BY 聚合,严禁全表 find 加载至内存', async () => { const result = await radarService.getCountryDistribution(101); expect(mockTrackRepo.createQueryBuilder).toHaveBeenCalledWith('track'); expect(mockQb.select).toHaveBeenCalled(); expect(mockQb.groupBy).toHaveBeenCalled(); expect(mockQb.where).toHaveBeenCalledWith('track.card_id = :cardId', { cardId: 101 }); expect(mockTrackRepo.find).not.toHaveBeenCalled(); expect(result).toHaveLength(3); expect(result[0].country).toBe('United Arab Emirates'); expect(result[0].visitorCount).toBe(30); expect(result[0].percentage).toBe(50); // 30 / 60 * 100 expect(result[0].avgStayDurationMs).toBe(45000); }); });