Skip to content

Commit f191eb3

Browse files
author
hersveit
committed
auth controller tests: in work
1 parent cd28016 commit f191eb3

File tree

7 files changed

+179
-98
lines changed

7 files changed

+179
-98
lines changed

Dockerfile

Lines changed: 0 additions & 40 deletions
This file was deleted.

migrations.js

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
import * as cookieParser from 'cookie-parser';
2+
import { sha256 } from './../../../utils/crypt.utils';
3+
import { EmailAlreadyConfirmed, EmailNotConfirmed } from './../../../services/auth/auth.model';
4+
import { getErrorStub } from './../../../__mocks__/error.stub';
5+
import { UserAlreadyExist, EmailOrPasswordIncorrect } from './../../../services/user/user.model';
6+
import * as request from 'supertest';
7+
import { AuthControllerProvider } from './../auth.controller';
8+
import { MailServiceProvider } from './../../../services/mail/mail.service';
9+
import { RefreshTokensRepositoryProvider } from './../../../repositories/refreshTokens/refreshTokens.repository';
10+
import { EmailConfirmsRepositoryProvider } from './../../../repositories/emailConfirms/emailConfirms.repository';
11+
import { AuthServiceProvider } from './../../../services/auth/auth.service';
12+
import { createMock, DeepMocked } from '@golevelup/ts-jest';
13+
import { RequestContextModule } from '@medibloc/nestjs-request-context';
14+
import { JwtModule } from '@nestjs/jwt';
15+
import { Test } from '@nestjs/testing';
16+
import { HttpInterceptor } from '../../../core/interceptor.core';
17+
import { ErrorsRepositoryProvider } from '../../../repositories/errors/errors.repository';
18+
import { UsersRepositoryProvider } from '../../../repositories/users/users.repository';
19+
import { JwtStrategy } from '../../../services/auth/strategies/jwt.strategy';
20+
import { ConfigServiceProvider } from '../../../services/config/config.service';
21+
import { ErrorsServiceProvider } from '../../../services/errors/errors.service';
22+
import { UserServiceProvider } from '../../../services/user/user.service';
23+
import { ConfigServiceFake } from '../../../__mocks__/ConfigServiceFake';
24+
import { TransactionsContextFake } from '../../../__mocks__/TransactionsContextFake';
25+
import { AppWrap } from './../../../utils/tests.utils';
26+
import { JwtRefreshTokenStrategy } from '../../../services/auth/strategies/jwt-refresh.strategy';
27+
import { getUserStub } from '../../../__mocks__/user.stub';
28+
import { getConfirmEmailStub } from '../../../__mocks__/confirmEmail.stub';
29+
import { DatabaseServiceProvider } from '../../../services/database/database.service';
30+
import { EmailConfirm, RefreshToken, User } from '@prisma/client';
31+
32+
describe('AuthController', () => {
33+
const appWrap = {} as AppWrap;
34+
let authService: DeepMocked<AuthServiceProvider>;
35+
let userService: DeepMocked<UserServiceProvider>;
36+
let errorsService: DeepMocked<ErrorsServiceProvider>;
37+
let mailService: DeepMocked<MailServiceProvider>;
38+
let db: {
39+
Prisma: DeepMocked<DatabaseServiceProvider['Prisma']>;
40+
};
41+
42+
let REFRESH_TOKEN: RefreshToken;
43+
let USER: User & { refreshToken: RefreshToken | null; emailConfirm: EmailConfirm | null };
44+
45+
beforeAll(async () => {
46+
const dbMock = createMock<DeepMocked<DatabaseServiceProvider['Prisma']>>();
47+
const configService = new ConfigServiceFake();
48+
const module = await Test.createTestingModule({
49+
imports: [
50+
JwtModule.register({
51+
secret: configService.JWT_SECRET,
52+
signOptions: { expiresIn: configService.JWT_EXPIRES_IN },
53+
}),
54+
RequestContextModule.forRoot({
55+
contextClass: TransactionsContextFake,
56+
isGlobal: true,
57+
}),
58+
],
59+
providers: [
60+
{
61+
provide: ConfigServiceProvider,
62+
useClass: ConfigServiceFake,
63+
},
64+
{
65+
provide: DatabaseServiceProvider,
66+
useValue: {
67+
get Prisma() {
68+
return dbMock;
69+
},
70+
},
71+
},
72+
{
73+
provide: AuthServiceProvider,
74+
useValue: createMock<AuthServiceProvider>(),
75+
},
76+
{
77+
provide: UserServiceProvider,
78+
useValue: createMock<UserServiceProvider>(),
79+
},
80+
{
81+
provide: ErrorsServiceProvider,
82+
useValue: createMock<ErrorsServiceProvider>(),
83+
},
84+
{
85+
provide: MailServiceProvider,
86+
useValue: createMock<MailServiceProvider>(),
87+
},
88+
JwtStrategy,
89+
JwtRefreshTokenStrategy,
90+
],
91+
controllers: [AuthControllerProvider],
92+
}).compile();
93+
94+
authService = module.get(AuthServiceProvider);
95+
userService = module.get(UserServiceProvider);
96+
errorsService = module.get(ErrorsServiceProvider);
97+
mailService = module.get(MailServiceProvider);
98+
db = module.get(DatabaseServiceProvider);
99+
100+
appWrap.app = module.createNestApplication();
101+
appWrap.app.useGlobalInterceptors(
102+
new HttpInterceptor(db as unknown as DatabaseServiceProvider),
103+
);
104+
appWrap.app.use(cookieParser());
105+
await appWrap.app.init();
106+
107+
db.Prisma.$transaction.mockImplementation((cb: (arg: any) => any) => cb({}));
108+
});
109+
110+
afterAll(async () => {
111+
await appWrap.app.close();
112+
});
113+
114+
beforeEach(() => {
115+
USER = getUserStub();
116+
REFRESH_TOKEN = {
117+
id: 0,
118+
hash: 'e1eae9e373ba62a80cdbd4422fc002553447aeb38fdb8dbf511a52d3e8c5e417',
119+
userId: 0,
120+
};
121+
});
122+
123+
const successSetupForGenerateTokens = () => {
124+
userService.findVerifiedUser.mockResolvedValue({
125+
...USER,
126+
emailConfirmed: true,
127+
hash: 'ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f',
128+
});
129+
};
130+
131+
const successSetupSignIn = () => {
132+
userService.findVerifiedUser.mockResolvedValue({
133+
...USER,
134+
emailConfirmed: true,
135+
hash: 'ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f',
136+
});
137+
successSetupForGenerateTokens();
138+
};
139+
140+
describe('POST /api/auth/sign-up', () => {
141+
it('should work dto validation', async () => {
142+
const response = await request(appWrap.app.getHttpServer())
143+
.post('/api/auth/sign-up')
144+
.set('Content-Type', 'application/x-www-form-urlencoded')
145+
.send({ email: getUserStub().email });
146+
147+
expect(response.statusCode).toBe(400);
148+
expect(response.body.error).toBe('Bad Request');
149+
150+
const response1 = await request(appWrap.app.getHttpServer())
151+
.post('/api/auth/sign-up')
152+
.set('Content-Type', 'application/x-www-form-urlencoded')
153+
.send({ password: '123456789' });
154+
155+
expect(response1.statusCode).toBe(400);
156+
expect(response1.body.error).toBe('Bad Request');
157+
});
158+
});
159+
});

