From dc7359787d66b026fc4ed7de5cba752d4a94a03a Mon Sep 17 00:00:00 2001 From: "Phong.Do" Date: Fri, 19 May 2023 19:40:31 +0700 Subject: [PATCH] fix: override decorator does not work properly because of wrong method name --- .../override.create.controller.spec.ts | 51 +++++++++++++++++++ .../override.create.controller.ts | 24 +++++++++ src/lib/crud.route.factory.ts | 5 +- 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 spec/override-decorator/override.create.controller.spec.ts create mode 100644 spec/override-decorator/override.create.controller.ts diff --git a/spec/override-decorator/override.create.controller.spec.ts b/spec/override-decorator/override.create.controller.spec.ts new file mode 100644 index 0000000..3efc02d --- /dev/null +++ b/spec/override-decorator/override.create.controller.spec.ts @@ -0,0 +1,51 @@ +import { HttpStatus, INestApplication, forwardRef } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import request from 'supertest'; + +import { OverrideCreateController } from './override.create.controller'; +import { BaseEntity } from '../base/base.entity'; +import { BaseService } from '../base/base.service'; +import { TestHelper } from '../test.helper'; + +describe('OverrideDecorator for CREATE', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [forwardRef(() => TestHelper.getTypeOrmMysqlModule([BaseEntity])), TypeOrmModule.forFeature([BaseEntity])], + controllers: [OverrideCreateController], + providers: [BaseService], + }).compile(); + + app = moduleFixture.createNestApplication(); + + await app.init(); + }); + + afterEach(async () => { + await TestHelper.dropTypeOrmEntityTables(); + await app?.close(); + }); + + it('should invoke override method', async () => { + const routerPathList = TestHelper.getRoutePath(app.getHttpServer()); + expect(routerPathList.post).toEqual(expect.arrayContaining(['/test'])); + + const response = await request(app.getHttpServer()).post('/test').send({}); + + expect(response.statusCode).toEqual(HttpStatus.CREATED); + expect(response.body.result).toEqual('createOne'); + }); + + it('should not invoke non override method', async () => { + const routerPathList = TestHelper.getRoutePath(app.getHttpServer()); + expect(routerPathList.post).toEqual(expect.arrayContaining(['/test/search'])); + + const response = await request(app.getHttpServer()).post('/test/search').send({}); + + expect(response.statusCode).toEqual(HttpStatus.OK); + expect(response.body.result).not.toBeDefined(); + expect(response.body.data).toBeDefined(); + }); +}); diff --git a/spec/override-decorator/override.create.controller.ts b/spec/override-decorator/override.create.controller.ts new file mode 100644 index 0000000..1860b8c --- /dev/null +++ b/spec/override-decorator/override.create.controller.ts @@ -0,0 +1,24 @@ +import { Controller } from '@nestjs/common'; + +import { Crud } from '../../src/lib/crud.decorator'; +import { CrudController } from '../../src/lib/interface'; +import { Override } from '../../src/lib/override.decorator'; +import { BaseEntity } from '../base/base.entity'; +import { BaseService } from '../base/base.service'; + +@Crud({ + entity: BaseEntity, +}) +@Controller('test') +export class OverrideCreateController implements CrudController { + constructor(public readonly crudService: BaseService) {} + + @Override('CREATE') + overrideCreate() { + return { result: 'createOne' }; + } + + search() { + return { result: 'search' }; + } +} diff --git a/src/lib/crud.route.factory.ts b/src/lib/crud.route.factory.ts index 024485a..e2e1664 100644 --- a/src/lib/crud.route.factory.ts +++ b/src/lib/crud.route.factory.ts @@ -302,10 +302,11 @@ export class CrudRouteFactory { if (!overrodeCrudMethodName) { continue; } - if (overrideMap.has(overrodeCrudMethodName)) { + const overrodeCrudMethod = Method[overrodeCrudMethodName]; + if (overrideMap.has(overrodeCrudMethod)) { throw new Error(`duplicated ${overrodeCrudMethodName} method on ${name}`); } - overrideMap.set(overrodeCrudMethodName, name); + overrideMap.set(overrodeCrudMethod, name); } return overrideMap;