Skip to content

Commit 0a6034f

Browse files
docs(@nestjs) update examples, fix interceptors bug
1 parent 8de7791 commit 0a6034f

55 files changed

Lines changed: 9003 additions & 30 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,24 @@
1+
## 4.0.0
2+
**@nestjs/core**
3+
- Interceptors feature (docs)
4+
- Guards feature (docs)
5+
- `@Shared()` deprecated (modules are singletons by default)
6+
- `@SingleScope()` decorator (read more in the docs)
7+
- New response handling approach (return plain value / Promise / Observable)
8+
- Async components
9+
- New `INestApplication` methods (for example `use()` wrapper)
10+
11+
**@nestjs/microservices**
12+
- Possibility to return Promise / Observable / plain value
13+
- Guards & Interceptors & Pipes & Exception Filters integration
14+
15+
**@nestjs/websockets**
16+
- Possibility to return Promise / Observable / plain value
17+
- Guards & Interceptors & Pipes & Exception Filters integration
18+
19+
**@nestjs/testing**
20+
- Completely rewritten testing package (docs)
21+
122
## 3.0.1 (24.06.2017)
223
**@nestjs/core**
324
- Hierarchical injector bugfix,
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as express from 'express';
2+
import * as bodyParser from 'body-parser';
3+
import * as request from 'supertest';
4+
import { Test } from '@nestjs/testing';
5+
import { CatsModule } from '../../src/modules/cats/cats.module';
6+
import { CatsService } from '../../src/modules/cats/cats.service';
7+
8+
describe('Cats', () => {
9+
const server = express();
10+
server.use(bodyParser.json());
11+
12+
const catsService = { findAll: () => ['test'] };
13+
14+
beforeAll(async () => {
15+
const module = await Test.createTestingModule({
16+
modules: [CatsModule],
17+
})
18+
.overrideComponent(CatsService).useValue(catsService)
19+
.compile();
20+
21+
const app = module.createNestApplication(server);
22+
await app.init();
23+
});
24+
25+
it(`/GET cats`, () => {
26+
return request(server)
27+
.get('/cats')
28+
.expect(200)
29+
.expect({
30+
data: catsService.findAll(),
31+
});
32+
});
33+
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"moduleFileExtensions": [
3+
"ts",
4+
"tsx",
5+
"js",
6+
"json"
7+
],
8+
"transform": {
9+
"^.+\\.tsx?$": "<rootDir>/../node_modules/ts-jest/preprocessor.js"
10+
},
11+
"testRegex": "/e2e/.*\\.(e2e-test|e2e-spec).(ts|tsx|js)$",
12+
"collectCoverageFrom" : ["src/**/*.{js,jsx,tsx,ts}", "!**/node_modules/**", "!**/vendor/**"],
13+
"coverageReporters": ["json", "lcov"]
14+
}

examples/01-cats-app/jest.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"moduleFileExtensions": [
3+
"ts",
4+
"tsx",
5+
"js",
6+
"json"
7+
],
8+
"transform": {
9+
"^.+\\.tsx?$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
10+
},
11+
"testRegex": "/src/.*\\.(test|spec).(ts|tsx|js)$",
12+
"collectCoverageFrom" : ["src/**/*.{js,jsx,tsx,ts}", "!**/node_modules/**", "!**/vendor/**"],
13+
"coverageReporters": ["json", "lcov"]
14+
}

examples/01-cats-app/package.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
"scripts": {
77
"start": "node index.js",
88
"prestart:prod": "tsc",
9-
"start:prod": "node dist/server.js"
9+
"start:prod": "node dist/server.js",
10+
"test": "jest --config=jest.json",
11+
"test:watch": "jest --watch --config=jest.json",
12+
"test:coverage": "jest --config=jest.json --coverage --coverageDirectory=coverage",
13+
"e2e": "jest --config=e2e/jest-e2e.json",
14+
"e2e:watch": "jest --watch --config=e2e/jest-e2e.json"
1015
},
1116
"dependencies": {
1217
"@nestjs/common": "^3.0.3",
@@ -23,7 +28,11 @@
2328
"typescript": "^2.4.2"
2429
},
2530
"devDependencies": {
31+
"@types/jest": "^20.0.8",
2632
"@types/node": "^7.0.41",
33+
"jest": "^20.0.4",
34+
"supertest": "^3.0.0",
35+
"ts-jest": "^20.0.14",
2736
"ts-node": "^3.3.0"
2837
}
2938
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Test } from '@nestjs/testing';
2+
import { CatsController } from './cats.controller';
3+
import { CatsService } from './cats.service';
4+
5+
describe('CatsController', () => {
6+
let catsController: CatsController;
7+
let catsService: CatsService;
8+
9+
beforeEach(async () => {
10+
const module = await Test.createTestingModule({
11+
controllers: [CatsController],
12+
components: [CatsService],
13+
}).compile();
14+
15+
catsService = module.get<CatsService>(CatsService);
16+
catsController = module.get<CatsController>(CatsController);
17+
});
18+
19+
describe('findAll', () => {
20+
it('should return an array of cats', async () => {
21+
const result = ['test'];
22+
jest.spyOn(catsService, 'findAll').mockImplementation(() => result);
23+
24+
expect(await catsController.findAll()).toBe(result);
25+
});
26+
});
27+
});

examples/01-cats-app/src/modules/cats/cats.controller.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1-
import { Controller, Get, Post, Body, UseGuards } from '@nestjs/common';
1+
import { Controller, Get, Post, Body, UseGuards, ReflectMetadata, UseInterceptors } from '@nestjs/common';
22
import { CreateCatDto } from './dto/create-cat.dto';
33
import { CatsService } from './cats.service';
44
import { Cat } from './interfaces/cat.interface';
5-
import { BreedGuard } from '../common/guards/breed.guard';
5+
import { RolesGuard } from '../common/guards/roles.guard';
6+
import { Roles } from '../common/decorators/roles.decorator';
7+
import { LoggingInterceptor } from '../common/interceptors/logging.interceptor';
8+
import { TransformInterceptor } from '../common/interceptors/transform.interceptor';
69

710
@Controller('cats')
11+
@UseGuards(RolesGuard)
12+
@UseInterceptors(LoggingInterceptor, TransformInterceptor)
813
export class CatsController {
914
constructor(private readonly catsService: CatsService) {}
1015

1116
@Post()
12-
@UseGuards(BreedGuard)
17+
@Roles('admin')
1318
async create(@Body() createCatDto: CreateCatDto) {
1419
this.catsService.create(createCatDto);
1520
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { ReflectMetadata } from '@nestjs/common';
2+
3+
export const Roles = (...roles: string[]) => ReflectMetadata('roles', roles);

examples/01-cats-app/src/modules/common/guards/breed.guard.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Guard, CanActivate, ExecutionContext } from '@nestjs/common';
2+
import { Observable } from 'rxjs/Observable';
3+
import { Reflector } from '@nestjs/core';
4+
5+
@Guard()
6+
export class RolesGuard implements CanActivate {
7+
constructor(private readonly reflector: Reflector) {}
8+
9+
canActivate(req, context: ExecutionContext): boolean {
10+
const { parent, handler } = context;
11+
const roles = this.reflector.get<string[]>('roles', handler);
12+
if (!roles) {
13+
return true;
14+
}
15+
16+
const user = req.user;
17+
const hasRole = () => !!user.roles.find((role) => !!roles.find((item) => item === role));
18+
return user && user.roles && hasRole();
19+
}
20+
}

0 commit comments

Comments
 (0)