Skip to content

Commit 801cbb1

Browse files
committed
reimplement refactor for deleteProjects
1 parent f93132e commit 801cbb1

File tree

2 files changed

+76
-116
lines changed

2 files changed

+76
-116
lines changed

server/controllers/project.controller/__test__/deleteProject.test.js

Lines changed: 48 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -3,112 +3,79 @@
33
*/
44
import { Request, Response } from 'jest-express';
55

6-
import Project, {
7-
createMock,
8-
createInstanceMock
9-
} from '../../../models/project';
6+
import Project from '../../../models/project';
107
import User from '../../../models/user';
118
import deleteProject from '../../project.controller/deleteProject';
129
import { deleteObjectsFromS3 } from '../../aws.controller';
1310

1411
jest.mock('../../../models/project');
1512
jest.mock('../../aws.controller');
1613

17-
describe('project.controller', () => {
18-
describe('deleteProject()', () => {
19-
let ProjectMock;
20-
let ProjectInstanceMock;
21-
22-
beforeEach(() => {
23-
ProjectMock = createMock();
24-
ProjectInstanceMock = createInstanceMock();
25-
});
26-
27-
afterEach(() => {
28-
ProjectMock.restore();
29-
ProjectInstanceMock.restore();
30-
});
14+
// TODO: incomplete test, 500 response status needs to be added
3115

32-
it('returns 403 if project is not owned by authenticated user', (done) => {
33-
const user = new User();
34-
const project = new Project();
35-
project.user = user;
16+
describe('project.controller', () => {
17+
let request;
18+
let response;
3619

37-
const request = new Request();
38-
request.setParams({ project_id: project._id });
39-
request.user = { _id: 'abc123' };
20+
beforeEach(() => {
21+
request = new Request();
22+
response = new Response();
23+
Project.findById = jest.fn();
24+
});
4025

41-
const response = new Response();
26+
afterEach(() => {
27+
request.resetMocked();
28+
response.resetMocked();
29+
});
4230

43-
ProjectMock.expects('findById').resolves(project);
31+
it('returns 403 if project is not owned by authenticated user', async () => {
32+
const user = new User();
33+
const project = new Project();
34+
project.user = user;
4435

45-
const promise = deleteProject(request, response);
36+
request.setParams({ project_id: project._id });
37+
request.user = { _id: 'abc123' };
4638

47-
function expectations() {
48-
expect(response.status).toHaveBeenCalledWith(403);
49-
expect(response.json).toHaveBeenCalledWith({
50-
message: 'Authenticated user does not match owner of project'
51-
});
39+
Project.findById.mockResolvedValue(project);
5240

53-
done();
54-
}
41+
await deleteProject(request, response);
5542

56-
promise.then(expectations, expectations).catch(expectations);
43+
expect(response.status).toHaveBeenCalledWith(403);
44+
expect(response.json).toHaveBeenCalledWith({
45+
message: 'Authenticated user does not match owner of project'
5746
});
47+
});
5848

59-
it('returns 404 if project does not exist', (done) => {
60-
const user = new User();
61-
const project = new Project();
62-
project.user = user;
63-
64-
const request = new Request();
65-
request.setParams({ project_id: project._id });
66-
request.user = { _id: 'abc123' };
67-
68-
const response = new Response();
69-
70-
ProjectMock.expects('findById').resolves(null);
71-
72-
const promise = deleteProject(request, response);
49+
it('returns 404 if project does not exist', async () => {
50+
request.setParams({ project_id: 'random_id' });
51+
request.user = { _id: 'abc123' };
7352

74-
function expectations() {
75-
expect(response.status).toHaveBeenCalledWith(404);
76-
expect(response.json).toHaveBeenCalledWith({
77-
message: 'Project with that id does not exist'
78-
});
53+
Project.findById.mockResolvedValue(null);
7954

80-
done();
81-
}
55+
await deleteProject(request, response);
8256

83-
promise.then(expectations, expectations).catch(expectations);
57+
expect(response.status).toHaveBeenCalledWith(404);
58+
expect(response.json).toHaveBeenCalledWith({
59+
message: 'Project with that id does not exist'
8460
});
61+
});
8562

86-
it('deletes project and dependent files from S3 ', (done) => {
87-
const user = new User();
88-
const project = new Project();
89-
project.user = user;
90-
91-
const request = new Request();
92-
request.setParams({ project_id: project._id });
93-
request.user = { _id: user._id };
94-
95-
const response = new Response();
96-
97-
ProjectMock.expects('findById').resolves(project);
98-
99-
ProjectInstanceMock.expects('remove').yields();
63+
it('delete project and dependent files from S3', async () => {
64+
const user = new User();
65+
const project = new Project();
66+
project.user = user;
67+
project.remove = jest.fn().mockResolvedValue();
10068

101-
const promise = deleteProject(request, response);
69+
request.setParams({ project_id: project._id });
70+
request.user = { _id: user._id };
10271

103-
function expectations() {
104-
expect(response.status).toHaveBeenCalledWith(200);
105-
expect(response.json).not.toHaveBeenCalled();
106-
expect(deleteObjectsFromS3).toHaveBeenCalled();
72+
Project.findById.mockResolvedValue(project);
73+
deleteObjectsFromS3.mockResolvedValue();
10774

108-
done();
109-
}
75+
await deleteProject(request, response);
11076

111-
promise.then(expectations, expectations).catch(expectations);
112-
});
77+
expect(deleteObjectsFromS3).toHaveBeenCalled();
78+
expect(project.remove).toHaveBeenCalled();
79+
expect(response.status).toHaveBeenCalledWith(200);
11380
});
11481
});

server/controllers/project.controller/deleteProject.js

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,42 @@ const ProjectDeletionError = createApplicationErrorClass(
77
'ProjectDeletionError'
88
);
99

10-
function deleteFilesFromS3(files) {
10+
async function deleteFilesFromS3(files) {
1111
const filteredFiles = files
1212
.filter((file) => {
1313
const isValidFile =
14-
(file.url &&
15-
(file.url.includes(process.env.S3_BUCKET_URL_BASE) ||
16-
file.url.includes(process.env.S3_BUCKET)) &&
17-
!process.env.S3_DATE) ||
18-
(process.env.S3_DATE &&
19-
isBefore(new Date(process.env.S3_DATE), new Date(file.createdAt)));
14+
file.url &&
15+
(file.url.includes(process.env.S3_BUCKET_URL_BASE) ||
16+
file.url.includes(process.env.S3_BUCKET)) &&
17+
(!process.env.S3_DATE ||
18+
(process.env.S3_DATE &&
19+
isBefore(new Date(process.env.S3_DATE), new Date(file.createdAt))));
2020

2121
return isValidFile;
2222
})
2323
.map((file) => getObjectKey(file.url));
2424

25-
deleteObjectsFromS3(filteredFiles);
25+
try {
26+
await deleteObjectsFromS3(filteredFiles);
27+
} catch (error) {
28+
console.error('Failed to delete files from S3: ', error);
29+
}
2630
}
2731

28-
export default function deleteProject(req, res) {
29-
function sendFailure(error) {
32+
export default async function deleteProject(req, res) {
33+
const sendFailure = (error) => {
3034
res.status(error.code).json({ message: error.message });
31-
}
35+
};
3236

33-
function sendProjectNotFound() {
34-
sendFailure(
35-
new ProjectDeletionError('Project with that id does not exist', {
36-
code: 404
37-
})
38-
);
39-
}
37+
try {
38+
const project = await Project.findById(req.params.project_id);
4039

41-
function handleProjectDeletion(project) {
42-
if (project == null) {
43-
sendProjectNotFound();
40+
if (!project) {
41+
sendFailure(
42+
new ProjectDeletionError('Project with that id does not exist', {
43+
code: 404
44+
})
45+
);
4446
return;
4547
}
4648

@@ -54,19 +56,10 @@ export default function deleteProject(req, res) {
5456
return;
5557
}
5658

57-
deleteFilesFromS3(project.files);
58-
59-
project.remove((removeProjectError) => {
60-
if (removeProjectError) {
61-
sendProjectNotFound();
62-
return;
63-
}
64-
65-
res.status(200).end();
66-
});
59+
await deleteFilesFromS3(project.files);
60+
await project.remove();
61+
res.status(200).end();
62+
} catch (error) {
63+
sendFailure(error);
6764
}
68-
69-
return Project.findById(req.params.project_id)
70-
.then(handleProjectDeletion)
71-
.catch(sendFailure);
7265
}

0 commit comments

Comments
 (0)