Skip to content

Commit b90a1a6

Browse files
committed
test(core) add e2e for injection of inquirer in transient injectables
1 parent 43b0637 commit b90a1a6

7 files changed

Lines changed: 183 additions & 0 deletions

File tree

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { INestApplication, Logger } from '@nestjs/common';
2+
import { Test } from '@nestjs/testing';
3+
import { expect } from 'chai';
4+
import * as request from 'supertest';
5+
import * as sinon from 'sinon';
6+
import { HelloModule } from '../src/inject-inquirer/hello.module';
7+
8+
describe('Inject Inquirer', () => {
9+
let logger;
10+
11+
let server;
12+
let app: INestApplication;
13+
14+
before(async () => {
15+
logger = { log: sinon.spy() };
16+
17+
const module = await Test.createTestingModule({
18+
imports: [HelloModule],
19+
})
20+
.overrideProvider(Logger)
21+
.useValue(logger)
22+
.compile();
23+
24+
app = module.createNestApplication();
25+
server = app.getHttpServer();
26+
await app.init();
27+
});
28+
29+
beforeEach(() => {
30+
logger.log.reset();
31+
});
32+
33+
it(`should allow the injection of the inquirer in a Transient Scope`, async () => {
34+
await request(server).get('/hello/transient');
35+
36+
expect(
37+
logger.log.calledWith({
38+
message: 'Hello transient!',
39+
feature: 'transient',
40+
}),
41+
).to.be.true;
42+
});
43+
44+
it(`should allow the injection of the inquirer in a Request Scope`, async () => {
45+
await request(server).get('/hello/request');
46+
47+
expect(
48+
logger.log.calledWith({
49+
message: 'Hello request!',
50+
requestId: sinon.match.string,
51+
feature: 'request',
52+
}),
53+
).to.be.true;
54+
55+
const requestId = logger.log.getCall(0).args[0].requestId;
56+
57+
expect(
58+
logger.log.calledWith({
59+
message: 'Goodbye request!',
60+
requestId,
61+
feature: 'request',
62+
}),
63+
);
64+
});
65+
66+
after(async () => {
67+
await app.close();
68+
});
69+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { RequestLogger } from './request-logger.service';
3+
4+
@Injectable()
5+
export class HelloRequestService {
6+
static logger = { feature: 'request' };
7+
8+
constructor(private readonly logger: RequestLogger) {}
9+
10+
greeting() {
11+
this.logger.log('Hello request!');
12+
}
13+
14+
farewell() {
15+
this.logger.log('Goodbye request!');
16+
}
17+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Inject, Logger, Injectable, Scope } from '@nestjs/common';
2+
import { REQUEST, INQUIRER } from '@nestjs/core';
3+
4+
@Injectable({ scope: Scope.TRANSIENT })
5+
export class RequestLogger {
6+
config: object;
7+
8+
constructor(
9+
@Inject(INQUIRER) { constructor },
10+
@Inject(REQUEST) private readonly request,
11+
private readonly logger: Logger,
12+
) {
13+
this.config = (constructor && constructor.logger) || {};
14+
}
15+
16+
get requestId() {
17+
if (!this.request.id) {
18+
this.request.id = `${Date.now()}.${Math.floor(Math.random() * 1000000)}`;
19+
}
20+
return this.request.id;
21+
}
22+
23+
log(message: string) {
24+
this.logger.log({ message, requestId: this.requestId, ...this.config });
25+
}
26+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { TransientLogger } from './transient-logger.service';
3+
4+
@Injectable()
5+
export class HelloTransientService {
6+
static logger = { feature: 'transient' };
7+
8+
constructor(private readonly logger: TransientLogger) {}
9+
10+
greeting() {
11+
this.logger.log('Hello transient!');
12+
}
13+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Inject, Logger, Injectable, Scope } from '@nestjs/common';
2+
import { INQUIRER } from '@nestjs/core';
3+
4+
@Injectable({ scope: Scope.TRANSIENT })
5+
export class TransientLogger {
6+
config: object;
7+
8+
constructor(
9+
@Inject(INQUIRER) { constructor },
10+
private readonly logger: Logger,
11+
) {
12+
this.config = (constructor && constructor.logger) || {};
13+
}
14+
15+
log(message: string) {
16+
this.logger.log({ message, ...this.config });
17+
}
18+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Controller, Get } from '@nestjs/common';
2+
import { HelloRequestService } from './hello-request/hello-request.service';
3+
import { HelloTransientService } from './hello-transient/hello-transient.service';
4+
5+
@Controller('hello')
6+
export class HelloController {
7+
constructor(
8+
private readonly helloTransientService: HelloTransientService,
9+
private readonly helloRequestService: HelloRequestService,
10+
) {}
11+
12+
@Get('transient')
13+
greetingTransient() {
14+
this.helloTransientService.greeting();
15+
}
16+
17+
@Get('request')
18+
greetingRequest() {
19+
this.helloRequestService.greeting();
20+
this.helloRequestService.farewell();
21+
}
22+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Module, Logger } from '@nestjs/common';
2+
import { HelloController } from './hello.controller';
3+
import { HelloRequestService } from './hello-request/hello-request.service';
4+
import { HelloTransientService } from './hello-transient/hello-transient.service';
5+
import { RequestLogger } from './hello-request/request-logger.service';
6+
import { TransientLogger } from './hello-transient/transient-logger.service';
7+
8+
@Module({
9+
controllers: [HelloController],
10+
providers: [
11+
HelloRequestService,
12+
HelloTransientService,
13+
RequestLogger,
14+
TransientLogger,
15+
Logger,
16+
],
17+
})
18+
export class HelloModule {}

0 commit comments

Comments
 (0)