mirror of
https://github.com/Unleash/unleash.git
synced 2025-01-11 00:08:30 +01:00
2c826bdbba
## About the changes - `getActiveUsers` is using multiple stores, so it is refactored into read-model - Refactored Instance stats service into `features` to co-locate related code Closes https://linear.app/unleash/issue/UNL-230/active-users-prometheus ### Important files `src/lib/features/instance-stats/getActiveUsers.ts` ## Discussion points `getActiveUsers` is coded less _class-based_ then previous similar read-models. In one file instead of 3 (read-model interface, fake read model, sql read model). I find types and functions way more readable, but I'm ready to refactor it to interfaces and classes if consistency is more important.
50 lines
1.9 KiB
TypeScript
50 lines
1.9 KiB
TypeScript
import { createTestConfig } from '../../../test/config/test-config';
|
|
import { InstanceStatsService } from './instance-stats-service';
|
|
import createStores from '../../../test/fixtures/store';
|
|
import VersionService from '../../services/version-service';
|
|
import { createFakeGetActiveUsers } from './getActiveUsers';
|
|
|
|
let instanceStatsService: InstanceStatsService;
|
|
let versionService: VersionService;
|
|
|
|
beforeEach(() => {
|
|
const config = createTestConfig();
|
|
const stores = createStores();
|
|
versionService = new VersionService(stores, config);
|
|
instanceStatsService = new InstanceStatsService(
|
|
stores,
|
|
config,
|
|
versionService,
|
|
createFakeGetActiveUsers(),
|
|
);
|
|
|
|
jest.spyOn(instanceStatsService, 'refreshStatsSnapshot');
|
|
jest.spyOn(instanceStatsService, 'getStats');
|
|
|
|
// validate initial state without calls to these methods
|
|
expect(instanceStatsService.refreshStatsSnapshot).toBeCalledTimes(0);
|
|
expect(instanceStatsService.getStats).toBeCalledTimes(0);
|
|
});
|
|
|
|
test('get snapshot should not call getStats', async () => {
|
|
await instanceStatsService.refreshStatsSnapshot();
|
|
expect(instanceStatsService.getStats).toBeCalledTimes(1);
|
|
|
|
// subsequent calls to getStatsSnapshot don't call getStats
|
|
for (let i = 0; i < 3; i++) {
|
|
const stats = instanceStatsService.getStatsSnapshot();
|
|
expect(stats?.clientApps).toStrictEqual([
|
|
{ range: 'allTime', count: 0 },
|
|
{ range: '30d', count: 0 },
|
|
{ range: '7d', count: 0 },
|
|
]);
|
|
}
|
|
// after querying the stats snapshot no call to getStats should be issued
|
|
expect(instanceStatsService.getStats).toBeCalledTimes(1);
|
|
});
|
|
|
|
test('before the snapshot is refreshed we can still get the appCount', async () => {
|
|
expect(instanceStatsService.refreshStatsSnapshot).toBeCalledTimes(0);
|
|
expect(instanceStatsService.getAppCountSnapshot('7d')).toBeUndefined();
|
|
});
|