import { Kysely } from 'kysely'; import { AssetMediaStatus } from 'src/dtos/asset-media-response.dto'; import { AccessRepository } from 'src/repositories/access.repository'; import { AssetRepository } from 'src/repositories/asset.repository'; import { EventRepository } from 'src/repositories/event.repository'; import { JobRepository } from 'src/repositories/job.repository'; import { LoggingRepository } from 'src/repositories/logging.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; import { UserRepository } from 'src/repositories/user.repository'; import { DB } from 'src/schema'; import { AssetMediaService } from 'src/services/asset-media.service'; import { AssetService } from 'src/services/asset.service'; import { mediumFactory, newMediumService } from 'test/medium.factory'; import { factory } from 'test/small.factory'; import { getKyselyDB } from 'test/utils'; let defaultDatabase: Kysely; const setup = (db?: Kysely) => { return newMediumService(AssetMediaService, { database: db || defaultDatabase, real: [AccessRepository, AssetRepository, UserRepository], mock: [EventRepository, LoggingRepository, JobRepository, StorageRepository], }); }; beforeAll(async () => { defaultDatabase = await getKyselyDB(); }); describe(AssetService.name, () => { describe('uploadAsset', () => { it('should work', async () => { const { sut, ctx } = setup(); ctx.getMock(StorageRepository).utimes.mockResolvedValue(); ctx.getMock(EventRepository).emit.mockResolvedValue(); ctx.getMock(JobRepository).queue.mockResolvedValue(); const { user } = await ctx.newUser(); const { asset } = await ctx.newAsset({ ownerId: user.id }); await ctx.newExif({ assetId: asset.id, fileSizeInByte: 12_345 }); const auth = factory.auth({ user: { id: user.id } }); const file = mediumFactory.uploadFile(); await expect( sut.uploadAsset( auth, { deviceId: 'some-id', deviceAssetId: 'some-id', fileModifiedAt: new Date(), fileCreatedAt: new Date(), assetData: Buffer.from('some data'), }, file, ), ).resolves.toEqual({ id: expect.any(String), status: AssetMediaStatus.CREATED, }); expect(ctx.getMock(EventRepository).emit).toHaveBeenCalledWith('AssetCreate', { asset: expect.objectContaining({ deviceAssetId: 'some-id' }), }); }); it('should work with an empty metadata list', async () => { const { sut, ctx } = setup(); ctx.getMock(StorageRepository).utimes.mockResolvedValue(); ctx.getMock(EventRepository).emit.mockResolvedValue(); ctx.getMock(JobRepository).queue.mockResolvedValue(); const { user } = await ctx.newUser(); const { asset } = await ctx.newAsset({ ownerId: user.id }); await ctx.newExif({ assetId: asset.id, fileSizeInByte: 12_345 }); const auth = factory.auth({ user: { id: user.id } }); const file = mediumFactory.uploadFile(); await expect( sut.uploadAsset( auth, { deviceId: 'some-id', deviceAssetId: 'some-id', fileModifiedAt: new Date(), fileCreatedAt: new Date(), assetData: Buffer.from('some data'), metadata: [], }, file, ), ).resolves.toEqual({ id: expect.any(String), status: AssetMediaStatus.CREATED, }); }); }); });