import { NestContainer } from '@nestjs/core/injector/container'; import { expect } from 'chai'; import * as sinon from 'sinon'; import { Catch } from '../../../common/decorators/core/catch.decorator'; import { UseFilters } from '../../../common/decorators/core/exception-filters.decorator'; import { ApplicationConfig } from '../../../core/application-config'; import { InstanceWrapper } from '../../../core/injector/instance-wrapper'; import { ExceptionFiltersContext } from '../../context/exception-filters-context'; describe('ExceptionFiltersContext', () => { let applicationConfig: ApplicationConfig; let exceptionFilter: ExceptionFiltersContext; class CustomException {} @Catch(CustomException) class ExceptionFilter { public catch(exc, res) {} } beforeEach(() => { applicationConfig = new ApplicationConfig(); exceptionFilter = new ExceptionFiltersContext( new NestContainer(), applicationConfig as any, ); }); describe('create', () => { describe('when filters metadata is empty', () => { class EmptyMetadata {} beforeEach(() => { sinon.stub(exceptionFilter, 'createContext').returns([]); }); it('should return plain ExceptionHandler object', () => { const filter = exceptionFilter.create( new EmptyMetadata(), () => ({} as any), undefined, ); expect((filter as any).filters).to.be.empty; }); }); describe('when filters metadata is not empty', () => { @UseFilters(new ExceptionFilter()) class WithMetadata {} it('should return ExceptionHandler object with exception filters', () => { const filter = exceptionFilter.create( new WithMetadata(), () => ({} as any), undefined, ); expect((filter as any).filters).to.not.be.empty; }); }); }); describe('getGlobalMetadata', () => { describe('when contextId is static and inquirerId is nil', () => { it('should return global filters', () => { const expectedResult = applicationConfig.getGlobalFilters(); expect(exceptionFilter.getGlobalMetadata()).to.be.equal(expectedResult); }); }); describe('otherwise', () => { it('should merge static global with request/transient scoped filters', () => { const globalFilters: any = ['test']; const instanceWrapper = new InstanceWrapper(); const instance = 'request-scoped'; const scopedFilterWrappers = [instanceWrapper]; sinon .stub(applicationConfig, 'getGlobalFilters') .callsFake(() => globalFilters); sinon .stub(applicationConfig, 'getGlobalRequestFilters') .callsFake(() => scopedFilterWrappers); sinon .stub(instanceWrapper, 'getInstanceByContextId') .callsFake(() => ({ instance } as any)); expect(exceptionFilter.getGlobalMetadata({ id: 3 })).to.contains( instance, ...globalFilters, ); }); }); }); });