import { UsersRankService } from '../../backend/src/modules/users/users-rank.service'; function buildMockManager(opts: { pointsByUser?: Map; usersAhead?: number }): any { const pointsByUser = opts.pointsByUser ?? new Map(); const usersAhead = opts.usersAhead ?? 0; const repo: any = { createQueryBuilder: jest.fn().mockImplementation((alias: string) => { const builder: any = {}; builder.select = jest.fn().mockReturnThis(); builder.addSelect = jest.fn().mockReturnThis(); builder.where = jest.fn().mockReturnThis(); builder.groupBy = jest.fn().mockReturnThis(); builder.having = jest.fn().mockReturnThis(); builder.getRawOne = jest.fn().mockImplementation(async () => { return { total: pointsByUser.get(alias === 's' ? '_self_' : '_self_') ?? 0 }; }); builder.getRawOneForUser = jest.fn().mockImplementation(async (userId: string) => { return { total: pointsByUser.get(userId) ?? 0 }; }); builder.getRawMany = jest.fn().mockImplementation(async () => { return Array.from({ length: usersAhead }, (_, i) => ({ userId: 'other_' + i })); }); return builder; }), }; // Wire the user's id into the "self" lookup. return { getRepository: () => ({ createQueryBuilder: () => { const b: any = {}; b.select = jest.fn().mockReturnThis(); b.addSelect = jest.fn().mockReturnThis(); b.where = jest.fn((q: string, p: any) => { b._userId = p?.userId; return b; }); b.groupBy = jest.fn().mockReturnThis(); b.having = jest.fn().mockReturnThis(); b.getRawOne = jest.fn().mockImplementation(async () => { return { total: pointsByUser.get(b._userId) ?? 0 }; }); b.getRawMany = jest.fn().mockImplementation(async () => { return Array.from({ length: usersAhead }, (_, i) => ({ userId: 'other_' + i })); }); return b; }, }), }; } describe('UsersRankService.rankOfUser', () => { it('returns null rank and 0 points for a user with no solves', async () => { const svc = new UsersRankService(); const r = await svc.rankOfUser(buildMockManager({}) as any, 'u1'); expect(r.rank).toBeNull(); expect(r.points).toBe(0); }); it('returns rank 1 when no users are ahead', async () => { const svc = new UsersRankService(); const r = await svc.rankOfUser(buildMockManager({ pointsByUser: new Map([['u1', 100]]), usersAhead: 0 }) as any, 'u1'); expect(r.rank).toBe(1); expect(r.points).toBe(100); }); it('returns rank = ahead+1', async () => { const svc = new UsersRankService(); const r = await svc.rankOfUser(buildMockManager({ pointsByUser: new Map([['u1', 100]]), usersAhead: 2 }) as any, 'u1'); expect(r.rank).toBe(3); expect(r.points).toBe(100); }); });