Skip to content

Commit

Permalink
Merge pull request #143 from nhatphongdo/fix/override-decorator-does-…
Browse files Browse the repository at this point in the history
…not-work-properly

fix: override decorator does not work properly because of wrong method name
  • Loading branch information
jiho-kr committed May 22, 2023
2 parents 4d169fb + dc73597 commit 2520d8b
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 2 deletions.
51 changes: 51 additions & 0 deletions spec/override-decorator/override.create.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -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();
});
});
24 changes: 24 additions & 0 deletions spec/override-decorator/override.create.controller.ts
Original file line number Diff line number Diff line change
@@ -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<BaseEntity> {
constructor(public readonly crudService: BaseService) {}

@Override('CREATE')
overrideCreate() {
return { result: 'createOne' };
}

search() {
return { result: 'search' };
}
}
5 changes: 3 additions & 2 deletions src/lib/crud.route.factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -309,10 +309,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;
Expand Down

0 comments on commit 2520d8b

Please sign in to comment.