Skip to content

Commit a555ea2

Browse files
committed
Add AdminPasscodeService tests
1 parent 001a8aa commit a555ea2

File tree

2 files changed

+91
-2
lines changed

2 files changed

+91
-2
lines changed

server/src/common/in-memory-storage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ export class InMemoryStorage {
3636
return value as T;
3737
}
3838

39-
deleteValue(key: string): void {
39+
deleteValue(key: string): boolean {
4040
const timeoutId = this.timeoutIds.get(key);
4141

4242
if (timeoutId) {
4343
clearTimeout(timeoutId);
4444
}
4545

46-
this.storage.delete(key);
46+
return this.storage.delete(key);
4747
}
4848

4949
destroy(): void {
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { PoolClient } from 'pg';
3+
4+
import { AdminService } from 'src/modules/entities/admin/admin.service';
5+
import { RandomService } from 'src/modules/random/random.service';
6+
import { ConfigurationService } from 'src/modules/configuration/configuration.service';
7+
8+
import { AdminPasscodeService } from './admin-passcode.service';
9+
10+
const MOCK_POOL_CLIENT = {} as PoolClient;
11+
const ADMIN_USER_ID = '1';
12+
const NON_ADMIN_USER_ID = '2';
13+
const RANDOM_STRING = 'random';
14+
const TTL = 1;
15+
16+
describe('Test AdminPasscodeService', () => {
17+
let testingModule: TestingModule;
18+
19+
beforeEach(async () => {
20+
testingModule = await Test.createTestingModule({
21+
providers: [AdminPasscodeService],
22+
})
23+
.useMocker((token) => {
24+
switch (token) {
25+
case AdminService:
26+
return {
27+
findUserById: async (client: unknown, userId: string) => {
28+
if (userId === ADMIN_USER_ID) {
29+
return {};
30+
}
31+
32+
return undefined;
33+
},
34+
};
35+
case RandomService:
36+
return {
37+
getString: () => RANDOM_STRING,
38+
};
39+
case ConfigurationService:
40+
return {
41+
adminPasscodeTTL: TTL,
42+
};
43+
}
44+
})
45+
.compile();
46+
});
47+
48+
it('returns passcode for bot admin', () => {
49+
const service = testingModule.get(AdminPasscodeService);
50+
51+
expect(service.getPasscode(MOCK_POOL_CLIENT, ADMIN_USER_ID)).resolves.toBe(
52+
RANDOM_STRING,
53+
);
54+
});
55+
56+
it('throws error if user is not admin', () => {
57+
const service = testingModule.get(AdminPasscodeService);
58+
59+
expect(
60+
service.getPasscode(MOCK_POOL_CLIENT, NON_ADMIN_USER_ID),
61+
).rejects.toBeInstanceOf(Error);
62+
});
63+
64+
it('returns userId for admin user and deletes stored passcode', async () => {
65+
const service = testingModule.get(AdminPasscodeService);
66+
67+
const passcode = await service.getPasscode(MOCK_POOL_CLIENT, ADMIN_USER_ID);
68+
const userId = await service.getUserId(MOCK_POOL_CLIENT, passcode);
69+
70+
expect(userId).toBe(ADMIN_USER_ID);
71+
expect(service['storage'].getValue(passcode)).toBe(undefined);
72+
});
73+
74+
it('drops passcode when TTL expires', async () => {
75+
jest.useFakeTimers();
76+
77+
const service = testingModule.get(AdminPasscodeService);
78+
79+
const passcode = await service.getPasscode(MOCK_POOL_CLIENT, ADMIN_USER_ID);
80+
81+
await jest.advanceTimersByTimeAsync(TTL * 1000 + 1);
82+
83+
expect(service.getUserId(MOCK_POOL_CLIENT, passcode)).resolves.toBe(
84+
undefined,
85+
);
86+
87+
jest.useRealTimers();
88+
});
89+
});

0 commit comments

Comments
 (0)