mirror of
https://github.com/immich-app/immich.git
synced 2026-04-03 07:42:00 -04:00
101 lines
3.5 KiB
TypeScript
101 lines
3.5 KiB
TypeScript
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<DB>;
|
|
|
|
const setup = (db?: Kysely<DB>) => {
|
|
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,
|
|
});
|
|
});
|
|
});
|
|
});
|