Skip to content

Commit a0155f5

Browse files
committed
feat: implement validation in rest-express
1 parent 17410d6 commit a0155f5

28 files changed

+885
-765
lines changed
Lines changed: 36 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
import { impersonate } from '../../src/endpoints/impersonate';
1+
import 'reflect-metadata';
2+
import request from 'supertest';
3+
import accountsExpress from '../../src/express-middleware';
4+
import express from 'express';
25

3-
const res: any = {
4-
json: jest.fn(),
5-
status: jest.fn(() => res),
6-
};
6+
function getApp(accountsServer: any, path?: string) {
7+
const router = accountsExpress(accountsServer as any, { path: path ?? '' });
8+
const expressApp = express();
9+
expressApp.use(express.json());
10+
expressApp.use(express.urlencoded({ extended: true }));
11+
expressApp.use(router);
12+
return expressApp;
13+
}
714

815
describe('impersonate', () => {
916
beforeEach(() => {
@@ -15,57 +22,44 @@ describe('impersonate', () => {
1522
id: '1',
1623
};
1724
const accountsServer = {
25+
getServices: () => jest.fn(),
1826
impersonate: jest.fn(() => impersonateReturnType),
1927
};
20-
const middleware = impersonate(accountsServer as any);
21-
22-
const req = {
23-
body: {
24-
impersonated: 'toto',
25-
accessToken: 'token',
26-
},
27-
headers: {},
28-
infos: {
29-
ip: 'ipTest',
30-
userAgent: 'userAgentTest',
31-
},
28+
const body = {
29+
impersonated: { username: 'toto' },
30+
accessToken: 'token',
3231
};
33-
const reqCopy = { ...req };
34-
35-
await middleware(req as any, res);
32+
const response = await request(getApp(accountsServer)).post('/impersonate').send(body);
3633

37-
expect(req).toEqual(reqCopy);
38-
expect(accountsServer.impersonate).toHaveBeenCalledWith('token', 'toto', req.infos);
39-
expect(res.json).toHaveBeenCalledWith(impersonateReturnType);
40-
expect(res.status).not.toHaveBeenCalled();
34+
expect(response.status).toEqual(200);
35+
expect(response.body).toEqual(impersonateReturnType);
36+
expect(accountsServer.impersonate).toHaveBeenCalledWith(
37+
'token',
38+
{ username: 'toto' },
39+
expect.anything()
40+
);
4141
});
4242

4343
it('Sends error if it was thrown on impersonate', async () => {
4444
const error = { message: 'Could not impersonate' };
4545
const accountsServer = {
46+
getServices: () => jest.fn(),
4647
impersonate: jest.fn(() => {
4748
throw error;
4849
}),
4950
};
50-
const middleware = impersonate(accountsServer as any);
51-
const req = {
52-
body: {
53-
impersonated: 'toto',
54-
accessToken: 'token',
55-
},
56-
headers: {},
57-
infos: {
58-
ip: 'ipTest',
59-
userAgent: 'userAgentTest',
60-
},
51+
const body = {
52+
impersonated: { username: 'toto' },
53+
accessToken: 'token',
6154
};
62-
const reqCopy = { ...req };
63-
64-
await middleware(req as any, res);
55+
const response = await request(getApp(accountsServer)).post('/impersonate').send(body);
6556

66-
expect(req).toEqual(reqCopy);
67-
expect(accountsServer.impersonate).toHaveBeenCalledWith('token', 'toto', req.infos);
68-
expect(res.status).toHaveBeenCalledWith(400);
69-
expect(res.json).toHaveBeenCalledWith(error);
57+
expect(response.status).toEqual(400);
58+
expect(response.body).toEqual(error);
59+
expect(accountsServer.impersonate).toHaveBeenCalledWith(
60+
'token',
61+
{ username: 'toto' },
62+
expect.anything()
63+
);
7064
});
7165
});
Lines changed: 35 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
import 'reflect-metadata';
22
import { RequestMagicLinkEmailErrors } from '@accounts/magic-link';
33
import { AccountsJsError } from '@accounts/server';
4-
import { requestMagicLinkEmail } from '../../../src/endpoints/magic-link/request-magic-link-email';
4+
import request from 'supertest';
5+
import accountsExpress from '../../../src/express-middleware';
6+
import express from 'express';
57

6-
const res: any = {
7-
json: jest.fn(),
8-
status: jest.fn(() => res),
9-
};
8+
function getApp(accountsServer: any, path?: string) {
9+
const router = accountsExpress(accountsServer as any, { path: path ?? '' });
10+
const expressApp = express();
11+
expressApp.use(express.json());
12+
expressApp.use(express.urlencoded({ extended: true }));
13+
expressApp.use(router);
14+
return expressApp;
15+
}
1016

1117
describe('verifyEmail', () => {
1218
beforeEach(() => {
@@ -23,24 +29,18 @@ describe('verifyEmail', () => {
2329
magicLink: magicLinkService,
2430
}),
2531
};
26-
const middleware = requestMagicLinkEmail(accountsServer as any);
27-
28-
const req = {
29-
body: {
30-
email: 'email',
31-
},
32-
headers: {},
32+
const body = {
33+
3334
};
34-
const reqCopy = { ...req };
35+
const response = await request(getApp(accountsServer))
36+
.post('/magiclink/requestMagicLinkEmail')
37+
.send(body);
3538

36-
await middleware(req as any, res);
37-
38-
expect(req).toEqual(reqCopy);
39+
expect(response.status).toEqual(200);
40+
expect(response.body).toEqual(null);
3941
expect(accountsServer.getServices().magicLink.requestMagicLinkEmail).toHaveBeenCalledWith(
40-
'email'
42+
'valid@email.com'
4143
);
42-
expect(res.json).toHaveBeenCalledWith(null);
43-
expect(res.status).not.toHaveBeenCalled();
4444
});
4545

4646
it('Sends error if it was thrown on requestMagicLinkEmail', async () => {
@@ -56,23 +56,18 @@ describe('verifyEmail', () => {
5656
magicLink: magicLinkService,
5757
}),
5858
};
59-
const middleware = requestMagicLinkEmail(accountsServer as any);
60-
const req = {
61-
body: {
62-
email: 'email',
63-
},
64-
headers: {},
59+
const body = {
60+
6561
};
66-
const reqCopy = { ...req };
62+
const response = await request(getApp(accountsServer))
63+
.post('/magiclink/requestMagicLinkEmail')
64+
.send(body);
6765

68-
await middleware(req as any, res);
69-
70-
expect(req).toEqual(reqCopy);
66+
expect(response.status).toEqual(400);
67+
expect(response.body).toEqual(error);
7168
expect(accountsServer.getServices().magicLink.requestMagicLinkEmail).toHaveBeenCalledWith(
72-
'email'
69+
'valid@email.com'
7370
);
74-
expect(res.status).toHaveBeenCalledWith(400);
75-
expect(res.json).toHaveBeenCalledWith(error);
7671
});
7772

7873
it('hide UserNotFound error when ambiguousErrorMessages is true', async () => {
@@ -90,23 +85,18 @@ describe('verifyEmail', () => {
9085
magicLink: magicLinkService,
9186
}),
9287
};
93-
const middleware = requestMagicLinkEmail(accountsServer as any);
94-
const req = {
95-
body: {
96-
email: 'email',
97-
},
98-
headers: {},
88+
const body = {
89+
9990
};
100-
const reqCopy = { ...req };
101-
102-
await middleware(req as any, res);
91+
const response = await request(getApp(accountsServer))
92+
.post('/magiclink/requestMagicLinkEmail')
93+
.send(body);
10394

104-
expect(req).toEqual(reqCopy);
95+
expect(response.status).toEqual(200);
96+
expect(response.body).toEqual(null);
10597
expect(accountsServer.getServices().magicLink.requestMagicLinkEmail).toHaveBeenCalledWith(
106-
'email'
98+
'valid@email.com'
10799
);
108-
expect(res.json).toHaveBeenCalledWith(null);
109-
expect(res.status).not.toHaveBeenCalled();
110100
});
111101
});
112102
});
Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
import { addEmail } from '../../../src/endpoints/password/add-email';
1+
import 'reflect-metadata';
2+
import request from 'supertest';
3+
import accountsExpress from '../../../src/express-middleware';
4+
import express from 'express';
25

3-
const res: any = {
4-
json: jest.fn(),
5-
status: jest.fn(() => res),
6-
};
6+
function getApp(accountsServer: any, path?: string) {
7+
const router = accountsExpress(accountsServer as any, { path: path ?? '' });
8+
const expressApp = express();
9+
expressApp.use(express.json());
10+
expressApp.use(express.urlencoded({ extended: true }));
11+
expressApp.use(router);
12+
return expressApp;
13+
}
714

815
describe('addEmail', () => {
916
beforeEach(() => {
@@ -19,34 +26,37 @@ describe('addEmail', () => {
1926
getServices: () => ({
2027
password: passwordService,
2128
}),
29+
resumeSession: jest.fn(() => ({ id: 'userId' })),
2230
};
23-
const middleware = addEmail(accountsServer as any);
2431

25-
const req = {
26-
userId: 'userId',
27-
body: {
28-
newEmail: 'newEmail',
29-
},
32+
const body = {
33+
accessToken: 'token',
34+
newEmail: '[email protected]',
3035
};
31-
const reqCopy = { ...req };
36+
const response = await request(getApp(accountsServer)).post('/password/addEmail').send(body);
3237

33-
await middleware(req as any, res);
34-
35-
expect(req).toEqual(reqCopy);
38+
expect(response.status).toEqual(200);
39+
expect(response.body).toEqual(null);
3640
expect(accountsServer.getServices().password.addEmail).toHaveBeenCalledWith(
3741
'userId',
38-
'newEmail'
42+
'valid@newEmail.com'
3943
);
40-
expect(res.json).toHaveBeenCalled();
41-
expect(res.status).not.toHaveBeenCalled();
4244
});
4345

4446
it('Sends error if no userId', async () => {
45-
const middleware = addEmail(null as any);
46-
await middleware({} as any, res);
47+
const passwordService = {
48+
addEmail: jest.fn(() => null),
49+
};
50+
const accountsServer = {
51+
getServices: () => ({
52+
password: passwordService,
53+
}),
54+
resumeSession: jest.fn(() => undefined),
55+
};
56+
const response = await request(getApp(accountsServer)).post('/password/addEmail');
4757

48-
expect(res.status).toHaveBeenCalledWith(401);
49-
expect(res.json).toHaveBeenCalled();
58+
expect(response.status).toEqual(401);
59+
expect(response.body).toEqual({ message: 'Unauthorized' });
5060
});
5161

5262
it('Sends error if it was thrown on addEmail', async () => {
@@ -60,25 +70,20 @@ describe('addEmail', () => {
6070
getServices: () => ({
6171
password: passwordService,
6272
}),
73+
resumeSession: jest.fn(() => ({ id: 'userId' })),
6374
};
64-
const middleware = addEmail(accountsServer as any);
65-
const req = {
66-
userId: 'userId',
67-
body: {
68-
newEmail: 'newEmail',
69-
},
75+
const body = {
76+
accessToken: 'token',
77+
newEmail: '[email protected]',
7078
};
71-
const reqCopy = { ...req };
72-
73-
await middleware(req as any, res);
79+
const response = await request(getApp(accountsServer)).post('/password/addEmail').send(body);
7480

75-
expect(req).toEqual(reqCopy);
81+
expect(response.status).toEqual(400);
82+
expect(response.body).toEqual(error);
7683
expect(accountsServer.getServices().password.addEmail).toHaveBeenCalledWith(
7784
'userId',
78-
'newEmail'
85+
'valid@newEmail.com'
7986
);
80-
expect(res.status).toHaveBeenCalledWith(400);
81-
expect(res.json).toHaveBeenCalledWith(error);
8287
});
8388
});
8489
});

0 commit comments

Comments
 (0)