From 6814a211b3164d2e52beed8ab9325479ddca1b21 Mon Sep 17 00:00:00 2001 From: Eric Cabrel TIOGO Date: Sun, 30 Oct 2022 19:27:37 +0100 Subject: [PATCH] test(domain): test folders deletion --- .../services/folders/folder.service.test.ts | 132 +++++++++++++++++- .../services/folders/utils/folders.test.ts | 34 +---- packages/domain/__tests__/setup/test-utils.ts | 11 ++ packages/domain/src/folders/folder.service.ts | 6 +- packages/domain/src/folders/utils/folders.ts | 4 - 5 files changed, 142 insertions(+), 45 deletions(-) diff --git a/packages/domain/__tests__/services/folders/folder.service.test.ts b/packages/domain/__tests__/services/folders/folder.service.test.ts index fe583883..aa17899b 100644 --- a/packages/domain/__tests__/services/folders/folder.service.test.ts +++ b/packages/domain/__tests__/services/folders/folder.service.test.ts @@ -1,7 +1,7 @@ -import SharinganError, { errors } from '@sharingan/utils'; +import { Folder } from '@sharingan/database'; +import SharinganError, { errors, generateRandomId } from '@sharingan/utils'; -import { folderService, roleService } from '../../../index'; -import { CreateUserRootFolderDto } from '../../../index'; +import { CreateUserRootFolderDto, folderService, roleService } from '../../../index'; import CreateFolderDto from '../../../src/folders/dtos/create-folder-dto'; import { createManyTestFolders, @@ -10,6 +10,7 @@ import { createUserWithRootFolder, deleteTestFoldersById, deleteTestUsersById, + updateTestFolderDto, } from '../../setup/test-utils'; describe('Test Folder service', () => { @@ -250,6 +251,25 @@ describe('Test Folder service', () => { await deleteTestUsersById([user2.id]); }); + it('should not delete folders because we cannot delete a root folder', async () => { + // GIVEN + const [user, rootFolder] = await createUserWithRootFolder(); + const [myGistFolder] = await createManyTestFolders({ + folderNames: ['My gist'], + parentId: rootFolder.id, + userId: user.id, + }); + + // WHEN + // THEN + await expect(async () => { + await folderService.deleteMany([myGistFolder.id, rootFolder.id], user.id); + }).rejects.toThrow(new SharinganError(errors.CANT_DELETE_ROOT_FOLDER, 'CANT_DELETE_ROOT_FOLDER')); + + await deleteTestFoldersById([myGistFolder.id, rootFolder.id]); + await deleteTestUsersById([user.id]); + }); + it('should generate the breadcrumb path of a folder', async () => { // GIVEN const [user, rootFolder] = await createUserWithRootFolder(); @@ -292,4 +312,110 @@ describe('Test Folder service', () => { await deleteTestFoldersById([rootFolder.id]); await deleteTestUsersById([user.id]); }); + + it('should found no folder given the ID provided', async () => { + // GIVEN + const folderId = generateRandomId(); + + // WHEN + // THEN + await expect(async () => { + await folderService.findById(folderId); + }).rejects.toThrow(new SharinganError(errors.FOLDER_NOT_FOUND(folderId), 'FOLDER_NOT_FOUND')); + }); + + it('should update an existing folder in the specified folder', async () => { + // GIVEN + const [user, rootFolder] = await createUserWithRootFolder(); + const [folder] = await createManyTestFolders({ + folderNames: ['My gist'], + parentId: rootFolder.id, + userId: user.id, + }); + + const updateFolderDto = updateTestFolderDto({ folderId: folder.id, name: 'The Gist', userId: user.id }); + + // WHEN + const updatedFolder = await folderService.update(updateFolderDto); + + // THEN + const folderToUpdate = updateFolderDto.toFolder(folder); + + expect(updatedFolder).toMatchObject({ + createdAt: expect.any(Date), + id: folder.id, + isFavorite: false, + name: folderToUpdate.name, + parentId: rootFolder.id, + path: folder.path, + updatedAt: expect.any(Date), + userId: user.id, + }); + + await deleteTestFoldersById([updatedFolder.id, rootFolder.id]); + await deleteTestUsersById([user.id]); + }); + + it('should not update an existing folder in the specified folder because another folder with the updated name already exists in the folder', async () => { + // GIVEN + const [user, rootFolder] = await createUserWithRootFolder(); + const [folder1, folder2] = await createManyTestFolders({ + folderNames: ['folder-one', 'folder-two'], + parentId: rootFolder.id, + userId: user.id, + }); + + const updateFolderDto = updateTestFolderDto({ folderId: folder1.id, name: 'folder-two', userId: user.id }); + + // WHEN + // THEN + await expect(async () => { + await folderService.update(updateFolderDto); + }).rejects.toThrow(new SharinganError(errors.FOLDER_ALREADY_EXIST(updateFolderDto.name), 'FOLDER_ALREADY_EXIST')); + + await deleteTestFoldersById([folder1.id, folder2.id]); + await deleteTestFoldersById([rootFolder.id]); + await deleteTestUsersById([user.id]); + }); + + it('should not update an existing folder in the specified folder because it belongs to other user', async () => { + // GIVEN + const [user1, rootFolder1] = await createUserWithRootFolder(); + const [user2, rootFolder2] = await createUserWithRootFolder(); + const [folderUser2] = await createManyTestFolders({ + folderNames: ['folder-user-two'], + parentId: rootFolder2.id, + userId: user2.id, + }); + + const updateFolderDto = updateTestFolderDto({ folderId: folderUser2.id, userId: user1.id }); + + // WHEN + // THEN + await expect(async () => { + await folderService.update(updateFolderDto); + }).rejects.toThrow( + new SharinganError(errors.CANT_EDIT_FOLDER(updateFolderDto.creatorId, folderUser2.id), 'CANT_EDIT_FOLDER'), + ); + + await deleteTestFoldersById([folderUser2.id]); + await deleteTestFoldersById([rootFolder1.id, rootFolder2.id]); + await deleteTestUsersById([user1.id, user2.id]); + }); + + it('should not update the user root folder', async () => { + // GIVEN + const [user1, rootFolder] = await createUserWithRootFolder(); + + const updateFolderDto = updateTestFolderDto({ folderId: rootFolder.id, name: 'new-root-folder', userId: user1.id }); + + // WHEN + // THEN + await expect(async () => { + await folderService.update(updateFolderDto); + }).rejects.toThrow(new SharinganError(errors.CANT_RENAME_ROOT_FOLDER, 'CANT_RENAME_ROOT_FOLDER')); + + await deleteTestFoldersById([rootFolder.id]); + await deleteTestUsersById([user1.id]); + }); }); diff --git a/packages/domain/__tests__/services/folders/utils/folders.test.ts b/packages/domain/__tests__/services/folders/utils/folders.test.ts index 9475876e..ed87311b 100644 --- a/packages/domain/__tests__/services/folders/utils/folders.test.ts +++ b/packages/domain/__tests__/services/folders/utils/folders.test.ts @@ -1,41 +1,9 @@ import { Folder } from '@sharingan/database'; -import { isFoldersBelongToUser, isFoldersContainRoot } from '../../../../src/folders/utils/folders'; +import { isFoldersContainRoot } from '../../../../src/folders/utils/folders'; import { createTestFolderDto, generateTestId } from '../../../setup/test-utils'; describe('Test folders utilities', () => { - it('should assert all the folders belong to the user', () => { - // GIVEN - const parentId = generateTestId(); - const userId = generateTestId(); - const foldersToDelete: Folder[] = [ - createTestFolderDto({ parentId, userId }).toFolder(), - createTestFolderDto({ parentId, userId }).toFolder(), - ]; - - // WHEN - const isValid = isFoldersBelongToUser(foldersToDelete, userId); - - // THEN - expect(isValid).toEqual(true); - }); - - it('should assert not all the folders belong to the user', () => { - // GIVEN - const parentId = generateTestId(); - const userId = generateTestId(); - const foldersToDelete: Folder[] = [ - createTestFolderDto({ parentId, userId }).toFolder(), - createTestFolderDto().toFolder(), - ]; - - // WHEN - const isValid = isFoldersBelongToUser(foldersToDelete, userId); - - // THEN - expect(isValid).toEqual(false); - }); - it('should assert the folders contain the root folder', () => { // GIVEN const userId = generateTestId(); diff --git a/packages/domain/__tests__/setup/test-utils.ts b/packages/domain/__tests__/setup/test-utils.ts index b756e27c..c4a50595 100644 --- a/packages/domain/__tests__/setup/test-utils.ts +++ b/packages/domain/__tests__/setup/test-utils.ts @@ -15,6 +15,7 @@ import { import { CreateUserDto } from '../../index'; import CreateFolderDto from '../../src/folders/dtos/create-folder-dto'; import CreateUserRootFolderDto from '../../src/folders/dtos/create-user-root-folder-dto'; +import UpdateFolderDto from '../../src/folders/dtos/update-folder-dto'; import CreateSessionDto from '../../src/sessions/dtos/create-session-dto'; import CreateSnippetDto from '../../src/snippets/dtos/create-snippet-dto'; import DeleteSnippetDto from '../../src/snippets/dtos/delete-snippet-dto'; @@ -253,3 +254,13 @@ export const updateTestSnippetDto = ( visibility: args?.visibility ?? 'public', }); }; + +export const updateTestFolderDto = ( + args: { folderId?: string; name?: string; userId?: string } | undefined, +): UpdateFolderDto => { + return new UpdateFolderDto({ + creatorId: args?.userId ?? generateTestId(), + folderId: args?.folderId ?? generateTestId(), + name: args?.name ?? `${randWord()}`, + }); +}; diff --git a/packages/domain/src/folders/folder.service.ts b/packages/domain/src/folders/folder.service.ts index fe475312..1bb33065 100644 --- a/packages/domain/src/folders/folder.service.ts +++ b/packages/domain/src/folders/folder.service.ts @@ -4,7 +4,7 @@ import SharinganError, { errors } from '@sharingan/utils'; import CreateFolderDto from './dtos/create-folder-dto'; import CreateUserRootFolderDto from './dtos/create-user-root-folder-dto'; import UpdateFolderDto from './dtos/update-folder-dto'; -import { isFoldersBelongToUser, isFoldersContainRoot } from './utils/folders'; +import { isFoldersContainRoot } from './utils/folders'; export default class FolderService { async createUserRootFolder(dto: CreateUserRootFolderDto): Promise { @@ -92,10 +92,6 @@ export default class FolderService { }, }); - if (!isFoldersBelongToUser(foldersToDelete, userId)) { - throw new SharinganError(errors.FOLDERS_DONT_BELONG_TO_USER, 'FOLDERS_DONT_BELONG_TO_USER'); - } - if (isFoldersContainRoot(foldersToDelete)) { throw new SharinganError(errors.CANT_DELETE_ROOT_FOLDER, 'CANT_DELETE_ROOT_FOLDER'); } diff --git a/packages/domain/src/folders/utils/folders.ts b/packages/domain/src/folders/utils/folders.ts index 2fc24b53..01f45d48 100644 --- a/packages/domain/src/folders/utils/folders.ts +++ b/packages/domain/src/folders/utils/folders.ts @@ -1,9 +1,5 @@ import { Folder } from '@sharingan/database'; -export const isFoldersBelongToUser = (folders: Folder[], userId: string): boolean => { - return folders.every((folder) => folder.userId === userId); -}; - export const isFoldersContainRoot = (folders: Folder[]): boolean => { return folders.some((folder) => folder.parentId === null); };