feat: Authenticated Shell: Header, Quick Tabs and Change Password
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user