Skip to content

Commit 64e39aa

Browse files
committed
getProjectsForUser controller tests
- implements tests - update apiKey tests to use new User mocks
1 parent c75cdad commit 64e39aa

File tree

6 files changed

+404
-215
lines changed

6 files changed

+404
-215
lines changed

server/controllers/project.controller.js

Lines changed: 1 addition & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,10 @@ import Project from '../models/project';
99
import User from '../models/user';
1010
import { resolvePathToFile } from '../utils/filePath';
1111
import generateFileSystemSafeName from '../utils/generateFileSystemSafeName';
12-
import { toApi as toApiProjectObject } from '../domain-objects/Project';
13-
import createApplicationErrorClass from '../utils/createApplicationErrorClass';
1412

1513
export { default as createProject, apiCreateProject } from './project.controller/createProject';
1614
export { default as deleteProject } from './project.controller/deleteProject';
17-
18-
const UserNotFoundError = createApplicationErrorClass('UserNotFoundError');
15+
export { default as getProjectsForUser, apiGetProjectsForUser } from './project.controller/getProjectsForUser';
1916

2017
export function updateProject(req, res) {
2118
Project.findById(req.params.project_id, (findProjectErr, project) => {
@@ -87,8 +84,6 @@ export function getProject(req, res) {
8784
});
8885
}
8986

90-
91-
9287
export function getProjectsForUserId(userId) {
9388
return new Promise((resolve, reject) => {
9489
Project.find({ user: userId })
@@ -131,34 +126,6 @@ export function getProjectAsset(req, res) {
131126
});
132127
}
133128

134-
function getProjectsForUserName(username) {
135-
return new Promise((resolve, reject) => {
136-
User.findOne({ username }, (err, user) => {
137-
if (err) {
138-
reject(err);
139-
return;
140-
}
141-
142-
if (!user) {
143-
reject(new UserNotFoundError());
144-
return;
145-
}
146-
147-
Project.find({ user: user._id })
148-
.sort('-createdAt')
149-
.select('name files id createdAt updatedAt')
150-
.exec((innerErr, projects) => {
151-
if (innerErr) {
152-
reject(innerErr);
153-
return;
154-
}
155-
156-
resolve(projects);
157-
});
158-
});
159-
});
160-
}
161-
162129
export function getProjects(req, res) {
163130
if (req.user) {
164131
getProjectsForUserId(req.user._id)
@@ -171,44 +138,6 @@ export function getProjects(req, res) {
171138
}
172139
}
173140

174-
export function getProjectsForUser(req, res) {
175-
if (req.params.username) {
176-
getProjectsForUserName(req.params.username)
177-
.then(projects => res.json(projects))
178-
.catch((err) => {
179-
if (err instanceof UserNotFoundError) {
180-
res.status(404).json({ message: 'User with that username does not exist.' });
181-
} else {
182-
res.status(500).json({ message: 'Error fetching projects' });
183-
}
184-
});
185-
} else {
186-
// could just move this to client side
187-
res.json([]);
188-
}
189-
}
190-
191-
export function apiGetProjectsForUser(req, res) {
192-
if (req.params.username) {
193-
getProjectsForUserName(req.params.username)
194-
.then((projects) => {
195-
const asApiObjects = projects.map(p => toApiProjectObject(p));
196-
res.json({ sketches: asApiObjects });
197-
})
198-
.catch((err) => {
199-
if (err instanceof UserNotFoundError) {
200-
res.status(404).json({ message: 'User with that username does not exist.' });
201-
} else {
202-
console.error(err);
203-
res.status(500).json({ message: 'Error fetching projects' });
204-
}
205-
});
206-
} else {
207-
// could just move this to client side
208-
res.json({ sketches: [] });
209-
}
210-
}
211-
212141
export function projectExists(projectId, callback) {
213142
Project.findById(projectId, (err, project) => (
214143
project ? callback(true) : callback(false)
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
/**
2+
* @jest-environment node
3+
*/
4+
import { Request, Response } from 'jest-express';
5+
6+
import { createMock } from '../../../models/user';
7+
import getProjectsForUser, { apiGetProjectsForUser } from '../../project.controller/getProjectsForUser';
8+
9+
jest.mock('../../../models/user');
10+
jest.mock('../../aws.controller');
11+
12+
describe('project.controller', () => {
13+
let UserMock;
14+
15+
beforeEach(() => {
16+
UserMock = createMock();
17+
});
18+
19+
afterEach(() => {
20+
UserMock.restore();
21+
});
22+
23+
describe('getProjectsForUser()', () => {
24+
it('returns empty array user not supplied as parameter', (done) => {
25+
const request = new Request();
26+
request.setParams({});
27+
const response = new Response();
28+
29+
const promise = getProjectsForUser(request, response);
30+
31+
function expectations() {
32+
expect(response.status).toHaveBeenCalledWith(200);
33+
expect(response.json).toHaveBeenCalledWith([]);
34+
35+
done();
36+
}
37+
38+
promise.then(expectations, expectations).catch(expectations);
39+
});
40+
41+
it('returns 404 if user does not exist', (done) => {
42+
const request = new Request();
43+
request.setParams({ username: 'abc123' });
44+
const response = new Response();
45+
46+
UserMock
47+
.expects('findOne')
48+
.withArgs({ username: 'abc123' })
49+
.yields(null, null);
50+
51+
const promise = getProjectsForUser(request, response);
52+
53+
function expectations() {
54+
expect(response.status).toHaveBeenCalledWith(404);
55+
expect(response.json).toHaveBeenCalledWith({ message: 'User with that username does not exist.' });
56+
57+
done();
58+
}
59+
60+
promise.then(expectations, expectations).catch(expectations);
61+
});
62+
63+
it('returns 500 on other errors', (done) => {
64+
const request = new Request();
65+
request.setParams({ username: 'abc123' });
66+
const response = new Response();
67+
68+
UserMock
69+
.expects('findOne')
70+
.withArgs({ username: 'abc123' })
71+
.yields(new Error(), null);
72+
73+
const promise = getProjectsForUser(request, response);
74+
75+
function expectations() {
76+
expect(response.status).toHaveBeenCalledWith(500);
77+
expect(response.json).toHaveBeenCalledWith({ message: 'Error fetching projects' });
78+
79+
done();
80+
}
81+
82+
promise.then(expectations, expectations).catch(expectations);
83+
});
84+
});
85+
86+
describe('apiGetProjectsForUser()', () => {
87+
it('returns validation error if user id not provided', (done) => {
88+
const request = new Request();
89+
request.setParams({});
90+
const response = new Response();
91+
92+
const promise = apiGetProjectsForUser(request, response);
93+
94+
function expectations() {
95+
expect(response.status).toHaveBeenCalledWith(422);
96+
expect(response.json).toHaveBeenCalledWith({
97+
message: 'Username not provided'
98+
});
99+
100+
done();
101+
}
102+
103+
promise.then(expectations, expectations).catch(expectations);
104+
});
105+
106+
107+
it('returns 404 if user does not exist', (done) => {
108+
const request = new Request();
109+
request.setParams({ username: 'abc123' });
110+
const response = new Response();
111+
112+
UserMock
113+
.expects('findOne')
114+
.withArgs({ username: 'abc123' })
115+
.yields(null, null);
116+
117+
const promise = apiGetProjectsForUser(request, response);
118+
119+
function expectations() {
120+
expect(response.status).toHaveBeenCalledWith(404);
121+
expect(response.json).toHaveBeenCalledWith({ message: 'User with that username does not exist.' });
122+
123+
done();
124+
}
125+
126+
promise.then(expectations, expectations).catch(expectations);
127+
});
128+
129+
it('returns 500 on other errors', (done) => {
130+
const request = new Request();
131+
request.setParams({ username: 'abc123' });
132+
const response = new Response();
133+
134+
UserMock
135+
.expects('findOne')
136+
.withArgs({ username: 'abc123' })
137+
.yields(new Error(), null);
138+
139+
const promise = apiGetProjectsForUser(request, response);
140+
141+
function expectations() {
142+
expect(response.status).toHaveBeenCalledWith(500);
143+
expect(response.json).toHaveBeenCalledWith({ message: 'Error fetching projects' });
144+
145+
done();
146+
}
147+
148+
promise.then(expectations, expectations).catch(expectations);
149+
});
150+
});
151+
});
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import Project from '../../models/project';
2+
import User from '../../models/user';
3+
import { toApi as toApiProjectObject } from '../../domain-objects/Project';
4+
import createApplicationErrorClass from '../../utils/createApplicationErrorClass';
5+
6+
const UserNotFoundError = createApplicationErrorClass('UserNotFoundError');
7+
8+
function getProjectsForUserName(username) {
9+
return new Promise((resolve, reject) => {
10+
User.findOne({ username }, (err, user) => {
11+
if (err) {
12+
reject(err);
13+
return;
14+
}
15+
16+
if (!user) {
17+
reject(new UserNotFoundError());
18+
return;
19+
}
20+
21+
Project.find({ user: user._id })
22+
.sort('-createdAt')
23+
.select('name files id createdAt updatedAt')
24+
.exec((innerErr, projects) => {
25+
if (innerErr) {
26+
reject(innerErr);
27+
return;
28+
}
29+
30+
resolve(projects);
31+
});
32+
});
33+
});
34+
}
35+
36+
export default function getProjectsForUser(req, res) {
37+
if (req.params.username) {
38+
return getProjectsForUserName(req.params.username)
39+
.then(projects => res.json(projects))
40+
.catch((err) => {
41+
if (err instanceof UserNotFoundError) {
42+
res.status(404).json({ message: 'User with that username does not exist.' });
43+
} else {
44+
res.status(500).json({ message: 'Error fetching projects' });
45+
}
46+
});
47+
}
48+
49+
// could just move this to client side
50+
res.status(200).json([]);
51+
return Promise.resolve();
52+
}
53+
54+
export function apiGetProjectsForUser(req, res) {
55+
if (req.params.username) {
56+
return getProjectsForUserName(req.params.username)
57+
.then((projects) => {
58+
const asApiObjects = projects.map(p => toApiProjectObject(p));
59+
res.json({ sketches: asApiObjects });
60+
})
61+
.catch((err) => {
62+
if (err instanceof UserNotFoundError) {
63+
res.status(404).json({ message: 'User with that username does not exist.' });
64+
} else {
65+
res.status(500).json({ message: 'Error fetching projects' });
66+
}
67+
});
68+
}
69+
70+
res.status(422).json({ message: 'Username not provided' });
71+
return Promise.resolve();
72+
}

0 commit comments

Comments
 (0)