feat(fastify): Do not crash if enableVersioning is not used (fixes #13496)

This commit is contained in:
Abdeldjalil Fortas
2024-05-05 08:31:33 +02:00
parent 1db72fd96a
commit c0af8af0cd
2 changed files with 101 additions and 3 deletions

View File

@@ -0,0 +1,98 @@
import { INestApplication, VersioningType } from '@nestjs/common';
import {
FastifyAdapter,
NestFastifyApplication,
} from '@nestjs/platform-fastify';
import { Test } from '@nestjs/testing';
import * as request from 'supertest';
import { AppModule } from '../src/app.module';
/**
* `.enableVersioning()` uses `VersioningType.URI` type by default
* Regression test for #13496
* @see [Versioning](https://docs.nestjs.com/techniques/versioning)
*/
describe('Default Versioning behavior', () => {
// ======================================================================== //
describe('Express', () => {
let app: INestApplication;
before(async () => {
const moduleRef = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleRef.createNestApplication();
app.enableVersioning();
await app.init();
});
describe('GET /', () => {
it('V1', () => {
return request(app.getHttpServer())
.get('/v1')
.expect(200)
.expect('Hello World V1!');
});
it('No Version', () => {
return request(app.getHttpServer()).get('/').expect(404);
});
});
describe('GET /neutral', () => {
it('No Version', () => {
return request(app.getHttpServer())
.get('/neutral')
.expect(200)
.expect('Neutral');
});
});
after(async () => {
await app.close();
});
});
// ======================================================================== //
describe('Fastify', () => {
let app: INestApplication;
before(async () => {
const moduleRef = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleRef.createNestApplication<NestFastifyApplication>(
new FastifyAdapter(),
);
app.enableVersioning();
await app.init();
await app.getHttpAdapter().getInstance().ready();
});
describe('GET /', () => {
it('V1', () => {
return request(app.getHttpServer())
.get('/v1')
.expect(200)
.expect('Hello World V1!');
});
it('No Version', () => {
return request(app.getHttpServer()).get('/').expect(404);
});
});
describe('GET /neutral', () => {
it('No Version', () => {
return request(app.getHttpServer())
.get('/neutral')
.expect(200)
.expect('Neutral');
});
});
after(async () => {
await app.close();
});
});
});

View File

@@ -166,7 +166,7 @@ export class FastifyAdapter<
},
deriveConstraint: (req: FastifyRequest) => {
// Media Type (Accept Header) Versioning Handler
if (this.versioningOptions.type === VersioningType.MEDIA_TYPE) {
if (this.versioningOptions?.type === VersioningType.MEDIA_TYPE) {
const MEDIA_TYPE_HEADER = 'Accept';
const acceptHeaderValue: string | undefined = (req.headers?.[
MEDIA_TYPE_HEADER
@@ -181,7 +181,7 @@ export class FastifyAdapter<
: acceptHeaderVersionParameter.split(this.versioningOptions.key)[1];
}
// Header Versioning Handler
else if (this.versioningOptions.type === VersioningType.HEADER) {
else if (this.versioningOptions?.type === VersioningType.HEADER) {
const customHeaderVersionParameter: string | string[] | undefined =
req.headers?.[this.versioningOptions.header] ||
req.headers?.[this.versioningOptions.header.toLowerCase()];
@@ -191,7 +191,7 @@ export class FastifyAdapter<
: customHeaderVersionParameter;
}
// Custom Versioning Handler
else if (this.versioningOptions.type === VersioningType.CUSTOM) {
else if (this.versioningOptions?.type === VersioningType.CUSTOM) {
return this.versioningOptions.extractor(req);
}
return undefined;