import { Kysely } from 'kysely'; import { AccessRepository } from 'src/repositories/access.repository'; import { DatabaseRepository } from 'src/repositories/database.repository'; import { LoggingRepository } from 'src/repositories/logging.repository'; import { PersonRepository } from 'src/repositories/person.repository'; import { StorageRepository } from 'src/repositories/storage.repository'; import { DB } from 'src/schema'; import { PersonService } from 'src/services/person.service'; import { 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(PersonService, { database: db || defaultDatabase, real: [AccessRepository, DatabaseRepository, PersonRepository], mock: [LoggingRepository, StorageRepository], }); }; beforeAll(async () => { defaultDatabase = await getKyselyDB(); }); describe(PersonService.name, () => { describe('delete', () => { it('should throw an error when there is no access', async () => { const { sut } = setup(); const auth = factory.auth(); const personId = factory.uuid(); await expect(sut.delete(auth, personId)).rejects.toThrow('Not found or no person.delete access'); }); it('should delete the person', async () => { const { sut, ctx } = setup(); const personRepo = ctx.get(PersonRepository); const storageMock = ctx.getMock(StorageRepository); const { user } = await ctx.newUser(); const { person } = await ctx.newPerson({ ownerId: user.id }); const auth = factory.auth({ user }); storageMock.unlink.mockResolvedValue(); await expect(personRepo.getById(person.id)).resolves.toEqual(expect.objectContaining({ id: person.id })); await expect(sut.delete(auth, person.id)).resolves.toBeUndefined(); await expect(personRepo.getById(person.id)).resolves.toBeUndefined(); expect(storageMock.unlink).toHaveBeenCalledWith(person.thumbnailPath); }); }); describe('deleteAll', () => { it('should throw an error when there is no access', async () => { const { sut } = setup(); const auth = factory.auth(); const personId = factory.uuid(); await expect(sut.deleteAll(auth, { ids: [personId] })).rejects.toThrow('Not found or no person.delete access'); }); it('should delete the person', async () => { const { sut, ctx } = setup(); const storageMock = ctx.getMock(StorageRepository); const personRepo = ctx.get(PersonRepository); const { user } = await ctx.newUser(); const { person: person1 } = await ctx.newPerson({ ownerId: user.id }); const { person: person2 } = await ctx.newPerson({ ownerId: user.id }); const auth = factory.auth({ user }); storageMock.unlink.mockResolvedValue(); await expect(sut.deleteAll(auth, { ids: [person1.id, person2.id] })).resolves.toBeUndefined(); await expect(personRepo.getById(person1.id)).resolves.toBeUndefined(); await expect(personRepo.getById(person2.id)).resolves.toBeUndefined(); expect(storageMock.unlink).toHaveBeenCalledTimes(2); expect(storageMock.unlink).toHaveBeenCalledWith(person1.thumbnailPath); expect(storageMock.unlink).toHaveBeenCalledWith(person2.thumbnailPath); }); }); });