Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
kamilmysliwiec committed Apr 5, 2023
2 parents 06da94b + 402a389 commit e990336
Show file tree
Hide file tree
Showing 7 changed files with 174 additions and 11 deletions.
19 changes: 12 additions & 7 deletions packages/platform-ws/adapters/ws-adapter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { INestApplicationContext, Logger } from '@nestjs/common';
import { loadPackage } from '@nestjs/common/utils/load-package.util';
import { isNil } from '@nestjs/common/utils/shared.utils';
import { normalizePath, isNil } from '@nestjs/common/utils/shared.utils';
import { AbstractWsAdapter } from '@nestjs/websockets';
import {
CLOSE_EVENT,
Expand Down Expand Up @@ -49,9 +49,13 @@ export class WsAdapter extends AbstractWsAdapter {

public create(
port: number,
options?: Record<string, any> & { namespace?: string; server?: any },
options?: Record<string, any> & {
namespace?: string;
server?: any;
path?: string;
},
) {
const { server, ...wsOptions } = options;
const { server, path, ...wsOptions } = options;
if (wsOptions?.namespace) {
const error = new Error(
'"WsAdapter" does not support namespaces. If you need namespaces in your project, consider using the "@nestjs/platform-socket.io" package instead.',
Expand All @@ -69,14 +73,14 @@ export class WsAdapter extends AbstractWsAdapter {
}),
);

this.addWsServerToRegistry(wsServer, port, options.path || '/');
this.addWsServerToRegistry(wsServer, port, path);
return wsServer;
}

if (server) {
return server;
}
if (options.path && port !== UNDERLYING_HTTP_SERVER_PORT) {
if (path && port !== UNDERLYING_HTTP_SERVER_PORT) {
// Multiple servers with different paths
// sharing a single HTTP/S server running on different port
// than a regular HTTP application
Expand All @@ -89,12 +93,13 @@ export class WsAdapter extends AbstractWsAdapter {
...wsOptions,
}),
);
this.addWsServerToRegistry(wsServer, port, options.path);
this.addWsServerToRegistry(wsServer, port, path);
return wsServer;
}
const wsServer = this.bindErrorHandler(
new wsPackage.Server({
port,
path,
...wsOptions,
}),
);
Expand Down Expand Up @@ -202,7 +207,7 @@ export class WsAdapter extends AbstractWsAdapter {
const entries = this.wsServersRegistry.get(port) ?? [];
entries.push(wsServer);

wsServer.path = path;
wsServer.path = normalizePath(path);
this.wsServersRegistry.set(port, entries);
}
}
53 changes: 53 additions & 0 deletions sample/02-gateways/e2e/events-gateway/gateway.e2e-spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { INestApplication } from '@nestjs/common';
import { Test } from '@nestjs/testing';
import { AppModule } from '../../src/app.module';
import { io, Socket } from 'socket.io-client';

describe('EventsGateway', () => {
let app: INestApplication;
let socket: Socket;

beforeAll(async () => {
const moduleRef = await Test.createTestingModule({
imports: [AppModule],
}).compile();

app = moduleRef.createNestApplication();
await app.listen(3000);
});

beforeEach(() => {
socket = io('http://localhost:3000');
socket.connect();
});

describe('findAll', () => {
it('should receive 3 numbers', done => {
let eventCount = 1;
socket.emit('events', { test: 'test' });
socket.on('events', data => {
expect(data).toBe(eventCount);
if (++eventCount > 3) {
done();
}
});
});
});

describe('identity', () => {
it('should return the same number has what was sent', done => {
socket.emit('identity', 0, response => {
expect(response).toBe(0);
done();
});
});
});

afterEach(() => {
socket.disconnect();
});

afterAll(async () => {
await app.close();
});
});
14 changes: 14 additions & 0 deletions sample/02-gateways/e2e/jest-e2e.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"json"
],
"transform": {
"^.+\\.tsx?$": "ts-jest"
},
"testRegex": "/e2e/.*\\.(e2e-test|e2e-spec).(ts|tsx|js)$",
"collectCoverageFrom" : ["src/**/*.{js,jsx,tsx,ts}", "!**/node_modules/**", "!**/vendor/**"],
"coverageReporters": ["json", "lcov"]
}
14 changes: 14 additions & 0 deletions sample/02-gateways/jest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"json"
],
"transform": {
"^.+\\.tsx?$": "ts-jest"
},
"testRegex": "/src/.*\\.(test|spec).(ts|tsx|js)$",
"collectCoverageFrom" : ["src/**/*.{js,jsx,tsx,ts}", "!**/node_modules/**", "!**/vendor/**"],
"coverageReporters": ["json", "lcov"]
}
25 changes: 22 additions & 3 deletions sample/02-gateways/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 19 additions & 1 deletion sample/02-gateways/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "echo 'No e2e tests implemented yet.'"
"test:e2e": "jest --config ./e2e/jest-e2e.json"
},
"dependencies": {
"@nestjs/common": "9.3.12",
Expand All @@ -37,6 +37,7 @@
"@nestjs/schematics": "9.0.4",
"@nestjs/testing": "9.3.12",
"@types/express": "4.17.13",
"@types/jest": "28.1.4",
"@types/node": "18.0.3",
"@types/supertest": "2.0.12",
"@types/ws": "8.5.3",
Expand All @@ -54,5 +55,22 @@
"ts-node": "10.8.2",
"tsconfig-paths": "4.0.0",
"typescript": "4.9.5"
},
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
}
40 changes: 40 additions & 0 deletions sample/02-gateways/src/events/events.gateway.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { Test, TestingModule } from '@nestjs/testing';
import { reduce } from 'rxjs/operators';
import { EventsGateway } from './events.gateway';

describe('EventsGateway', () => {
let gateway: EventsGateway;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [EventsGateway],
}).compile();

gateway = module.get<EventsGateway>(EventsGateway);
});

it('should be defined', () => {
expect(gateway).toBeDefined();
});

describe('findAll', () => {
it('should return 3 numbers', done => {
gateway
.findAll({})
.pipe(reduce((acc, item) => [...acc, item], []))
.subscribe(results => {
expect(results.length).toBe(3);
results.forEach((result, index) =>
expect(result.data).toBe(index + 1),
);
done();
});
});
});

describe('identity', () => {
it('should return the same number has what was sent', async () => {
await expect(gateway.identity(1)).resolves.toBe(1);
});
});
});

0 comments on commit e990336

Please sign in to comment.