104 lines
3.4 KiB
TypeScript
104 lines
3.4 KiB
TypeScript
import { Result } from '@core/shared/domain/Result';
|
|
import { describe, expect, it, vi, type Mock } from 'vitest';
|
|
import type { MediaResolverPort } from '@core/ports/media/MediaResolverPort';
|
|
import { ResolveMediaReferenceUseCase } from './ResolveMediaReferenceUseCase';
|
|
|
|
describe('ResolveMediaReferenceUseCase', () => {
|
|
let mediaResolver: {
|
|
resolve: Mock;
|
|
};
|
|
let useCase: ResolveMediaReferenceUseCase;
|
|
|
|
beforeEach(() => {
|
|
mediaResolver = {
|
|
resolve: vi.fn(),
|
|
};
|
|
|
|
useCase = new ResolveMediaReferenceUseCase(
|
|
mediaResolver as unknown as MediaResolverPort,
|
|
);
|
|
});
|
|
|
|
it('returns resolved path when media reference is resolved', async () => {
|
|
mediaResolver.resolve.mockResolvedValue('/resolved/path/to/media.png');
|
|
|
|
const input = { reference: { type: 'team', id: 'team-123' } };
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(mediaResolver.resolve).toHaveBeenCalledWith({ type: 'team', id: 'team-123' });
|
|
expect(result.isOk()).toBe(true);
|
|
|
|
const successResult = result.unwrap();
|
|
expect(successResult).toBe('/resolved/path/to/media.png');
|
|
});
|
|
|
|
it('returns null when media reference resolves to null', async () => {
|
|
mediaResolver.resolve.mockResolvedValue(null);
|
|
|
|
const input = { reference: { type: 'team', id: 'team-123' } };
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(mediaResolver.resolve).toHaveBeenCalledWith({ type: 'team', id: 'team-123' });
|
|
expect(result.isOk()).toBe(true);
|
|
|
|
const successResult = result.unwrap();
|
|
expect(successResult).toBe(null);
|
|
});
|
|
|
|
it('returns empty string when media reference resolves to empty string', async () => {
|
|
mediaResolver.resolve.mockResolvedValue('');
|
|
|
|
const input = { reference: { type: 'team', id: 'team-123' } };
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(mediaResolver.resolve).toHaveBeenCalledWith({ type: 'team', id: 'team-123' });
|
|
expect(result.isOk()).toBe(true);
|
|
|
|
const successResult = result.unwrap();
|
|
expect(successResult).toBe('');
|
|
});
|
|
|
|
it('handles resolver errors by returning error', async () => {
|
|
mediaResolver.resolve.mockRejectedValue(new Error('Resolver error'));
|
|
|
|
const input = { reference: { type: 'team', id: 'team-123' } };
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
const err = result.unwrapErr();
|
|
expect(err.message).toBe('Resolver error');
|
|
});
|
|
|
|
it('handles non-Error exceptions by wrapping in Error', async () => {
|
|
mediaResolver.resolve.mockRejectedValue('string error');
|
|
|
|
const input = { reference: { type: 'team', id: 'team-123' } };
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(result.isErr()).toBe(true);
|
|
const err = result.unwrapErr();
|
|
expect(err.message).toBe('string error');
|
|
});
|
|
|
|
it('resolves different reference types', async () => {
|
|
const testCases = [
|
|
{ type: 'team', id: 'team-123' },
|
|
{ type: 'league', id: 'league-456' },
|
|
{ type: 'driver', id: 'driver-789' },
|
|
];
|
|
|
|
for (const reference of testCases) {
|
|
mediaResolver.resolve.mockResolvedValue(`/resolved/${reference.type}/${reference.id}.png`);
|
|
|
|
const input = { reference };
|
|
const result = await useCase.execute(input);
|
|
|
|
expect(mediaResolver.resolve).toHaveBeenCalledWith(reference);
|
|
expect(result.isOk()).toBe(true);
|
|
|
|
const successResult = result.unwrap();
|
|
expect(successResult).toBe(`/resolved/${reference.type}/${reference.id}.png`);
|
|
}
|
|
});
|
|
});
|