diff --git a/src/modules/backups/backup.usecase.spec.ts b/src/modules/backups/backup.usecase.spec.ts index d5abcef66..3f3c83844 100644 --- a/src/modules/backups/backup.usecase.spec.ts +++ b/src/modules/backups/backup.usecase.spec.ts @@ -378,7 +378,7 @@ describe('BackupUseCase', () => { ).rejects.toThrow(NotFoundException); }); - it('When folder is found, then it should call deleteByUser', async () => { + it('When folder is found, then it should call deleteByUser and deleteDevicesBy', async () => { const mockFolder = newFolder({ attributes: { bucket: userMocked.backupsBucket, @@ -388,12 +388,17 @@ describe('BackupUseCase', () => { .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValue(mockFolder); jest.spyOn(folderUseCases, 'deleteByUser').mockResolvedValue(undefined); + jest.spyOn(backupRepository, 'deleteDevicesBy').mockResolvedValue(1); await backupUseCase.deleteDeviceAsFolder(userMocked, 'folder-uuid'); expect(folderUseCases.deleteByUser).toHaveBeenCalledWith(userMocked, [ mockFolder, ]); + expect(backupRepository.deleteDevicesBy).toHaveBeenCalledWith({ + userId: userMocked.id, + folderUuid: 'folder-uuid', + }); }); it('When folder is not in the backups bucket, then it should throw a BadRequestException', async () => { @@ -411,6 +416,27 @@ describe('BackupUseCase', () => { backupUseCase.deleteDeviceAsFolder(userMocked, 'folder-uuid'), ).rejects.toThrow(BadRequestException); }); + + it('When folder is deleted, then it should delete associated devices to prevent orphaned records', async () => { + const mockFolder = newFolder({ + attributes: { + uuid: 'test-folder-uuid', + bucket: userMocked.backupsBucket, + }, + }); + jest + .spyOn(folderUseCases, 'getFolderByUuid') + .mockResolvedValue(mockFolder); + jest.spyOn(folderUseCases, 'deleteByUser').mockResolvedValue(undefined); + jest.spyOn(backupRepository, 'deleteDevicesBy').mockResolvedValue(2); + + await backupUseCase.deleteDeviceAsFolder(userMocked, 'test-folder-uuid'); + + expect(backupRepository.deleteDevicesBy).toHaveBeenCalledWith({ + userId: userMocked.id, + folderUuid: 'test-folder-uuid', + }); + }); }); describe('getUserDevices', () => { diff --git a/src/modules/backups/backup.usecase.ts b/src/modules/backups/backup.usecase.ts index f9258d5d3..dde9e3590 100644 --- a/src/modules/backups/backup.usecase.ts +++ b/src/modules/backups/backup.usecase.ts @@ -129,8 +129,11 @@ export class BackupUseCase { if (folder.bucket !== backupsBucket) { throw new BadRequestException('Folder is not in the backups bucket'); } - await this.folderUsecases.deleteByUser(user, [folder]); + await this.backupRepository.deleteDevicesBy({ + userId: user.id, + folderUuid: uuid, + }); } async getDevicesAsFolder(user: User) {