68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
import { GenerateAvatarsMutation } from './GenerateAvatarsMutation';
|
|
import { OnboardingService } from '@/lib/services/onboarding/OnboardingService';
|
|
import { Result } from '@/lib/contracts/Result';
|
|
import { GenerateAvatarsViewDataBuilder } from '@/lib/builders/view-data/GenerateAvatarsViewDataBuilder';
|
|
|
|
// Mock dependencies
|
|
vi.mock('@/lib/services/onboarding/OnboardingService', () => {
|
|
return {
|
|
OnboardingService: vi.fn(),
|
|
};
|
|
});
|
|
|
|
vi.mock('@/lib/builders/view-data/GenerateAvatarsViewDataBuilder', () => ({
|
|
GenerateAvatarsViewDataBuilder: {
|
|
build: vi.fn(),
|
|
},
|
|
}));
|
|
|
|
vi.mock('@/lib/contracts/mutations/MutationError', () => ({
|
|
mapToMutationError: vi.fn((err) => err.type || 'unknown'),
|
|
}));
|
|
|
|
describe('GenerateAvatarsMutation', () => {
|
|
let mutation: GenerateAvatarsMutation;
|
|
let mockServiceInstance: any;
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
mutation = new GenerateAvatarsMutation();
|
|
mockServiceInstance = {
|
|
generateAvatars: vi.fn(),
|
|
};
|
|
// Use mockImplementation to return the instance
|
|
(OnboardingService as any).mockImplementation(function() {
|
|
return mockServiceInstance;
|
|
});
|
|
});
|
|
|
|
it('should return success result when service succeeds', async () => {
|
|
const input = { prompt: 'test prompt' };
|
|
const serviceOutput = { success: true, avatarUrls: ['url1'] };
|
|
const viewData = { success: true, avatarUrls: ['url1'], errorMessage: undefined };
|
|
|
|
mockServiceInstance.generateAvatars.mockResolvedValue(Result.ok(serviceOutput));
|
|
(GenerateAvatarsViewDataBuilder.build as any).mockReturnValue(viewData);
|
|
|
|
const result = await mutation.execute(input);
|
|
|
|
expect(result.isOk()).toBe(true);
|
|
expect(result.unwrap()).toEqual(viewData);
|
|
expect(mockServiceInstance.generateAvatars).toHaveBeenCalledWith(input);
|
|
expect(GenerateAvatarsViewDataBuilder.build).toHaveBeenCalledWith(serviceOutput);
|
|
});
|
|
|
|
it('should return error result when service fails', async () => {
|
|
const input = { prompt: 'test prompt' };
|
|
const domainError = { type: 'notImplemented', message: 'Not implemented' };
|
|
|
|
mockServiceInstance.generateAvatars.mockResolvedValue(Result.err(domainError));
|
|
|
|
const result = await mutation.execute(input);
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
expect(result.getError()).toBe('notImplemented');
|
|
});
|
|
});
|