Files
gridpilot.gg/core/social/application/use-cases/GetCurrentUserSocialUseCase.test.ts
2026-01-16 19:46:49 +01:00

120 lines
3.4 KiB
TypeScript

import { Driver } from '@core/racing/domain/entities/Driver';
import type { Logger } from '@core/shared/domain/Logger';
import { beforeEach, describe, expect, it, vi, type Mock } from 'vitest';
import { SocialGraphRepository } from '../../domain/repositories/SocialGraphRepository';
import {
GetCurrentUserSocialUseCase,
type GetCurrentUserSocialApplicationError,
type GetCurrentUserSocialInput,
} from './GetCurrentUserSocialUseCase';
describe('GetCurrentUserSocialUseCase', () => {
let socialGraphRepository: {
getFriends: Mock;
getFriendIds: Mock;
getSuggestedFriends: Mock;
};
let logger: {
debug: Mock;
info: Mock;
warn: Mock;
error: Mock;
};
let useCase: GetCurrentUserSocialUseCase;
beforeEach(() => {
socialGraphRepository = {
getFriends: vi.fn(),
getFriendIds: vi.fn(),
getSuggestedFriends: vi.fn(),
};
logger = {
debug: vi.fn(),
info: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
};
useCase = new GetCurrentUserSocialUseCase(
socialGraphRepository as unknown as SocialGraphRepository,
logger as unknown as Logger
);
});
it('returns current user social with mapped friends', async () => {
vi.useFakeTimers();
vi.setSystemTime(new Date('2025-01-01T00:00:00.000Z'));
const friends = [
Driver.create({
id: 'friend-1',
iracingId: '123',
name: 'Friend One',
country: 'US',
}),
];
socialGraphRepository.getFriends.mockResolvedValue(friends);
const input: GetCurrentUserSocialInput = { driverId: 'driver-1' };
const result = await useCase.execute(input);
expect(result.isOk()).toBe(true);
const socialResult = result.unwrap();
expect(socialResult.currentUser).toEqual({
driverId: 'driver-1',
displayName: '',
avatarUrl: '',
countryCode: '',
});
expect(socialResult.friends).toHaveLength(1);
expect(socialResult.friends[0]).toEqual({
driverId: 'friend-1',
displayName: 'Friend One',
avatarUrl: '',
countryCode: '',
isOnline: false,
lastSeen: new Date('2025-01-01T00:00:00.000Z'),
});
expect(logger.warn).not.toHaveBeenCalled();
vi.useRealTimers();
});
it('returns empty friends list when no friends exist', async () => {
socialGraphRepository.getFriends.mockResolvedValue([]);
const input: GetCurrentUserSocialInput = { driverId: 'driver-1' };
const result = await useCase.execute(input);
expect(result.isOk()).toBe(true);
const socialResult = result.unwrap();
expect(socialResult.friends).toEqual([]);
expect(socialResult.currentUser.driverId).toBe('driver-1');
expect(logger.warn).toHaveBeenCalledTimes(1);
expect((logger.warn as Mock).mock.calls[0]![0]).toBe(
'GetCurrentUserSocialUseCase.execute: No friends found for driverId: driver-1',
);
});
it('returns REPOSITORY_ERROR when repository throws', async () => {
socialGraphRepository.getFriends.mockRejectedValue(new Error('DB error'));
const input: GetCurrentUserSocialInput = { driverId: 'driver-1' };
const result = await useCase.execute(input);
expect(result.isErr()).toBe(true);
const err = result.unwrapErr() as GetCurrentUserSocialApplicationError;
expect(err.code).toBe('REPOSITORY_ERROR');
expect(err.details.message).toBe('DB error');
expect(logger.error).toHaveBeenCalledTimes(1);
});
});