Skip to content

Commit 509e00a

Browse files
committed
server/controller/user: update tests to have stronger typing for request and response
1 parent 7eeac88 commit 509e00a

File tree

6 files changed

+312
-81
lines changed

6 files changed

+312
-81
lines changed

server/controllers/user.controller/__tests__/apiKey.test.ts

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@ import { last } from 'lodash';
22
import { Request as MockRequest } from 'jest-express/lib/request';
33
import { Response as MockResponse } from 'jest-express/lib/response';
44
import { NextFunction as MockNext } from 'jest-express/lib/next';
5+
import { Request, Response } from 'express';
56
import { Types } from 'mongoose';
67

78
import { User } from '../../../models/user';
89
import { createApiKey, removeApiKey } from '../apiKey';
9-
import type { ApiKeyDocument } from '../../../types';
10+
import type { ApiKeyDocument, RemoveApiKeyRequestParams } from '../../../types';
1011
import { createMockUser } from '../__testUtils__';
1112

1213
jest.mock('../../../models/user');
1314

1415
describe('user.controller > api key', () => {
15-
let request: any;
16-
let response: any;
16+
let request: MockRequest;
17+
let response: MockResponse;
1718
let next: MockNext;
1819

1920
beforeEach(() => {
@@ -34,7 +35,11 @@ describe('user.controller > api key', () => {
3435

3536
User.findById = jest.fn().mockResolvedValue(null);
3637

37-
await createApiKey(request, response, next);
38+
await createApiKey(
39+
(request as unknown) as Request,
40+
(response as unknown) as Response,
41+
next
42+
);
3843

3944
expect(response.status).toHaveBeenCalledWith(404);
4045
expect(response.json).toHaveBeenCalledWith({
@@ -49,7 +54,11 @@ describe('user.controller > api key', () => {
4954
const user = new User();
5055
User.findById = jest.fn().mockResolvedValue(user);
5156

52-
await createApiKey(request, response, next);
57+
await createApiKey(
58+
(request as unknown) as Request,
59+
(response as unknown) as Response,
60+
next
61+
);
5362

5463
expect(response.status).toHaveBeenCalledWith(400);
5564
expect(response.json).toHaveBeenCalledWith({
@@ -67,7 +76,11 @@ describe('user.controller > api key', () => {
6776
User.findById = jest.fn().mockResolvedValue(user);
6877
user.save = jest.fn();
6978

70-
await createApiKey(request, response, next);
79+
await createApiKey(
80+
(request as unknown) as Request,
81+
(response as unknown) as Response,
82+
next
83+
);
7184

7285
const lastKey = last(user.apiKeys);
7386

@@ -89,7 +102,11 @@ describe('user.controller > api key', () => {
89102

90103
User.findById = jest.fn().mockResolvedValue(null);
91104

92-
await removeApiKey(request, response, next);
105+
await removeApiKey(
106+
(request as unknown) as Request<RemoveApiKeyRequestParams>,
107+
(response as unknown) as Response,
108+
next
109+
);
93110

94111
expect(response.status).toHaveBeenCalledWith(404);
95112
expect(response.json).toHaveBeenCalledWith({
@@ -105,7 +122,11 @@ describe('user.controller > api key', () => {
105122

106123
User.findById = jest.fn().mockResolvedValue(user);
107124

108-
await removeApiKey(request, response, next);
125+
await removeApiKey(
126+
(request as unknown) as Request<RemoveApiKeyRequestParams>,
127+
(response as unknown) as Response,
128+
next
129+
);
109130

110131
expect(response.status).toHaveBeenCalledWith(404);
111132
expect(response.json).toHaveBeenCalledWith({
@@ -135,7 +156,11 @@ describe('user.controller > api key', () => {
135156

136157
User.findById = jest.fn().mockResolvedValue(user);
137158

138-
await removeApiKey(request, response, next);
159+
await removeApiKey(
160+
(request as unknown) as Request<RemoveApiKeyRequestParams>,
161+
(response as unknown) as Response,
162+
next
163+
);
139164

140165
expect(user.apiKeys.pull).toHaveBeenCalledWith({ _id: 'id1' });
141166
expect(user.save).toHaveBeenCalled();

server/controllers/user.controller/__tests__/authManagement/3rdPartyManagement.test.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Request as MockRequest } from 'jest-express/lib/request';
22
import { Response as MockResponse } from 'jest-express/lib/response';
33
import { NextFunction as MockNext } from 'jest-express/lib/next';
4+
import { Request, Response } from 'express';
45
import { unlinkGithub, unlinkGoogle } from '../../authManagement';
56
import { saveUser } from '../../helpers';
67
import { createMockUser } from '../../__testUtils__';
@@ -12,8 +13,8 @@ jest.mock('../../helpers', () => ({
1213
jest.mock('../../../../utils/mail');
1314

1415
describe('user.controller > auth management > 3rd party auth', () => {
15-
let request: any;
16-
let response: any;
16+
let request: MockRequest;
17+
let response: MockResponse;
1718
let next: MockNext;
1819

1920
beforeEach(() => {
@@ -31,7 +32,11 @@ describe('user.controller > auth management > 3rd party auth', () => {
3132
describe('unlinkGithub', () => {
3233
describe('and when there is no user in the request', () => {
3334
beforeEach(async () => {
34-
await unlinkGithub(request, response, next);
35+
await unlinkGithub(
36+
(request as unknown) as Request,
37+
(response as unknown) as Response,
38+
next
39+
);
3540
});
3641
it('does not call saveUser', () => {
3742
expect(saveUser).not.toHaveBeenCalled();
@@ -52,7 +57,11 @@ describe('user.controller > auth management > 3rd party auth', () => {
5257

5358
beforeEach(async () => {
5459
request.user = user;
55-
await unlinkGithub(request, response, next);
60+
await unlinkGithub(
61+
(request as unknown) as Request,
62+
(response as unknown) as Response,
63+
next
64+
);
5665
});
5766
it('removes the users github property', () => {
5867
expect(user.github).toBeUndefined();
@@ -69,7 +78,11 @@ describe('user.controller > auth management > 3rd party auth', () => {
6978
describe('unlinkGoogle', () => {
7079
describe('and when there is no user in the request', () => {
7180
beforeEach(async () => {
72-
await unlinkGoogle(request, response, next);
81+
await unlinkGoogle(
82+
(request as unknown) as Request,
83+
(response as unknown) as Response,
84+
next
85+
);
7386
});
7487
it('does not call saveUser', () => {
7588
expect(saveUser).not.toHaveBeenCalled();
@@ -90,7 +103,11 @@ describe('user.controller > auth management > 3rd party auth', () => {
90103

91104
beforeEach(async () => {
92105
request.user = user;
93-
await unlinkGoogle(request, response, next);
106+
await unlinkGoogle(
107+
(request as unknown) as Request,
108+
(response as unknown) as Response,
109+
next
110+
);
94111
});
95112
it('removes the users google property', () => {
96113
expect(user.google).toBeUndefined();

server/controllers/user.controller/__tests__/authManagement/passwordManagement.test.ts

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Request as MockRequest } from 'jest-express/lib/request';
22
import { Response as MockResponse } from 'jest-express/lib/response';
33
import { NextFunction as MockNext } from 'jest-express/lib/next';
4+
import { Request, Response } from 'express';
45
import { User } from '../../../../models/user';
56
import {
67
resetPasswordInitiate,
@@ -11,7 +12,10 @@ import { generateToken } from '../../helpers';
1112
import { createMockUser } from '../../__testUtils__';
1213

1314
import { mailerService } from '../../../../utils/mail';
14-
import { UserDocument } from '../../../../types';
15+
import {
16+
ResetOrUpdatePasswordRequestParams,
17+
UserDocument
18+
} from '../../../../types';
1519

1620
jest.mock('../../../../models/user');
1721
jest.mock('../../../../utils/mail');
@@ -21,8 +25,8 @@ jest.mock('../../helpers', () => ({
2125
}));
2226

2327
describe('user.controller > auth management > password management', () => {
24-
let request: any;
25-
let response: any;
28+
let request: MockRequest;
29+
let response: MockResponse;
2630
let next: MockNext;
2731
let mockToken: string;
2832
let mockUser: Partial<UserDocument>;
@@ -52,7 +56,11 @@ describe('user.controller > auth management > password management', () => {
5256
it('calls User.findByEmail with the correct email', async () => {
5357
User.findByEmail = jest.fn().mockResolvedValue({});
5458
request.body = { email: '[email protected]' };
55-
await resetPasswordInitiate(request, response, next);
59+
await resetPasswordInitiate(
60+
(request as unknown) as Request,
61+
(response as unknown) as Response,
62+
next
63+
);
5664

5765
expect(User.findByEmail).toHaveBeenCalledWith('[email protected]');
5866
});
@@ -71,7 +79,11 @@ describe('user.controller > auth management > password management', () => {
7179
request.body = { email: '[email protected]' };
7280
request.headers.host = 'localhost:3000';
7381

74-
await resetPasswordInitiate(request, response, next);
82+
await resetPasswordInitiate(
83+
(request as unknown) as Request,
84+
(response as unknown) as Response,
85+
next
86+
);
7587
});
7688
it('sets a resetPasswordToken with an expiry of 1h to the user', () => {
7789
expect(mockUser.resetPasswordToken).toBe(mockToken);
@@ -107,12 +119,20 @@ describe('user.controller > auth management > password management', () => {
107119
request.headers.host = 'localhost:3000';
108120
});
109121
it('does not send the reset password email', async () => {
110-
await resetPasswordInitiate(request, response, next);
122+
await resetPasswordInitiate(
123+
(request as unknown) as Request,
124+
(response as unknown) as Response,
125+
next
126+
);
111127

112128
expect(mailerService.send).not.toHaveBeenCalledWith();
113129
});
114130
it('returns a success message that does not indicate if the user exists, for security purposes', async () => {
115-
await resetPasswordInitiate(request, response, next);
131+
await resetPasswordInitiate(
132+
(request as unknown) as Request,
133+
(response as unknown) as Response,
134+
next
135+
);
116136

117137
expect(response.json).toHaveBeenCalledWith({
118138
success: true,
@@ -136,7 +156,11 @@ describe('user.controller > auth management > password management', () => {
136156
request.body = { email: '[email protected]' };
137157
request.headers.host = 'localhost:3000';
138158

139-
await resetPasswordInitiate(request, response, next);
159+
await resetPasswordInitiate(
160+
(request as unknown) as Request,
161+
(response as unknown) as Response,
162+
next
163+
);
140164

141165
expect(response.json).toHaveBeenCalledWith({
142166
success: false
@@ -155,7 +179,11 @@ describe('user.controller > auth management > password management', () => {
155179

156180
request.params = { token: 'some-token' };
157181

158-
await validateResetPasswordToken(request, response, next);
182+
await validateResetPasswordToken(
183+
(request as unknown) as Request<ResetOrUpdatePasswordRequestParams>,
184+
(response as unknown) as Response,
185+
next
186+
);
159187

160188
expect(User.findOne).toHaveBeenCalledWith({
161189
resetPasswordToken: 'some-token',
@@ -171,7 +199,11 @@ describe('user.controller > auth management > password management', () => {
171199

172200
request.params = { token: 'invalid-token' };
173201

174-
await validateResetPasswordToken(request, response, next);
202+
await validateResetPasswordToken(
203+
(request as unknown) as Request<ResetOrUpdatePasswordRequestParams>,
204+
(response as unknown) as Response,
205+
next
206+
);
175207
});
176208
it('returns a 401', () => {
177209
expect(response.status).toHaveBeenCalledWith(401);
@@ -198,7 +230,11 @@ describe('user.controller > auth management > password management', () => {
198230

199231
request.params = { token: 'valid-token' };
200232

201-
await validateResetPasswordToken(request, response, next);
233+
await validateResetPasswordToken(
234+
(request as unknown) as Request<ResetOrUpdatePasswordRequestParams>,
235+
(response as unknown) as Response,
236+
next
237+
);
202238
});
203239
it('returns a success response', () => {
204240
expect(response.json).toHaveBeenCalledWith({ success: true });
@@ -217,7 +253,11 @@ describe('user.controller > auth management > password management', () => {
217253

218254
request.params = { token: 'some-token' };
219255

220-
await updatePassword(request, response, next);
256+
await updatePassword(
257+
(request as unknown) as Request<ResetOrUpdatePasswordRequestParams>,
258+
(response as unknown) as Response,
259+
next
260+
);
221261

222262
expect(User.findOne).toHaveBeenCalledWith({
223263
resetPasswordToken: 'some-token',
@@ -233,7 +273,11 @@ describe('user.controller > auth management > password management', () => {
233273

234274
request.params = { token: 'invalid-token' };
235275

236-
await updatePassword(request, response, next);
276+
await updatePassword(
277+
(request as unknown) as Request<ResetOrUpdatePasswordRequestParams>,
278+
(response as unknown) as Response,
279+
next
280+
);
237281
});
238282
it('returns a 401', () => {
239283
expect(response.status).toHaveBeenCalledWith(401);
@@ -272,7 +316,11 @@ describe('user.controller > auth management > password management', () => {
272316
cb(null);
273317
});
274318

275-
await updatePassword(request, response, next);
319+
await updatePassword(
320+
(request as unknown) as Request<ResetOrUpdatePasswordRequestParams>,
321+
(response as unknown) as Response,
322+
next
323+
);
276324
});
277325
it('calls user.save with the updated password and removes the reset password token', () => {
278326
expect(mockUser.password).toBe('newpassword');

0 commit comments

Comments
 (0)