Skip to content

Commit 5197ccc

Browse files
committed
Move confirm email back to auth controller and fix tests
1 parent 48c1dd5 commit 5197ccc

File tree

6 files changed

+40
-32
lines changed

6 files changed

+40
-32
lines changed

apps/api/src/auth-emails/auth-emails.module.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { AuthEmailsController } from './auth-emails.controller';
66
import { AuthEmailsService } from './auth-emails.service';
77

88
@Module({
9-
imports: [EmailsModule, forwardRef(() => AuthModule), UsersModule],
9+
imports: [EmailsModule, UsersModule, forwardRef(() => AuthModule)],
1010
providers: [AuthEmailsService],
1111
controllers: [AuthEmailsController],
1212
exports: [AuthEmailsService],

apps/api/src/auth/auth.controller.spec.ts

+20-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { DemoService } from '../demo/demo.service';
44
import { AuthController } from './auth.controller';
55
import { AuthService } from './auth.service';
66
import { UserRegisterDto } from './dto/user-register.dto';
7+
import { AuthEmailsService } from '../auth-emails/auth-emails.service';
78

89
describe('AuthController', () => {
910
let controller: AuthController;
@@ -23,15 +24,23 @@ describe('AuthController', () => {
2324
}),
2425
};
2526

27+
const mockAuthEmailService = {
28+
sendEmailConfirmation: jest.fn(() => Promise.resolve()),
29+
};
30+
31+
const sendEmailConfirmationSpy = jest.spyOn(mockAuthEmailService, 'sendEmailConfirmation');
32+
2633
beforeEach(async () => {
2734
const module: TestingModule = await Test.createTestingModule({
2835
controllers: [AuthController],
29-
providers: [AuthService, DemoService],
36+
providers: [AuthService, DemoService, AuthEmailsService],
3037
})
3138
.overrideProvider(AuthService)
3239
.useValue(mockAuthService)
3340
.overrideProvider(DemoService)
3441
.useValue(mockDemoService)
42+
.overrideProvider(AuthEmailsService)
43+
.useValue(mockAuthEmailService)
3544
.compile();
3645

3746
controller = module.get<AuthController>(AuthController);
@@ -41,14 +50,20 @@ describe('AuthController', () => {
4150
expect(controller).toBeDefined();
4251
});
4352

44-
it('should register', () => {
45-
expect(
46-
controller.register({ email: '[email protected]', username: 'test', password: 'test' }),
47-
).resolves.toEqual(
53+
it('should register', async () => {
54+
const user = await controller.register({
55+
56+
username: 'test',
57+
password: 'test',
58+
});
59+
expect(user).toEqual(
4860
expect.objectContaining({
4961
5062
}),
5163
);
64+
65+
expect(sendEmailConfirmationSpy).toBeCalledTimes(1);
66+
expect(sendEmailConfirmationSpy).toBeCalledWith(user.id);
5267
});
5368

5469
it('should create demo account', async () => {

apps/api/src/auth/auth.controller.ts

+10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
Body,
44
Controller,
55
HttpCode,
6+
Logger,
67
Post,
78
Req,
89
UseGuards,
@@ -16,15 +17,19 @@ import { AuthService } from './auth.service';
1617
import { UserRegisterDto } from './dto/user-register.dto';
1718
import { AuthenticatedGuard } from './guards/authenticated.guard';
1819
import { LocalAuthGuard } from './guards/local-auth.guard';
20+
import { AuthEmailsService } from '../auth-emails/auth-emails.service';
1921

2022
@Controller('auth')
2123
@ApiTags('auth')
2224
export class AuthController {
2325
constructor(
2426
private readonly authService: AuthService,
2527
private readonly demoService: DemoService,
28+
private readonly authEmailsService: AuthEmailsService,
2629
) {}
2730

31+
private readonly logger = new Logger(AuthController.name);
32+
2833
@UseGuards(LocalAuthGuard)
2934
@HttpCode(200)
3035
@Post('login')
@@ -50,6 +55,11 @@ export class AuthController {
5055
@Post('register')
5156
async register(@Body() body: UserRegisterDto): Promise<PrivateUserDto> {
5257
const user = await this.authService.registerUser(body);
58+
59+
await this.authEmailsService.sendEmailConfirmation(user._id).catch((error) => {
60+
this.logger.error(`Failed to send initial confirmation email for ${user._id} - ${error}`);
61+
});
62+
5363
return User.toPrivateDto(user);
5464
}
5565

apps/api/src/auth/auth.module.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ import { SessionSerializer } from './session.serializer';
1111
import { LocalStrategy } from './strategies/local.strategy';
1212

1313
@Module({
14-
imports: [UsersModule, DemoModule, PassportModule.register({ session: true })],
14+
imports: [
15+
UsersModule,
16+
DemoModule,
17+
PassportModule.register({ session: true }),
18+
forwardRef(() => AuthEmailsModule),
19+
],
1520
controllers: [AuthController],
1621
providers: [
1722
AuthService,

apps/api/src/auth/auth.service.spec.ts

-12
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@ describe('AuthService', () => {
4141
}),
4242
};
4343

44-
const mockAuthEmailService = {
45-
sendEmailConfirmation: jest.fn(() => Promise.resolve()),
46-
};
47-
48-
const sendEmailConfirmationSpy = jest.spyOn(mockAuthEmailService, 'sendEmailConfirmation');
49-
5044
beforeEach(async () => {
5145
const module: TestingModule = await Test.createTestingModule({
5246
providers: [
@@ -55,10 +49,6 @@ describe('AuthService', () => {
5549
provide: UsersService,
5650
useValue: mockAuthService,
5751
},
58-
{
59-
provide: AuthEmailsService,
60-
useValue: mockAuthEmailService,
61-
},
6252
],
6353
}).compile();
6454

@@ -83,8 +73,6 @@ describe('AuthService', () => {
8373
expect(user).toEqual(
8474
expect.objectContaining({ profile: expect.objectContaining({ username: 'username' }) }),
8575
);
86-
expect(sendEmailConfirmationSpy).toBeCalledTimes(1);
87-
expect(sendEmailConfirmationSpy).toBeCalledWith(user._id);
8876
});
8977

9078
describe('User validation', () => {

apps/api/src/auth/auth.service.ts

+3-13
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
1-
import { Injectable, Logger } from '@nestjs/common';
1+
import { Injectable } from '@nestjs/common';
22
import * as bcrypt from 'bcrypt';
3+
import { Types } from 'mongoose';
34
import { UserDocument } from '../models/users/schemas/user.schema';
45
import { UsersService } from '../models/users/users.service';
56
import { UserRegisterDto } from './dto/user-register.dto';
6-
import { Types } from 'mongoose';
7-
import { AuthEmailsService } from '../auth-emails/auth-emails.service';
87

98
@Injectable()
109
export class AuthService {
11-
constructor(
12-
private usersService: UsersService,
13-
private authEmailService: AuthEmailsService,
14-
) {}
15-
16-
private readonly logger = new Logger(AuthService.name);
10+
constructor(private usersService: UsersService) {}
1711

1812
async registerUser(data: UserRegisterDto): Promise<UserDocument> {
1913
const hash = await this.hashPassword(data.password);
@@ -24,10 +18,6 @@ export class AuthService {
2418
passwordHash: hash,
2519
});
2620

27-
await this.authEmailService.sendEmailConfirmation(user._id).catch((error) => {
28-
this.logger.error(`Failed to send initial confirmation email for ${user._id} - ${error}`);
29-
});
30-
3121
return user;
3222
}
3323

0 commit comments

Comments
 (0)