@toss/nestjs-aop
Version:
<!-- PROJECT LOGO --> <br /> <div align="center"> <a href="https://github.com/toss/nestjs-aop"> <img src="https://toss.tech/wp-content/uploads/2022/11/tech-article-nest-js-02.png" alt="Logo" height="200"> </a>
96 lines (82 loc) • 3.05 kB
text/typescript
import { Controller, Get, INestApplication, Inject, Module, Query } from '@nestjs/common';
import { REQUEST } from '@nestjs/core';
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { Test, TestingModule } from '@nestjs/testing';
import supertest from 'supertest';
import { AopModule } from '../aop.module';
import { AopTesting } from './fixture/aop-testing.decorator';
import { AopTestingModule } from './fixture/aop-testing.module';
describe('Controller', () => {
let app: INestApplication;
let moduleRef: TestingModule;
let called = 0;
let wrapCalled = 0;
beforeAll(async () => {
const cache = new Map<string, any>();
()
class FooController {
constructor((REQUEST) private readonly request: any) {}
({
callback: ({ wrapParams, args }) => {
const cacheKey = JSON.stringify(args);
if (cache.has(cacheKey)) {
return cache.get(cacheKey);
}
const result = wrapParams.method(...args);
cache.set(cacheKey, result);
return result;
},
})
('/foo')
foo(('id') id: number) {
called++;
return id;
}
({
wrapCallback: () => {
wrapCalled++;
},
})
('/get-url')
getUrl() {
return this.request.url;
}
}
({
controllers: [FooController],
})
class FooModule {}
moduleRef = await Test.createTestingModule({
imports: [
AopModule,
FooModule,
AopTestingModule.registerAsync({
useFactory: () => [],
}),
],
}).compile();
app = moduleRef.createNestApplication<NestFastifyApplication>(new FastifyAdapter());
await app.init();
await app.getHttpAdapter().getInstance().ready();
});
it('With Cache applied, the actual method is called only once', async () => {
const requester = supertest(app.getHttpServer());
await requester.get('/foo').query({ id: 1 }).expect(200).expect('1');
await requester.get('/foo').query({ id: 1 }).expect(200).expect('1');
await requester.get('/foo').query({ id: 2 }).expect(200).expect('2');
await requester.get('/foo').query({ id: 2 }).expect(200).expect('2');
await requester.get('/foo').query({ id: 2 }).expect(200).expect('2');
await requester.get('/foo').query({ id: 3 }).expect(200).expect('3');
expect(called).toMatchInlineSnapshot(`3`);
});
it('With Baz Decorator applied, BazService method return request url included string properly', async () => {
const requester = supertest(app.getHttpServer());
await requester.get('/get-url?foo=1');
await requester.get('/get-url?foo=2');
await requester.get('/get-url?foo=3');
const response = await requester.get('/get-url?foo=4');
expect(response.text).toMatchInlineSnapshot(`"/get-url?foo=4"`);
expect(wrapCalled).toMatchInlineSnapshot(`4`);
});
afterAll(async () => await app.close());
});