Unit test a nestJS interceptor

Viewed 58

My interceptor intercepts a GET request and adds a header to the response based on some conditions.

My Controller

@UseInterceptors(ServiceHeaderInterceptor)
@Get('users')
public async users(
  @Query('id') Id: number,
  @Query('name') Name: string,
){
  const setFlags: MetaFlags = {setCacheHeader: false, setServiceHeader: false};

  const data = await this.service.getUsers(id, name, setFlags);
  return data;
}

My interceptor looks like this

@Injectable()
export class HeaderInterceptor implements NestInterceptor {
  public intercept(
    context: ExecutionContext,
    next: CallHandler,
  ): Observable<any> {
    return next.handle().pipe(
       map((data: { data: DataType, header: 'cache' | 'database' }) => {
        const req = context.switchToHttp().getResponse();
         if (data.header === 'database') {
          res.setHeader('x-api-key', 'pretty secure');
        } else {
          res.setHeader(xyz, value);
        }
        return data.data;
      }),
    );
  }
}

This is my test class

const users = [
        {
            'id': 1,
            'name': 'Adam',
        },
        {
            'id': 2,
            'name': 'Evan',
        },
    ]

const executionContext: any = {
        switchToHttp: jest.fn().mockReturnThis(),
        getResponse: jest.fn().mockReturnThis(),
        setHeader: jest.fn().mockReturnThis(),
    };
const next = {
        handle: () => of(users),
    };

beforeEach(async () => {
        const module: TestingModule = await Test.createTestingModule({
            providers: [
                {
                    provide: UserService,
                    useValue: mock<UserService>(),
                },
                ServiceHeaderInterceptor,
            ],
        }).compile();

        interceptor = module.get(ServiceHeaderInterceptor);
       
});

it('get users',async () => {
        interceptor.intercept(executionContext, next).subscribe({
                next: (value) => {
                    expect(value).toEqual(users);
                },
                error: (error) => {
                    throw error;
                },
            });

        });
});

Is there a way to check what my header values are at this point? I am able to access only the response body and not the headers. I need to verify if the header I set in the interceptor is available and has the correct value

0 Answers
Related