add e2e with add groups

This commit is contained in:
Schneider Roland 2025-10-29 22:56:11 +01:00
parent 2f54770720
commit 45a69eea8a
8 changed files with 110 additions and 25 deletions

View File

@ -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],
})

View File

@ -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[];
}

View File

@ -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<UserGroup>,
) {}
findAll(): Promise<UserGroup[]> {
return this.userGroupRepository.find();
}
findOne(id: number): Promise<UserGroup | null> {
return this.userGroupRepository.findOneBy({ id });
}
async create(userGroup: Partial<UserGroup>): Promise<UserGroup> {
const newUserGroup = this.userGroupRepository.create(userGroup);
return this.userGroupRepository.save(newUserGroup);
}
async update(
id: number,
userGroup: Partial<UserGroup>,
): Promise<UserGroup | null> {
await this.userGroupRepository.update(id, userGroup);
return this.userGroupRepository.findOneBy({ id });
}
async remove(id: number): Promise<void> {
await this.userGroupRepository.delete(id);
}
}

View File

@ -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<UserRole>,
) {}
findAll(): Promise<UserRole[]> {
return this.userGroupRepository.find();
}
findOne(id: number): Promise<UserRole | null> {
return this.userGroupRepository.findOneBy({ id });
}
async create(userGroup: Partial<UserRole>): Promise<UserRole> {
const newUserRole = this.userGroupRepository.create(userGroup);
return this.userGroupRepository.save(newUserRole);
}
async update(
id: number,
userRole: Partial<UserRole>,
): Promise<UserRole | null> {
await this.userGroupRepository.update(id, userRole);
return this.userGroupRepository.findOneBy({ id });
}
async remove(id: number): Promise<void> {
await this.userGroupRepository.delete(id);
}
}

View File

@ -28,7 +28,8 @@ export class UserController {
create(
@Body(new ValidationPipe()) createUserDto: CreateUserDto,
): Promise<User> {
return this.userService.create(createUserDto);
const { roles, ...user } = createUserDto;
return this.userService.create(user, roles);
}
@Get()

View File

@ -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],

View File

@ -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<User>,
private userGroupService: UserGroupService,
) {}
findAll(): Promise<User[]> {
@ -27,11 +29,14 @@ export class UserService {
return this.usersRepository.findOne({ where: { username }, relations });
}
async create(user: Partial<User>): Promise<User> {
async create(user: Partial<User>, groups?: string[]): Promise<User> {
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);
}

View File

@ -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>(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>(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>(UserService);
user = await userService.create({
username: 'e2e_test_user',
email: 'e2e_test_user@dvbooking.hu',
password: 'password',
roles: [Role.User],
});
});