diff --git a/integration/versioning/e2e/default-versioning.spec.ts b/integration/versioning/e2e/default-versioning.spec.ts new file mode 100644 index 00000000000..a11bdf6dc83 --- /dev/null +++ b/integration/versioning/e2e/default-versioning.spec.ts @@ -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( + 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(); + }); + }); +}); diff --git a/packages/platform-fastify/adapters/fastify-adapter.ts b/packages/platform-fastify/adapters/fastify-adapter.ts index a2fb37046f8..d06def57fe1 100644 --- a/packages/platform-fastify/adapters/fastify-adapter.ts +++ b/packages/platform-fastify/adapters/fastify-adapter.ts @@ -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;