54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
import { describe, it, expect, vi, type Mock } from 'vitest';
|
|
import { CreateAchievementUseCase, type IAchievementRepository } from './CreateAchievementUseCase';
|
|
import { Achievement } from '@core/identity/domain/entities/Achievement';
|
|
|
|
describe('CreateAchievementUseCase', () => {
|
|
let achievementRepository: {
|
|
save: Mock;
|
|
findById: Mock;
|
|
};
|
|
let useCase: CreateAchievementUseCase;
|
|
|
|
beforeEach(() => {
|
|
achievementRepository = {
|
|
save: vi.fn(),
|
|
findById: vi.fn(),
|
|
};
|
|
|
|
useCase = new CreateAchievementUseCase(achievementRepository as unknown as IAchievementRepository);
|
|
});
|
|
|
|
it('creates an achievement and persists it', async () => {
|
|
const props = {
|
|
id: 'achv-1',
|
|
name: 'First Win',
|
|
description: 'Awarded for winning your first race',
|
|
category: 'driver' as const,
|
|
rarity: 'common' as const,
|
|
iconUrl: 'https://example.com/icon.png',
|
|
points: 50,
|
|
requirements: [
|
|
{
|
|
type: 'wins',
|
|
value: 1,
|
|
operator: '>=',
|
|
},
|
|
],
|
|
isSecret: false,
|
|
};
|
|
|
|
achievementRepository.save.mockResolvedValue(undefined);
|
|
|
|
const result = await useCase.execute(props);
|
|
|
|
expect(result).toBeInstanceOf(Achievement);
|
|
expect(result.id).toBe(props.id);
|
|
expect(result.name).toBe(props.name);
|
|
expect(result.description).toBe(props.description);
|
|
expect(result.category).toBe(props.category);
|
|
expect(result.points).toBe(props.points);
|
|
expect(result.requirements).toHaveLength(1);
|
|
expect(achievementRepository.save).toHaveBeenCalledWith(result);
|
|
});
|
|
});
|