Files
HIPCTF2/tests/backend/rank-points.spec.ts
T

73 lines
2.8 KiB
TypeScript

import { UsersRankService } from '../../backend/src/modules/users/users-rank.service';
function buildMockManager(opts: { pointsByUser?: Map<string, number>; 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);
});
});