58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import type { Logger } from '@core/shared/domain';
|
|
import type { UserRating } from '@core/identity';
|
|
import { InMemoryUserRatingRepository } from './InMemoryUserRatingRepository';
|
|
|
|
describe('InMemoryUserRatingRepository', () => {
|
|
let repository: InMemoryUserRatingRepository;
|
|
let mockLogger: Logger;
|
|
|
|
const rating = (userId: string, driverValue: number, trustValue: number, canSteward: boolean): UserRating => {
|
|
return {
|
|
userId,
|
|
driver: { sampleSize: 10, value: driverValue },
|
|
trust: { sampleSize: 5, value: trustValue },
|
|
canBeSteward: () => canSteward,
|
|
getDriverTier: () => (driverValue >= 2400 ? 'elite' : 'rookie'),
|
|
} as unknown as UserRating;
|
|
};
|
|
|
|
beforeEach(() => {
|
|
mockLogger = {
|
|
debug: vi.fn(),
|
|
info: vi.fn(),
|
|
warn: vi.fn(),
|
|
error: vi.fn(),
|
|
} as unknown as Logger;
|
|
|
|
repository = new InMemoryUserRatingRepository(mockLogger);
|
|
repository.clear();
|
|
});
|
|
|
|
it('saves and finds ratings', async () => {
|
|
await repository.save(rating('u1', 2300, 50, false));
|
|
await repository.save(rating('u2', 2500, 70, true));
|
|
|
|
expect((await repository.findByUserId('u1'))?.userId).toBe('u1');
|
|
expect((await repository.findByUserIds(['u1', 'u2'])).length).toBe(2);
|
|
|
|
const topDrivers = await repository.getTopDrivers(1);
|
|
expect(topDrivers[0]?.userId).toBe('u2');
|
|
|
|
const topTrusted = await repository.getTopTrusted(1);
|
|
expect(topTrusted[0]?.userId).toBe('u2');
|
|
|
|
const stewards = await repository.getEligibleStewards();
|
|
expect(stewards.map(r => r.userId)).toEqual(['u2']);
|
|
|
|
const elite = await repository.findByDriverTier('elite');
|
|
expect(elite.map(r => r.userId)).toEqual(['u2']);
|
|
});
|
|
|
|
it('deletes ratings', async () => {
|
|
await repository.save(rating('u3', 2200, 10, false));
|
|
await repository.delete('u3');
|
|
expect(await repository.findByUserId('u3')).toBeNull();
|
|
});
|
|
});
|