From 45a69eea8acad98f4209a3bc1f27d113b1bfbd6b Mon Sep 17 00:00:00 2001 From: Schneider Roland Date: Wed, 29 Oct 2025 22:56:11 +0100 Subject: [PATCH] add e2e with add groups --- src/app.module.ts | 19 ++++++++--------- src/user/dto/create-user.dto.ts | 5 ++++- src/user/user-group.service.ts | 37 +++++++++++++++++++++++++++++++++ src/user/user-role.service.ts | 37 +++++++++++++++++++++++++++++++++ src/user/user.controller.ts | 3 ++- src/user/user.module.ts | 4 +++- src/user/user.service.ts | 7 ++++++- test/user.e2e-spec.ts | 23 ++++++++++---------- 8 files changed, 110 insertions(+), 25 deletions(-) create mode 100644 src/user/user-group.service.ts create mode 100644 src/user/user-role.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index 414ee59..b816c69 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -28,17 +28,16 @@ const moduleTypeOrm = TypeOrmModule.forRootAsync({ }, }); +const envFilePath = + process.env.NODE_ENV === 'test' ? '.env.e2e' : '.env'; + +// throw new Error("envFilePath:"+envFilePath); +const moduleConfig = ConfigModule.forRoot({ + envFilePath, +}); + @Module({ - imports: [ - ConfigModule.forRoot({ - envFilePath: process.env.DATA_SOURCE_ENV - ? process.env.DATA_SOURCE_ENV - : '.env', - }), - moduleTypeOrm, - UserModule, - AuthModule, - ], + imports: [moduleConfig, moduleTypeOrm, UserModule, AuthModule], controllers: [AppController], providers: [AppService], }) diff --git a/src/user/dto/create-user.dto.ts b/src/user/dto/create-user.dto.ts index eec4673..202359b 100644 --- a/src/user/dto/create-user.dto.ts +++ b/src/user/dto/create-user.dto.ts @@ -1,4 +1,4 @@ -import { IsString, IsEmail, MinLength } from 'class-validator'; +import { IsString, IsEmail, MinLength, IsArray } from 'class-validator'; export class CreateUserDto { @IsString() @@ -11,4 +11,7 @@ export class CreateUserDto { @IsString() @MinLength(6) password: string; + + @IsArray() + roles: string[]; } diff --git a/src/user/user-group.service.ts b/src/user/user-group.service.ts new file mode 100644 index 0000000..f2e5cc6 --- /dev/null +++ b/src/user/user-group.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { UserGroup } from '../entity/user-group'; + +@Injectable() +export class UserGroupService { + constructor( + @InjectRepository(UserGroup) + private userGroupRepository: Repository, + ) {} + + findAll(): Promise { + return this.userGroupRepository.find(); + } + + findOne(id: number): Promise { + return this.userGroupRepository.findOneBy({ id }); + } + + async create(userGroup: Partial): Promise { + const newUserGroup = this.userGroupRepository.create(userGroup); + return this.userGroupRepository.save(newUserGroup); + } + + async update( + id: number, + userGroup: Partial, + ): Promise { + await this.userGroupRepository.update(id, userGroup); + return this.userGroupRepository.findOneBy({ id }); + } + + async remove(id: number): Promise { + await this.userGroupRepository.delete(id); + } +} diff --git a/src/user/user-role.service.ts b/src/user/user-role.service.ts new file mode 100644 index 0000000..e1c86ad --- /dev/null +++ b/src/user/user-role.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { UserRole } from '../entity/user-role'; + +@Injectable() +export class UserRoleService { + constructor( + @InjectRepository(UserRole) + private userGroupRepository: Repository, + ) {} + + findAll(): Promise { + return this.userGroupRepository.find(); + } + + findOne(id: number): Promise { + return this.userGroupRepository.findOneBy({ id }); + } + + async create(userGroup: Partial): Promise { + const newUserRole = this.userGroupRepository.create(userGroup); + return this.userGroupRepository.save(newUserRole); + } + + async update( + id: number, + userRole: Partial, + ): Promise { + await this.userGroupRepository.update(id, userRole); + return this.userGroupRepository.findOneBy({ id }); + } + + async remove(id: number): Promise { + await this.userGroupRepository.delete(id); + } +} diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index 169d80b..fae9a78 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -28,7 +28,8 @@ export class UserController { create( @Body(new ValidationPipe()) createUserDto: CreateUserDto, ): Promise { - return this.userService.create(createUserDto); + const { roles, ...user } = createUserDto; + return this.userService.create(user, roles); } @Get() diff --git a/src/user/user.module.ts b/src/user/user.module.ts index ccccfd4..04f1ce3 100644 --- a/src/user/user.module.ts +++ b/src/user/user.module.ts @@ -3,9 +3,11 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { UserService } from './user.service'; import { UserController } from './user.controller'; import { User } from '../entity/user'; +import { UserGroup } from '../entity/user-group'; +import { UserRole } from '../entity/user-role'; @Module({ - imports: [TypeOrmModule.forFeature([User])], + imports: [TypeOrmModule.forFeature([User, UserGroup, UserRole])], providers: [UserService], controllers: [UserController], exports: [UserService], diff --git a/src/user/user.service.ts b/src/user/user.service.ts index b8a0bba..7c6529b 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -4,12 +4,14 @@ import { Repository } from 'typeorm'; import { User } from '../entity/user'; import * as bcrypt from 'bcrypt'; import { FindOptionsRelations } from 'typeorm/find-options/FindOptionsRelations'; +import { UserGroupService } from './user-group.service'; @Injectable() export class UserService { constructor( @InjectRepository(User) private usersRepository: Repository, + private userGroupService: UserGroupService, ) {} findAll(): Promise { @@ -27,11 +29,14 @@ export class UserService { return this.usersRepository.findOne({ where: { username }, relations }); } - async create(user: Partial): Promise { + async create(user: Partial, groups?: string[]): Promise { if (user.password) { user.password = await bcrypt.hash(user.password, 12); } const newUser = this.usersRepository.create(user); + if (groups?.length) { + + } return this.usersRepository.save(newUser); } diff --git a/test/user.e2e-spec.ts b/test/user.e2e-spec.ts index 0f6d03e..f184868 100644 --- a/test/user.e2e-spec.ts +++ b/test/user.e2e-spec.ts @@ -8,8 +8,18 @@ import { UserService } from '../src/user/user.service'; import { User } from '../src/entity/user'; import { UpdateUserDto } from '../src/user/dto/update-user.dto'; +import dotenv from 'dotenv'; +import path from 'path'; + +dotenv.config({ path: path.resolve(process.cwd(), '.env.e2e') }); + describe('UserController (e2e)', () => { process.env.DATA_SOURCE_ENV = '.env.e2e'; + process.env.DATABASE_HOST = 'localhost'; + process.env.DATABASE_PORT = '4401'; + process.env.DATABASE_USER = 'test'; + process.env.DATABASE_PASS = 'test'; + let app: INestApplication; let jwtToken: string; let adminUserId: number; @@ -25,13 +35,6 @@ describe('UserController (e2e)', () => { await app.init(); const userService = moduleFixture.get(UserService); - const adminUser = await userService.create({ - username: 'e2e_admin', - password: 'password', - email: "admin@dvbooking.hu", - roles: [Role.Admin], - }); - adminUserId = adminUser.id; const response = await request(app.getHttpServer()) .post('/auth/login') @@ -41,8 +44,6 @@ describe('UserController (e2e)', () => { }); afterAll(async () => { - const userService = app.get(UserService); - await userService.remove(adminUserId); await app.close(); }); @@ -59,8 +60,8 @@ describe('UserController (e2e)', () => { it('(POST) should create a user', async () => { const createUserDto: CreateUserDto = { username: 'e2e_user', + email: 'user@dvbooking.hu', password: 'password', - roles: [Role.User], }; const response = await request(app.getHttpServer()) @@ -84,8 +85,8 @@ describe('UserController (e2e)', () => { userService = app.get(UserService); user = await userService.create({ username: 'e2e_test_user', + email: 'e2e_test_user@dvbooking.hu', password: 'password', - roles: [Role.User], }); });