From aabe83237487fef56f8ec22c39f0907f8723ef69 Mon Sep 17 00:00:00 2001 From: Tolga Paksoy Date: Tue, 4 Oct 2022 23:54:36 +0200 Subject: [PATCH] test(express): add sse examples --- .../nest-application/sse/e2e/express.spec.ts | 45 +++++++++++++++++++ .../sse/src/express.controller.ts | 12 +++++ .../sse/src/express.module.ts | 7 +++ .../nest-application/sse/tsconfig.json | 23 ++++++++++ 4 files changed, 87 insertions(+) create mode 100644 integration/nest-application/sse/e2e/express.spec.ts create mode 100644 integration/nest-application/sse/src/express.controller.ts create mode 100644 integration/nest-application/sse/src/express.module.ts create mode 100644 integration/nest-application/sse/tsconfig.json diff --git a/integration/nest-application/sse/e2e/express.spec.ts b/integration/nest-application/sse/e2e/express.spec.ts new file mode 100644 index 00000000000..9bde0484fca --- /dev/null +++ b/integration/nest-application/sse/e2e/express.spec.ts @@ -0,0 +1,45 @@ +import { + ExpressAdapter, + NestExpressApplication, +} from '@nestjs/platform-express'; +import { Test } from '@nestjs/testing'; +import { expect } from 'chai'; +import * as EventSource from 'eventsource'; +import { ExpressModule } from '../src/express.module'; + +describe('Sse (Express Application)', () => { + let app: NestExpressApplication; + let eventSource: EventSource; + + beforeEach(async () => { + const moduleFixture = await Test.createTestingModule({ + imports: [ExpressModule], + }).compile(); + + app = moduleFixture.createNestApplication({ + rawBody: true, + }); + + await app.listen(3000); + const url = await app.getUrl(); + + eventSource = new EventSource(url + '/sse'); + }); + + afterEach(async () => { + const expressAdapter = app.getHttpAdapter() as ExpressAdapter; + await app.close(); + + expect(expressAdapter.openConnections).to.be.empty; + eventSource.close(); + }); + + it('receives events from server', done => { + eventSource.addEventListener('message', event => { + expect(JSON.parse(event.data)).to.eql({ + hello: 'world', + }); + done(); + }); + }); +}); diff --git a/integration/nest-application/sse/src/express.controller.ts b/integration/nest-application/sse/src/express.controller.ts new file mode 100644 index 00000000000..1ea962f2d16 --- /dev/null +++ b/integration/nest-application/sse/src/express.controller.ts @@ -0,0 +1,12 @@ +import { Controller, MessageEvent, Sse } from '@nestjs/common'; +import { interval, map, Observable } from 'rxjs'; + +@Controller() +export class ExpressController { + @Sse('sse') + sse(): Observable { + return interval(1000).pipe( + map(_ => ({ data: { hello: 'world' } } as MessageEvent)), + ); + } +} diff --git a/integration/nest-application/sse/src/express.module.ts b/integration/nest-application/sse/src/express.module.ts new file mode 100644 index 00000000000..5ddb714263c --- /dev/null +++ b/integration/nest-application/sse/src/express.module.ts @@ -0,0 +1,7 @@ +import { Module } from '@nestjs/common'; +import { ExpressController } from './express.controller'; + +@Module({ + controllers: [ExpressController], +}) +export class ExpressModule {} diff --git a/integration/nest-application/sse/tsconfig.json b/integration/nest-application/sse/tsconfig.json new file mode 100644 index 00000000000..261f9bff228 --- /dev/null +++ b/integration/nest-application/sse/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": false, + "noImplicitAny": false, + "removeComments": true, + "lib": ["dom"], + "noLib": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es6", + "sourceMap": true, + "allowJs": true, + "outDir": "./dist" + }, + "include": [ + "src/**/*", + "e2e/**/*" + ], + "exclude": [ + "node_modules" + ] +}