diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f94addbc510e5ba4c3dd6ad0844a9586d09e59c..66e872cf6a13633c5ff316860ac745b2397c3e79 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,6 +12,10 @@ build: image: docker:18.09 services: - docker:18.09-dind + only: + - dev + - rec + - master stage: build script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY @@ -32,12 +36,15 @@ deploy_dev: - docker system prune -a -f code_analysis: - image: skilldlabs/sonar-scanner:3.4.0 + image: skilldlabs/sonar-scanner:4.0.0 services: - docker:18.09-dind stage: sonar-analysis only: - dev + before_script: + - export NODE_PATH=$NODE_PATH:`npm root -g` + - npm install -g typescript script: - > sonar-scanner @@ -48,3 +55,14 @@ code_analysis: -Dsonar.host.url=${SONAR_URL} -Dsonar.projectKey=${SONAR_PROJECT_KEY} -Dsonar.login=${SONAR_TOKEN} + +mr: + image: docker:18.09 + services: + - docker:18.09-dind + stage: build + only: + - merge_requests + script: + - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY + - docker build . diff --git a/src/auth/auth.controller.spec.ts b/src/auth/auth.controller.spec.ts index 5d080347ed76c593ad45056fbf716d96f2c32db6..819bebe40d056c7a9315d71c309bd092e61e17d5 100644 --- a/src/auth/auth.controller.spec.ts +++ b/src/auth/auth.controller.spec.ts @@ -1,15 +1,13 @@ -import { JwtModule, JwtService } from '@nestjs/jwt'; +import { JwtModule } from '@nestjs/jwt'; import { getModelToken } from '@nestjs/mongoose'; import { PassportModule } from '@nestjs/passport'; import { Test, TestingModule } from '@nestjs/testing'; import { ConfigurationModule } from '../configuration/configuration.module'; import { MailerModule } from '../mailer/mailer.module'; import { User } from '../users/user.schema'; -import { UsersModule } from '../users/users.module'; import { UsersService } from '../users/users.service'; import { AuthController } from './auth.controller'; import { AuthService } from './auth.service'; -import { JwtStrategy } from './strategy/jwt.strategy'; describe('AuthController', () => { let controller: AuthController; diff --git a/src/auth/auth.service.spec.ts b/src/auth/auth.service.spec.ts index f097f8d4e8f2859483a68d3ced21b8ca56b9ea8e..0582053c0ba31e3b72bc38e036442121a5e58ab1 100644 --- a/src/auth/auth.service.spec.ts +++ b/src/auth/auth.service.spec.ts @@ -51,14 +51,14 @@ describe('AuthService', () => { email: 'jacques.dupont@mii.com', role: 0, }; - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); expect(await service.validateUser(loginDto)).toBe(result); }); it('should not validateUser', async () => { const result = null; - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); expect(await service.validateUser(loginDto)).toBe(result); }); @@ -67,28 +67,28 @@ describe('AuthService', () => { describe('login', () => { it('should login user jacques.dupont@mii.com', async () => { const result = { username: ' jacques.dupont@mii.com', token: 'tok3n!1sfq' }; - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<{ username; token }> => result); expect(await service.validateUser(loginDto)).toBe(result); }); it('should not login jacques.dupont@mii.com, email not verified', async () => { const result = new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); expect(await service.validateUser(loginDto)).toBe(result); }); it('should not login jacques.dupont@mii.com, bad password', async () => { const result = new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); expect(await service.validateUser(loginDto)).toBe(result); }); it('should not login jacques.dupont@mii.com, username does not exist', async () => { const result = new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); expect(await service.validateUser(loginDto)).toBe(result); }); diff --git a/src/structures/structures.controller.ts b/src/structures/structures.controller.ts index b3a33b8aa05b35c191abfef770bb228f2cb3a420..5ffa5394b89d881fc908c202851acbf9aab3ba7a 100644 --- a/src/structures/structures.controller.ts +++ b/src/structures/structures.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Get, Param, Post, Query, Req } from '@nestjs/common'; +import { Body, Controller, Get, Post, Query } from '@nestjs/common'; import { CreateStructureDto } from './dto/create-structure.dto'; import { QueryStructure } from './dto/query-structure.dto'; import { Structure } from './schemas/structure.schema'; diff --git a/src/users/users.controller.spec.ts b/src/users/users.controller.spec.ts index 565a6704dd072f9110fc7b61190bac9d600b21c7..714006debf399341880614d0a8e280e93bbadb7c 100644 --- a/src/users/users.controller.spec.ts +++ b/src/users/users.controller.spec.ts @@ -1,4 +1,4 @@ -import { HttpModule, HttpService } from '@nestjs/common'; +import { HttpModule } from '@nestjs/common'; import { getModelToken } from '@nestjs/mongoose'; import { Test, TestingModule } from '@nestjs/testing'; import { ConfigurationModule } from '../configuration/configuration.module'; diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 8d80697be368cc3c180d8a1c6894c2e1be5d9353..944c21982583fcece0e9474a92f6b145584bbbfa 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Get, Param, Post, Query, Req, Request, UseGuards } from '@nestjs/common'; +import { Body, Controller, Get, Param, Post, Query, Request, UseGuards } from '@nestjs/common'; import { ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; import { CreateUserDto } from './create-user.dto'; diff --git a/src/users/users.module.ts b/src/users/users.module.ts index 32b8652861b4a6aa2d35a07b86f8481eb1b1d6a2..69d7ee133b34253305a5d91968d8fe2da518deeb 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; -import { User, UserSchema } from './User.schema'; +import { User, UserSchema } from './user.schema'; import { MailerModule } from '../mailer/mailer.module'; @Module({ diff --git a/src/users/users.service.spec.ts b/src/users/users.service.spec.ts index a8a4419cb3247d0553a1ce3c40a90a043609416d..ce36d9e7d1ea9f4275f9b59aa5d15290e4e7e31c 100644 --- a/src/users/users.service.spec.ts +++ b/src/users/users.service.spec.ts @@ -39,14 +39,14 @@ describe('UsersService', () => { email: 'jacques.dupont@mii.com', password: '$2a$12$vLQjJ9zAWyUwiXLeQDa6w.yazDArYIpf2WnQF1jRHOjBxADEjUEA3', }; - const userDto: CreateUserDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; + const userDto: CreateUserDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'create').mockImplementation(async (): Promise<User> => result); expect(await service.create(userDto)).toBe(result); }); it('User should not be created, already exist', async () => { const result = new HttpException('User already exists', HttpStatus.BAD_REQUEST); - const userDto: CreateUserDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; + const userDto: CreateUserDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'create').mockImplementation(async (): Promise<any> => result); expect(await service.create(userDto)).toBe(result); }); @@ -56,7 +56,7 @@ describe('UsersService', () => { 'Weak password, it must contain ne lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', HttpStatus.UNPROCESSABLE_ENTITY ); - const userDto: CreateUserDto = { email: 'jacques.dupont@mii.com', password: 'test' }; + const userDto: CreateUserDto = { email: 'jacques.dupont@mii.com', password: 'test' }; //NOSONAR jest.spyOn(service, 'create').mockImplementation(async (): Promise<any> => result); expect(await service.create(userDto)).toBe(result); }); @@ -72,21 +72,21 @@ describe('UsersService', () => { password: '$2a$12$vLQjJ9zAWyUwiXLeQDa6w.yazDArYIpf2WnQF1jRHOjBxADEjUEA3', role: 0, }; - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'findByLogin').mockImplementation(async (): Promise<User> => result); expect(await service.findByLogin(loginDto)).toBe(result); }); it('user does not exist, should be unauthorized issue', async () => { const result: HttpException = new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); - const loginDto: LoginDto = { email: 'jean.dupont@mii.com', password: 'test1A!!' }; + const loginDto: LoginDto = { email: 'jean.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'findByLogin').mockImplementation(async (): Promise<any> => result); expect(await service.findByLogin(loginDto)).toBe(result); }); it('wrong password, should be unauthorized issue', async () => { const result: HttpException = new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!!' }; + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!!' }; //NOSONAR jest.spyOn(service, 'findByLogin').mockImplementation(async (): Promise<any> => result); expect(await service.findByLogin(loginDto)).toBe(result); }); diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 4ea11e51fc03c9026ee7712013df0ae79bc06a11..4fb784b185c7142c69bb1476149dabcc0ced1450 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -47,7 +47,7 @@ export class UsersService { * @param password string */ private isStrongPassword(password: string): boolean { - const strongRegex = new RegExp('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{8,})'); + const strongRegex = new RegExp('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{8,})'); //NOSONAR return strongRegex.test(password); }