refactor use cases

This commit is contained in:
2026-01-08 15:34:51 +01:00
parent d984ab24a8
commit 52e9a2f6a7
362 changed files with 5192 additions and 8409 deletions

View File

@@ -7,11 +7,12 @@ describe('MediaService', () => {
it('requestAvatarGeneration returns presenter response on success', async () => {
const requestAvatarGenerationPresenter = {
transform: vi.fn((result) => ({ success: true, requestId: result.requestId, avatarUrls: result.avatarUrls, errorMessage: '' })),
responseModel: { success: true, requestId: 'r1', avatarUrls: ['u1'], errorMessage: '' },
};
const requestAvatarGenerationUseCase = {
execute: vi.fn(async () => Result.ok(undefined)),
execute: vi.fn(async () => Result.ok({ requestId: 'r1', status: 'completed', avatarUrls: ['u1'] })),
};
const service = new MediaService(
@@ -39,6 +40,7 @@ describe('MediaService', () => {
facePhotoData: {} as any,
suitColor: 'red',
});
expect(requestAvatarGenerationPresenter.transform).toHaveBeenCalledWith({ requestId: 'r1', status: 'completed', avatarUrls: ['u1'] });
});
it('requestAvatarGeneration returns failure DTO on error', async () => {
@@ -69,8 +71,11 @@ describe('MediaService', () => {
});
it('uploadMedia returns presenter response on success', async () => {
const uploadMediaPresenter = { responseModel: { success: true, mediaId: 'm1' } };
const uploadMediaUseCase = { execute: vi.fn(async () => Result.ok(undefined)) };
const uploadMediaPresenter = {
transform: vi.fn((result) => ({ success: true, mediaId: result.mediaId })),
responseModel: { success: true, mediaId: 'm1' }
};
const uploadMediaUseCase = { execute: vi.fn(async () => Result.ok({ mediaId: 'm1', url: 'https://example.com/m1.png' })) };
const service = new MediaService(
{ execute: vi.fn() } as any,
@@ -100,10 +105,15 @@ describe('MediaService', () => {
uploadedBy: 'u1',
metadata: { a: 1 },
});
expect(uploadMediaPresenter.transform).toHaveBeenCalledWith({ mediaId: 'm1', url: 'https://example.com/m1.png' });
});
it('uploadMedia uses empty uploadedBy when userId missing', async () => {
const uploadMediaUseCase = { execute: vi.fn(async () => Result.ok(undefined)) };
const uploadMediaUseCase = { execute: vi.fn(async () => Result.ok({ mediaId: 'm1', url: 'https://example.com/m1.png' })) };
const uploadMediaPresenter = {
transform: vi.fn((result) => ({ success: true, mediaId: result.mediaId })),
responseModel: { success: true, mediaId: 'm1' }
};
const service = new MediaService(
{ execute: vi.fn() } as any,
@@ -114,7 +124,7 @@ describe('MediaService', () => {
{ execute: vi.fn() } as any,
logger as any,
{ responseModel: {} } as any,
{ responseModel: { success: true, mediaId: 'm1' } } as any,
uploadMediaPresenter as any,
{ responseModel: {} } as any,
{ responseModel: {} } as any,
{ responseModel: {} } as any,
@@ -123,6 +133,7 @@ describe('MediaService', () => {
await expect(service.uploadMedia({ file: {} as any } as any)).resolves.toEqual({ success: true, mediaId: 'm1' });
expect(uploadMediaUseCase.execute).toHaveBeenCalledWith({ file: {} as any, uploadedBy: '', metadata: {} });
expect(uploadMediaPresenter.transform).toHaveBeenCalledWith({ mediaId: 'm1', url: 'https://example.com/m1.png' });
});
it('uploadMedia returns failure DTO on error', async () => {
@@ -153,8 +164,12 @@ describe('MediaService', () => {
});
it('getMedia returns presenter response on success', async () => {
const getMediaUseCase = { execute: vi.fn(async () => Result.ok(undefined)) };
const getMediaPresenter = { responseModel: { mediaId: 'm1' } };
const uploadedAt = new Date();
const getMediaUseCase = { execute: vi.fn(async () => Result.ok({ media: { id: 'm1', filename: 'test.png', originalName: 'test.png', mimeType: 'image/png', size: 100, url: 'https://example.com/m1.png', type: 'image', uploadedBy: 'u1', uploadedAt } })) };
const getMediaPresenter = {
transform: vi.fn((result) => ({ id: result.media.id, url: result.media.url, type: result.media.type, uploadedAt: result.media.uploadedAt, size: result.media.size })),
responseModel: { id: 'm1', url: 'https://example.com/m1.png', type: 'image', uploadedAt, size: 100 }
};
const service = new MediaService(
{ execute: vi.fn() } as any,
@@ -172,8 +187,10 @@ describe('MediaService', () => {
{ responseModel: {} } as any,
);
await expect(service.getMedia('m1')).resolves.toEqual({ mediaId: 'm1' });
const result = await service.getMedia('m1');
expect(result).toEqual({ id: 'm1', url: 'https://example.com/m1.png', type: 'image', uploadedAt, size: 100 });
expect(getMediaUseCase.execute).toHaveBeenCalledWith({ mediaId: 'm1' });
expect(getMediaPresenter.transform).toHaveBeenCalledWith({ media: { id: 'm1', filename: 'test.png', originalName: 'test.png', mimeType: 'image/png', size: 100, url: 'https://example.com/m1.png', type: 'image', uploadedBy: 'u1', uploadedAt } });
});
it('getMedia returns null on MEDIA_NOT_FOUND', async () => {
@@ -217,8 +234,11 @@ describe('MediaService', () => {
});
it('deleteMedia returns presenter response on success', async () => {
const deleteMediaUseCase = { execute: vi.fn(async () => Result.ok(undefined)) };
const deleteMediaPresenter = { responseModel: { success: true } };
const deleteMediaUseCase = { execute: vi.fn(async () => Result.ok({ mediaId: 'm1', deleted: true })) };
const deleteMediaPresenter = {
transform: vi.fn((result) => ({ success: result.deleted })),
responseModel: { success: true }
};
const service = new MediaService(
{ execute: vi.fn() } as any,
@@ -238,6 +258,7 @@ describe('MediaService', () => {
await expect(service.deleteMedia('m1')).resolves.toEqual({ success: true });
expect(deleteMediaUseCase.execute).toHaveBeenCalledWith({ mediaId: 'm1' });
expect(deleteMediaPresenter.transform).toHaveBeenCalledWith({ mediaId: 'm1', deleted: true });
});
it('deleteMedia returns failure DTO on error', async () => {
@@ -261,8 +282,12 @@ describe('MediaService', () => {
});
it('getAvatar returns presenter response on success', async () => {
const getAvatarUseCase = { execute: vi.fn(async () => Result.ok(undefined)) };
const getAvatarPresenter = { responseModel: { avatarUrl: 'u1' } };
const selectedAt = new Date();
const getAvatarUseCase = { execute: vi.fn(async () => Result.ok({ avatar: { id: 'a1', driverId: 'd1', mediaUrl: 'https://example.com/avatar.png', selectedAt } })) };
const getAvatarPresenter = {
transform: vi.fn((result) => ({ avatarUrl: result.avatar.mediaUrl })),
responseModel: { avatarUrl: 'https://example.com/avatar.png' }
};
const service = new MediaService(
{ execute: vi.fn() } as any,
@@ -280,8 +305,9 @@ describe('MediaService', () => {
{ responseModel: {} } as any,
);
await expect(service.getAvatar('d1')).resolves.toEqual({ avatarUrl: 'u1' });
await expect(service.getAvatar('d1')).resolves.toEqual({ avatarUrl: 'https://example.com/avatar.png' });
expect(getAvatarUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1' });
expect(getAvatarPresenter.transform).toHaveBeenCalledWith({ avatar: { id: 'a1', driverId: 'd1', mediaUrl: 'https://example.com/avatar.png', selectedAt } });
});
it('getAvatar returns null on AVATAR_NOT_FOUND', async () => {
@@ -325,8 +351,11 @@ describe('MediaService', () => {
});
it('updateAvatar returns presenter response on success', async () => {
const updateAvatarUseCase = { execute: vi.fn(async () => Result.ok(undefined)) };
const updateAvatarPresenter = { responseModel: { success: true } };
const updateAvatarUseCase = { execute: vi.fn(async () => Result.ok({ avatarId: 'a1', driverId: 'd1' })) };
const updateAvatarPresenter = {
transform: vi.fn(() => ({ success: true })),
responseModel: { success: true }
};
const service = new MediaService(
{ execute: vi.fn() } as any,
@@ -346,6 +375,7 @@ describe('MediaService', () => {
await expect(service.updateAvatar('d1', { avatarUrl: 'u1' } as any)).resolves.toEqual({ success: true });
expect(updateAvatarUseCase.execute).toHaveBeenCalledWith({ driverId: 'd1', mediaUrl: 'u1' });
expect(updateAvatarPresenter.transform).toHaveBeenCalledWith({ avatarId: 'a1', driverId: 'd1' });
});
it('updateAvatar returns failure DTO on error', async () => {
@@ -507,4 +537,4 @@ describe('MediaService', () => {
error: 'Failed to update avatar',
});
});
});
});