fix: use req + update unit tests

This commit is contained in:
Emnaghz 2024-09-23 11:17:19 +01:00
parent a999604472
commit d2f61eebcd
2 changed files with 34 additions and 33 deletions

View File

@ -12,7 +12,7 @@ import { ForbiddenException, NotFoundException } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter'; import { EventEmitter2 } from '@nestjs/event-emitter';
import { MongooseModule } from '@nestjs/mongoose'; import { MongooseModule } from '@nestjs/mongoose';
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { Session as ExpressSession } from 'express-session'; import { Request } from 'express';
import { AttachmentRepository } from '@/attachment/repositories/attachment.repository'; import { AttachmentRepository } from '@/attachment/repositories/attachment.repository';
import { AttachmentModel } from '@/attachment/schemas/attachment.schema'; import { AttachmentModel } from '@/attachment/schemas/attachment.schema';
@ -191,45 +191,48 @@ describe('RoleController', () => {
describe('deleteOne', () => { describe('deleteOne', () => {
it("should throw ForbiddenException if the role is part of the user's roles", async () => { it("should throw ForbiddenException if the role is part of the user's roles", async () => {
const session = { passport: { user: { id: 'user1' } } } as ExpressSession; const req = { user: { roles: ['role1'] } } as unknown as Request;
const roleId = 'role1'; const roleId = 'role1';
userService.findOneAndPopulate = jest.fn().mockResolvedValue({ userService.findOne = jest.fn().mockResolvedValue(null);
roles: [{ id: roleId }],
});
await expect(roleController.deleteOne(roleId, session)).rejects.toThrow( await expect(roleController.deleteOne(roleId, req)).rejects.toThrow(
ForbiddenException,
);
});
it('should throw ForbiddenException if the role is associated with other users', async () => {
const req = { user: { roles: ['role2'] } } as unknown as Request;
const roleId = 'role1';
userService.findOne = jest.fn().mockResolvedValue({ id: 'user2' });
await expect(roleController.deleteOne(roleId, req)).rejects.toThrow(
ForbiddenException, ForbiddenException,
); );
}); });
it('should throw NotFoundException if the role is not found', async () => { it('should throw NotFoundException if the role is not found', async () => {
const session = { passport: { user: { id: 'user1' } } } as ExpressSession; const req = { user: { roles: ['role2'] } } as unknown as Request;
const roleId = 'role2'; const roleId = 'role1';
userService.findOneAndPopulate = jest.fn().mockResolvedValue({
roles: [{ id: 'role1' }],
});
userService.findOne = jest.fn().mockResolvedValue(null);
roleService.deleteOne = jest.fn().mockResolvedValue({ deletedCount: 0 }); roleService.deleteOne = jest.fn().mockResolvedValue({ deletedCount: 0 });
await expect(roleController.deleteOne(roleId, session)).rejects.toThrow( await expect(roleController.deleteOne(roleId, req)).rejects.toThrow(
NotFoundException, NotFoundException,
); );
}); });
it('should return the result if the role is successfully deleted', async () => { it('should return the result if the role is successfully deleted', async () => {
const session = { passport: { user: { id: 'user1' } } } as ExpressSession; const req = { user: { roles: ['role2'] } } as unknown as Request;
const roleId = 'role2'; const roleId = 'role1';
userService.findOneAndPopulate = jest.fn().mockResolvedValue({
roles: [{ id: 'role1' }],
});
userService.findOne = jest.fn().mockResolvedValue(null);
const deleteResult = { deletedCount: 1 }; const deleteResult = { deletedCount: 1 };
roleService.deleteOne = jest.fn().mockResolvedValue(deleteResult); roleService.deleteOne = jest.fn().mockResolvedValue(deleteResult);
const result = await roleController.deleteOne(roleId, session); const result = await roleController.deleteOne(roleId, req);
expect(result).toEqual(deleteResult); expect(result).toEqual(deleteResult);
}); });
}); });

View File

@ -20,10 +20,10 @@ import {
Query, Query,
UseInterceptors, UseInterceptors,
ForbiddenException, ForbiddenException,
Session, Req,
} from '@nestjs/common'; } from '@nestjs/common';
import { CsrfCheck } from '@tekuconcept/nestjs-csrf'; import { CsrfCheck } from '@tekuconcept/nestjs-csrf';
import { Session as ExpressSession } from 'express-session'; import { Request } from 'express';
import { TFilterQuery } from 'mongoose'; import { TFilterQuery } from 'mongoose';
import { CsrfInterceptor } from '@/interceptors/csrf.interceptor'; import { CsrfInterceptor } from '@/interceptors/csrf.interceptor';
@ -36,6 +36,7 @@ import { SearchFilterPipe } from '@/utils/pipes/search-filter.pipe';
import { RoleCreateDto, RoleUpdateDto } from '../dto/role.dto'; import { RoleCreateDto, RoleUpdateDto } from '../dto/role.dto';
import { Role, RoleFull, RolePopulate, RoleStub } from '../schemas/role.schema'; import { Role, RoleFull, RolePopulate, RoleStub } from '../schemas/role.schema';
import { User } from '../schemas/user.schema';
import { RoleService } from '../services/role.service'; import { RoleService } from '../services/role.service';
import { UserService } from '../services/user.service'; import { UserService } from '../services/user.service';
@ -152,19 +153,16 @@ export class RoleController extends BaseController<
@CsrfCheck(true) @CsrfCheck(true)
@Delete(':id') @Delete(':id')
@HttpCode(204) @HttpCode(204)
async deleteOne(@Param('id') id: string, @Session() session: ExpressSession) { async deleteOne(@Param('id') id: string, @Req() req: Request) {
const currentUser = await this.userService.findOneAndPopulate( const userRoles = (req.user as User).roles;
session.passport.user.id,
['roles'],
);
if (!currentUser) {
throw new NotFoundException('User not found');
}
const roles = currentUser.roles.map((role) => role.id); const associatedUser = await this.userService.findOne({
roles: { $in: [id] },
if (roles.includes(id)) { });
if (userRoles.includes(id)) {
throw new ForbiddenException("Your account's role can't be deleted"); throw new ForbiddenException("Your account's role can't be deleted");
} else if (associatedUser) {
throw new ForbiddenException('Role is associated with other users');
} else { } else {
try { try {
const result = await this.roleService.deleteOne(id); const result = await this.roleService.deleteOne(id);