Mirror of https://github.com/roostorg/coop
github.com/roostorg/coop
1import { Kysely, type DatabaseConnection } from 'kysely';
2
3import { makeMockWarehouseDialect } from '../../test/stubs/makeMockWarehouseKyselyDialect.js';
4import {
5 makeMockPgDialect,
6 type MockPgExecute,
7} from '../../test/stubs/KyselyPg.js';
8import { type UserStatisticsServiceWarehouse } from './dbTypes.js';
9import { type makeFetchUserActionStatistics } from './fetchUserActionStatistics.js';
10import { type makeFetchUserSubmissionStatistics } from './fetchUserSubmissionStatistics.js';
11import { internalMakeUserStatisticsService } from './userStatisticsService.js';
12
13describe('UserStatisticsService', () => {
14 describe('refreshUserScoresCache', () => {
15 test.todo('should fetch stats w/ batching and update accordingly');
16
17 test('is a no-op without warehouse change streams', async () => {
18 const warehouseMock = jest
19 .fn<DatabaseConnection['executeQuery']>()
20 .mockImplementation(async (_query) => {
21 return { rows: [] };
22 });
23
24 const pgReadMock = jest
25 .fn<MockPgExecute>()
26 .mockResolvedValue({ rows: [], command: 'SELECT', rowCount: 0 });
27
28 const pgWriteMock = jest
29 .fn<MockPgExecute>()
30 .mockResolvedValue({ rows: [], command: 'SELECT', rowCount: 0 });
31
32 const fetchUserActionStatisticsMock = jest
33 .fn<ReturnType<typeof makeFetchUserActionStatistics>>()
34 .mockResolvedValue([]);
35
36 const fetchUserSubmissionStatisticsMock = jest
37 .fn<ReturnType<typeof makeFetchUserSubmissionStatistics>>()
38 .mockResolvedValue([]);
39
40 const warehouseKysely = new Kysely<UserStatisticsServiceWarehouse>({
41 dialect: makeMockWarehouseDialect(warehouseMock),
42 });
43
44 const sut = internalMakeUserStatisticsService(
45 new Kysely({ dialect: makeMockPgDialect(pgWriteMock) }),
46 new Kysely({ dialect: makeMockPgDialect(pgReadMock) }),
47 warehouseKysely,
48 fetchUserActionStatisticsMock,
49 fetchUserSubmissionStatisticsMock,
50 );
51
52 await sut.refreshUserScoresCache(async () => []);
53
54 expect(pgWriteMock).not.toHaveBeenCalled();
55 expect(warehouseMock).not.toHaveBeenCalled();
56 expect(fetchUserActionStatisticsMock).not.toHaveBeenCalled();
57 expect(fetchUserSubmissionStatisticsMock).not.toHaveBeenCalled();
58 });
59 });
60});