import { describe, it, expect, vi, type Mock } from 'vitest'; import { GetMediaUseCase } from './GetMediaUseCase'; import type { IMediaRepository } from '../../domain/repositories/IMediaRepository'; import type { IGetMediaPresenter } from '../presenters/IGetMediaPresenter'; import type { Logger } from '@core/shared/application'; import { Media } from '../../domain/entities/Media'; import { MediaUrl } from '../../domain/value-objects/MediaUrl'; interface TestPresenter extends IGetMediaPresenter { result?: any; } describe('GetMediaUseCase', () => { let mediaRepo: { findById: Mock; }; let logger: Logger; let presenter: TestPresenter; let useCase: GetMediaUseCase; beforeEach(() => { mediaRepo = { findById: vi.fn(), } as unknown as IMediaRepository as any; logger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), } as unknown as Logger; presenter = { present: vi.fn((result) => { presenter.result = result; }), } as unknown as TestPresenter; useCase = new GetMediaUseCase( mediaRepo as unknown as IMediaRepository, logger, ); }); it('presents error when media is not found', async () => { mediaRepo.findById.mockResolvedValue(null); await useCase.execute({ mediaId: 'missing' }, presenter); expect(mediaRepo.findById).toHaveBeenCalledWith('missing'); expect((presenter.present as unknown as Mock)).toHaveBeenCalledWith({ success: false, errorMessage: 'Media not found', }); }); it('presents media details when media exists', async () => { const media = Media.create({ id: 'media-1', filename: 'file.png', originalName: 'file.png', mimeType: 'image/png', size: 123, url: MediaUrl.create('https://example.com/file.png'), type: 'image', uploadedBy: 'user-1', }); mediaRepo.findById.mockResolvedValue(media); await useCase.execute({ mediaId: 'media-1' }, presenter); expect(mediaRepo.findById).toHaveBeenCalledWith('media-1'); expect((presenter.present as unknown as Mock)).toHaveBeenCalledWith({ success: true, media: { id: media.id, filename: media.filename, originalName: media.originalName, mimeType: media.mimeType, size: media.size, url: media.url.value, type: media.type, uploadedBy: media.uploadedBy, uploadedAt: media.uploadedAt, metadata: media.metadata, }, }); }); it('handles errors by logging and presenting failure', async () => { mediaRepo.findById.mockRejectedValue(new Error('DB error')); await useCase.execute({ mediaId: 'media-1' }, presenter); expect((logger.error as unknown as Mock)).toHaveBeenCalled(); expect((presenter.present as unknown as Mock)).toHaveBeenCalledWith({ success: false, errorMessage: 'Internal error occurred while retrieving media', }); }); });