mirror of
https://github.com/CommunitySolidServer/CommunitySolidServer.git
synced 2024-10-03 14:55:10 +00:00
feat: Support both the old and new WebSocket specifications together
This commit is contained in:
@@ -4,6 +4,7 @@ import type { WebSocket } from 'ws';
|
||||
import type { Logger } from '../../../src/logging/Logger';
|
||||
import { getLoggerFor } from '../../../src/logging/LogUtil';
|
||||
import type { HttpRequest } from '../../../src/server/HttpRequest';
|
||||
import type { WebSocketHandler } from '../../../src/server/WebSocketHandler';
|
||||
import { WebSocketServerConfigurator } from '../../../src/server/WebSocketServerConfigurator';
|
||||
import { flushPromises } from '../../util/Util';
|
||||
|
||||
@@ -22,18 +23,13 @@ jest.mock('../../../src/logging/LogUtil', (): any => {
|
||||
return { getLoggerFor: (): Logger => logger };
|
||||
});
|
||||
|
||||
class SimpleWebSocketConfigurator extends WebSocketServerConfigurator {
|
||||
public async handleConnection(): Promise<void> {
|
||||
// Will be overwritten
|
||||
}
|
||||
}
|
||||
|
||||
describe('A WebSocketServerConfigurator', (): void => {
|
||||
const logger: jest.Mocked<Logger> = getLoggerFor('mock') as any;
|
||||
let server: Server;
|
||||
let webSocket: WebSocket;
|
||||
let upgradeRequest: HttpRequest;
|
||||
let listener: jest.Mocked<SimpleWebSocketConfigurator>;
|
||||
let handler: jest.Mocked<WebSocketHandler>;
|
||||
let configurator: WebSocketServerConfigurator;
|
||||
|
||||
beforeEach(async(): Promise<void> => {
|
||||
// Clearing the logger mock
|
||||
@@ -43,17 +39,20 @@ describe('A WebSocketServerConfigurator', (): void => {
|
||||
webSocket.send = jest.fn();
|
||||
webSocket.close = jest.fn();
|
||||
|
||||
upgradeRequest = { url: `/foo` } as any;
|
||||
upgradeRequest = new EventEmitter() as any;
|
||||
|
||||
listener = new SimpleWebSocketConfigurator() as any;
|
||||
listener.handleConnection = jest.fn().mockResolvedValue('');
|
||||
await listener.handle(server);
|
||||
handler = {
|
||||
handleSafe: jest.fn(),
|
||||
} as any;
|
||||
|
||||
configurator = new WebSocketServerConfigurator(handler);
|
||||
await configurator.handle(server);
|
||||
});
|
||||
|
||||
it('attaches an upgrade listener to any server it gets.', async(): Promise<void> => {
|
||||
server = new EventEmitter() as any;
|
||||
expect(server.listenerCount('upgrade')).toBe(0);
|
||||
await listener.handle(server);
|
||||
await configurator.handle(server);
|
||||
expect(server.listenerCount('upgrade')).toBe(1);
|
||||
});
|
||||
|
||||
@@ -62,19 +61,22 @@ describe('A WebSocketServerConfigurator', (): void => {
|
||||
|
||||
await flushPromises();
|
||||
|
||||
expect(listener.handleConnection).toHaveBeenCalledTimes(1);
|
||||
expect(listener.handleConnection).toHaveBeenLastCalledWith(webSocket, upgradeRequest);
|
||||
expect(handler.handleSafe).toHaveBeenCalledTimes(1);
|
||||
expect(handler.handleSafe).toHaveBeenLastCalledWith({ webSocket, upgradeRequest });
|
||||
expect(logger.error).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
it('logs an error if something went wrong handling the connection.', async(): Promise<void> => {
|
||||
listener.handleConnection.mockRejectedValue(new Error('bad input'));
|
||||
handler.handleSafe.mockRejectedValue(new Error('bad input'));
|
||||
server.emit('upgrade', upgradeRequest, webSocket);
|
||||
|
||||
await flushPromises();
|
||||
|
||||
expect(listener.handleConnection).toHaveBeenCalledTimes(1);
|
||||
expect(handler.handleSafe).toHaveBeenCalledTimes(1);
|
||||
expect(logger.error).toHaveBeenCalledTimes(1);
|
||||
expect(logger.error).toHaveBeenLastCalledWith('Something went wrong handling a WebSocket connection: bad input');
|
||||
expect(webSocket.send).toHaveBeenCalledTimes(1);
|
||||
expect(webSocket.send).toHaveBeenLastCalledWith('There was an error opening this WebSocket: bad input');
|
||||
expect(webSocket.close).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user