Co-authored-by: Jason Rasmussen <jason@rasm.me> Co-authored-by: Daniel Dietzler <mail@ddietzler.dev> (cherry picked from commit 72e2bc8b0bc4a7e0a84ac16c0bde7f5e538729fb)
61 lines
2.4 KiB
TypeScript
61 lines
2.4 KiB
TypeScript
import { Kysely } from 'kysely';
|
|
import { AccessRepository } from 'src/repositories/access.repository.js';
|
|
import { AlbumRepository } from 'src/repositories/album.repository.js';
|
|
import { AssetRepository } from 'src/repositories/asset.repository.js';
|
|
import { LoggingRepository } from 'src/repositories/logging.repository.js';
|
|
import { UserRepository } from 'src/repositories/user.repository.js';
|
|
import { DB } from 'src/schema/index.js';
|
|
import { AlbumService } from 'src/services/album.service.js';
|
|
import { newMediumService } from 'test/medium.factory.js';
|
|
import { factory } from 'test/small.factory.js';
|
|
import { getKyselyDB } from 'test/utils.js';
|
|
|
|
let defaultDatabase: Kysely<DB>;
|
|
|
|
// eslint-disable-next-line unicorn/no-unnecessary-parameters
|
|
const setup = (db?: Kysely<DB>) => {
|
|
return newMediumService(AlbumService, {
|
|
database: db || defaultDatabase,
|
|
real: [AccessRepository, AlbumRepository, AssetRepository, UserRepository],
|
|
mock: [LoggingRepository],
|
|
});
|
|
};
|
|
|
|
beforeAll(async () => {
|
|
defaultDatabase = await getKyselyDB();
|
|
});
|
|
|
|
describe(AlbumService.name, () => {
|
|
describe('removeAssets', () => {
|
|
it('should not remove assets from an album of another user', async () => {
|
|
const { sut, ctx } = setup();
|
|
const { user } = await ctx.newUser();
|
|
const { user: otherUser } = await ctx.newUser();
|
|
const { asset } = await ctx.newAsset({ ownerId: user.id });
|
|
const { album } = await ctx.newAlbum({ ownerId: user.id }, [asset.id]);
|
|
|
|
await expect(sut.removeAssets(factory.auth({ user: otherUser }), album.id, { ids: [asset.id] })).rejects.toThrow(
|
|
'Not found or no albumAsset.delete access',
|
|
);
|
|
await expect(ctx.get(AlbumRepository).getAssetIds(album.id, [asset.id])).resolves.toContain(asset.id);
|
|
});
|
|
});
|
|
|
|
describe('database triggers', () => {
|
|
it('should cascade delete an album when the owner is deleted', async () => {
|
|
const { ctx } = setup();
|
|
const { user } = await ctx.newUser();
|
|
const { album } = await ctx.newAlbum({ ownerId: user.id });
|
|
|
|
await ctx.get(UserRepository).delete({ id: user.id }, true);
|
|
|
|
await expect(ctx.database.selectFrom('album').selectAll().where('id', '=', album.id).execute()).resolves.toEqual(
|
|
[],
|
|
);
|
|
await expect(
|
|
ctx.database.selectFrom('album_user').selectAll().where('albumId', '=', album.id).execute(),
|
|
).resolves.toEqual([]);
|
|
});
|
|
});
|
|
});
|