src/controllers/auth/auth.controller.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export class AuthControllerProvider {
2727
@Post('sign-up')
2828
@UseValidationPipe()
2929
async signUp(@Body() body: SignUpInput) {
30+
console.log('inside controller', body);
3031
const signUpResult = await this.authService.signUp(body);
3132
if (isError(signUpResult)) {
3233
return await processControllerError(signUpResult, this.errorsService);

src/core/interceptor.core.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,9 @@ export class HttpInterceptor implements NestInterceptor {
2626
): Promise<Observable<unknown>> {
2727
const response: Response = context.switchToHttp().getResponse();
2828
const ctx = RequestContext.get<TransactionsContext>();
29-
3029
return from(
3130
this.db.Prisma.$transaction((prisma) => {
3231
ctx.transactions.init(prisma);
33-
3432
return next
3533
.handle()
3634
.pipe(

src/services/errors/__tests__/errors.service.spec.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ describe('ErrorsService', () => {
5757

5858
expect(isError(result)).toBeFalsy();
5959
expect(result).toEqual({ uuid: error.uuid });
60+
expect(db.Prisma.error.create).toBeCalledTimes(1);
61+
expect(db.Prisma.error.create).toBeCalledWith({
62+
data: {
63+
uuid: 'uuid-1',
64+
userId: -1,
65+
error: error.error,
66+
stack: '',
67+
message: undefined,
68+
payload: undefined,
69+
},
70+
});
6071
});
6172
});
6273

@@ -77,6 +88,12 @@ describe('ErrorsService', () => {
7788

7889
expect(isError(result)).toBeFalsy();
7990
expect(result).toEqual(error);
91+
expect(errorsRepository.Dao.findFirst).toBeCalledTimes(1);
92+
expect(errorsRepository.Dao.findFirst).toBeCalledWith({
93+
where: {
94+
uuid: '',
95+
},
96+
});
8097
});
8198
});
8299
});

src/services/user/user.service.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export class UserServiceProvider {
3333
if (user === null || user.hash !== sha256(password)) {
3434
return new EmailOrPasswordIncorrect();
3535
}
36+
3637
return user;
3738
}
3839

@@ -55,6 +56,7 @@ export class UserServiceProvider {
5556
where,
5657
include: { refreshToken: true, emailConfirm: true },
5758
});
59+
5860
return user || new CannotFindUser();
5961
}
6062
}

0 commit comments

Comments
 (0)