import { Kysely } from 'kysely'; import { AssetRepository } from 'src/repositories/asset.repository'; import { LoggingRepository } from 'src/repositories/logging.repository'; import { DB } from 'src/schema'; import { BaseService } from 'src/services/base.service'; import { newMediumService } from 'test/medium.factory'; import { getKyselyDB } from 'test/utils'; let defaultDatabase: Kysely; const setup = (db?: Kysely) => { const { ctx } = newMediumService(BaseService, { database: db || defaultDatabase, real: [], mock: [LoggingRepository], }); return { ctx, sut: ctx.get(AssetRepository) }; }; beforeAll(async () => { defaultDatabase = await getKyselyDB(); }); describe(AssetRepository.name, () => { describe('upsertExif', () => { it('should append to locked columns', async () => { const { ctx, sut } = setup(); const { user } = await ctx.newUser(); const { asset } = await ctx.newAsset({ ownerId: user.id }); await ctx.newExif({ assetId: asset.id, dateTimeOriginal: '2023-11-19T18:11:00', lockedProperties: ['dateTimeOriginal'], }); await expect( ctx.database .selectFrom('asset_exif') .select('lockedProperties') .where('assetId', '=', asset.id) .executeTakeFirstOrThrow(), ).resolves.toEqual({ lockedProperties: ['dateTimeOriginal'] }); await sut.upsertExif( { assetId: asset.id, lockedProperties: ['description'] }, { lockedPropertiesBehavior: 'append' }, ); await expect( ctx.database .selectFrom('asset_exif') .select('lockedProperties') .where('assetId', '=', asset.id) .executeTakeFirstOrThrow(), ).resolves.toEqual({ lockedProperties: ['description', 'dateTimeOriginal'] }); }); it('should deduplicate locked columns', async () => { const { ctx, sut } = setup(); const { user } = await ctx.newUser(); const { asset } = await ctx.newAsset({ ownerId: user.id }); await ctx.newExif({ assetId: asset.id, dateTimeOriginal: '2023-11-19T18:11:00', lockedProperties: ['dateTimeOriginal', 'description'], }); await expect( ctx.database .selectFrom('asset_exif') .select('lockedProperties') .where('assetId', '=', asset.id) .executeTakeFirstOrThrow(), ).resolves.toEqual({ lockedProperties: ['dateTimeOriginal', 'description'] }); await sut.upsertExif( { assetId: asset.id, lockedProperties: ['description'] }, { lockedPropertiesBehavior: 'append' }, ); await expect( ctx.database .selectFrom('asset_exif') .select('lockedProperties') .where('assetId', '=', asset.id) .executeTakeFirstOrThrow(), ).resolves.toEqual({ lockedProperties: ['description', 'dateTimeOriginal'] }); }); }); describe('unlockProperties', () => { it('should unlock one property', async () => { const { ctx, sut } = setup(); const { user } = await ctx.newUser(); const { asset } = await ctx.newAsset({ ownerId: user.id }); await ctx.newExif({ assetId: asset.id, dateTimeOriginal: '2023-11-19T18:11:00', lockedProperties: ['dateTimeOriginal', 'description'], }); await expect( ctx.database .selectFrom('asset_exif') .select('lockedProperties') .where('assetId', '=', asset.id) .executeTakeFirstOrThrow(), ).resolves.toEqual({ lockedProperties: ['dateTimeOriginal', 'description'] }); await sut.unlockProperties(asset.id, ['dateTimeOriginal']); await expect( ctx.database .selectFrom('asset_exif') .select('lockedProperties') .where('assetId', '=', asset.id) .executeTakeFirstOrThrow(), ).resolves.toEqual({ lockedProperties: ['description'] }); }); it('should unlock all properties', async () => { const { ctx, sut } = setup(); const { user } = await ctx.newUser(); const { asset } = await ctx.newAsset({ ownerId: user.id }); await ctx.newExif({ assetId: asset.id, dateTimeOriginal: '2023-11-19T18:11:00', lockedProperties: ['dateTimeOriginal', 'description'], }); await expect( ctx.database .selectFrom('asset_exif') .select('lockedProperties') .where('assetId', '=', asset.id) .executeTakeFirstOrThrow(), ).resolves.toEqual({ lockedProperties: ['dateTimeOriginal', 'description'] }); await sut.unlockProperties(asset.id, ['description', 'dateTimeOriginal']); await expect( ctx.database .selectFrom('asset_exif') .select('lockedProperties') .where('assetId', '=', asset.id) .executeTakeFirstOrThrow(), ).resolves.toEqual({ lockedProperties: null }); }); }); });