Skip to content

Commit

Permalink
test(domain): test folders deletion
Browse files Browse the repository at this point in the history
  • Loading branch information
tericcabrel committed Nov 1, 2023
1 parent af61462 commit 6814a21
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 45 deletions.
132 changes: 129 additions & 3 deletions packages/domain/__tests__/services/folders/folder.service.test.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -10,6 +10,7 @@ import {
createUserWithRootFolder,
deleteTestFoldersById,
deleteTestUsersById,
updateTestFolderDto,
} from '../../setup/test-utils';

describe('Test Folder service', () => {
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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<Folder>({
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]);
});
});
34 changes: 1 addition & 33 deletions packages/domain/__tests__/services/folders/utils/folders.test.ts
Original file line number Diff line number Diff line change
@@ -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();
Expand Down
11 changes: 11 additions & 0 deletions packages/domain/__tests__/setup/test-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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()}`,
});
};
6 changes: 1 addition & 5 deletions packages/domain/src/folders/folder.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Folder> {
Expand Down Expand Up @@ -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');
}
Expand Down
4 changes: 0 additions & 4 deletions packages/domain/src/folders/utils/folders.ts
Original file line number Diff line number Diff line change
@@ -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);
};

0 comments on commit 6814a21

Please sign in to comment.