From 5090d9a0a048b397b90ee9760f553d89dee468a2 Mon Sep 17 00:00:00 2001 From: kiwi-jang Date: Thu, 16 Nov 2023 17:27:05 +0900 Subject: [PATCH] fix: Fix wrap-cache was not working --- src/__test__/aop.module.test.ts | 46 ++++++++++++++++++++++++++++++++- src/auto-aspect-executor.ts | 2 +- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/__test__/aop.module.test.ts b/src/__test__/aop.module.test.ts index 0c74112..4aa62ee 100644 --- a/src/__test__/aop.module.test.ts +++ b/src/__test__/aop.module.test.ts @@ -1,6 +1,6 @@ import 'reflect-metadata'; -import { Controller, Get, Injectable, Module } from '@nestjs/common'; +import { Controller, Get, Injectable, Module, Scope } from '@nestjs/common'; import { FastifyAdapter } from '@nestjs/platform-fastify'; import { Test } from '@nestjs/testing'; import { AopModule } from '../aop.module'; @@ -150,6 +150,50 @@ describe('AopModule', () => { expect(fooService.multipleDecorated()).toMatchInlineSnapshot(`"012"`); }); + it('Wrap should be executed only once in default scope', async () => { + let wrapped = 0; + @Injectable({ scope: Scope.DEFAULT }) + class FooService { + @AopTesting({ + wrapCallback: () => { + wrapped++; + }, + }) + decorated() { + return '0'; + } + } + + @Module({ + providers: [FooService], + exports: [FooService], + }) + class FooModule {} + + const module = await Test.createTestingModule({ + imports: [ + AopModule, + FooModule, + AopTestingModule.registerAsync({ + imports: [FooModule], + inject: [FooService], + useFactory: (fooService: FooService) => { + return [fooService]; + }, + }), + ], + }).compile(); + + const app = module.createNestApplication(new FastifyAdapter()); + await app.init(); + const fooService = app.get(FooService); + fooService.decorated(); + fooService.decorated(); + fooService.decorated(); + + expect(wrapped).toBe(1); + }); + /** * There are codes that using `function.name`. * Therefore the codes below are necessary. diff --git a/src/auto-aspect-executor.ts b/src/auto-aspect-executor.ts index 20e6324..d8dc5a0 100644 --- a/src/auto-aspect-executor.ts +++ b/src/auto-aspect-executor.ts @@ -97,7 +97,7 @@ export class AutoAspectExecutor implements OnModuleInit { method: originalFn.bind(this), metadata, }); - self.wrappedMethodCache.set(this, wrappedMethod); + self.wrappedMethodCache.set(aopMetadata, wrappedMethod); return wrappedMethod.apply(this, args); };