NestJS, Docker, Circle, CI/CD, Testing
NestJS
Docker
Circle
CI/CD
Testing
Presentation
Need to install
NestJS Links
APP
User Management
Endpoint | Method | Description |
---|---|---|
users/ | GET | Get all users |
users/:id | GET | Get one user |
users/ | POST | Create user |
users/:id | DELETE | Delete user |
users/:id | PUT/PATCH | Update user |
Endpoints which we will implement
User Management
$ npm install -g @nestjs/cli
$ nest new my-nest-project
$ cd my-nest-project
$ npm run start:dev
$ nest g --help
$ nest g module users
$ nest g controller users
@Controller('/user-management')
export class UsersController {
...
}
Define path
@Controller('/user-management')
export class UsersController {
@Get()
getAllUsers() {
return ...
}
}
Define Handlers
@Module({
controllers: [UsersController],
providers: [],
})
export class UsersModule {}
$ nest g service users
Time to implement base mock GET request
and
Postman collection
DTO - Data Transfer Object
npm install class-validator --save
npm i class-transformer --save
Small Task
$ docker container ls
$ docker run --name postgres-nest -p 5432:5432 -e POSTGRES_PASSWORD=postgres -d postgres
$ docker container ls
$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)
To avoid local installation of Postgresql we will use Docker container.
Go to PgAdmin:
$ npm i --save @nestjs/typeorm typeorm pg
Object Relation Mapping
Depricated
@EntityRepository(User)
export class UsersRepository extends Repository<User> {
}
$ npm install -g cross-env
"start:dev": "STAGE=dev nest start --watch",
"start:dev": "cross-env STAGE=dev nest start --watch",
$ npm install @nestjs/config --save
$ npm i @nestjs/config --save
Nee to add links to 'How to' docs
Heroku Configuration
Circleci Configuration
version: 2.1
orbs:
heroku: circleci/heroku@1.0.1
workflows:
heroku_deploy:
jobs:
- heroku/deploy-via-git
2. Go to Circleci
3. Add env variables:
HEROKU_APP_NAME and HEROKU_API_KEY
Heroku additional configuration
describe('A suite', () => {
test('contains spec with n expectation', () => {
expect(Math.max(1, 5, 10)).toBe(10);
});
})
function sum(a, b) {
return a + b;
}
describe('sum', () => {
test('should be 3 when called sum with args 1 and 2', () => {
expect(sum(1,2)).toBe(3);
});
})
describe('A suite', () => {
test('contains spec with n expectation', () => {
expect(Math.max(1, 5, 10)).toBe(10);
});
})
const mockRepository = () => ({
getById: jest.fn(),
});
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UsersService,
{
provide: UsersRepository,
useFactory: mockRepository,
},
],
}).compile();
service = module.get<UsersService>(UsersService);
repository = module.get<UsersRepository>(UsersRepository);
});
Mocking
Coverage
e2e - check endpoints, factories etc