I am unable to get the client running. For some reason the test timesout saying
thrown: "Exceeded timeout of 5000 ms for a test
The client is always in the connecting mode thus never get connected. Due to this I am unable to test the websockets functionality.
wsServer.test.js
const { startServer, waitForSocketState, createSocketClient } = require("./webSocketTestUtils");
const {WebSocket} = require('../__mocks__/ws');
const port =3000;
describe("WebSocket Server", () => {
let server;
beforeAll(async () => {
server = await startServer(port);
});
afterAll(() => server.close());
test("Server echoes the message it receives from client", async () => {
const [client, messages] = await createSocketClient(port, 50);
const testMessage = "This is a test message from mr.x"; // Send client message
client.send(testMessage); // Perform assertions on the response
await waitForSocketState(client, client.CLOSED);
const [responseMessage] = messages;
expect(responseMessage).toBe(testMessage);
});
});
wsServer.js
const {Server} = require('../__mocks__/ws');
async function createWebSocketServer(server) {
const mockServer = new Server({server});
mockServer.on('connection', socket => {
socket.on('message', message => {
socket.send(message);
});
});
}
module.exports = {createWebSocketServer};
webSocketTestUtils.js
const http = require("http");
const { WebSocket} = require('../__mocks__/ws');
const {createWebSocketServer} = require("./wsServer");
function startServer(port) {
const server = http.createServer();
createWebSocketServer(server);
return new Promise((resolve) => {
server.listen(port, () => resolve(server));
});
}
function waitForSocketState(socket, state) {
return new Promise(function (resolve) {
setTimeout(function () {
if (socket.readyState === state) {
resolve();
} else {
waitForSocketState(socket, state).then(resolve);
}
}, 5);
});
}
async function createSocketClient(port, closeAfter) {
const client = new WebSocket(`ws://localhost:${port}` );
await waitForSocketState(client, client.OPEN);
const messages = [];
client.onmessage = data => {
messages.push(data);
if (messages.length === closeAfter) {
client.close();
}
};
return client, messages;
}
module.exports = { startServer, waitForSocketState, createSocketClient };
mocks/ws.js
const {WebSocket, Server} = require("mock-socket");
module.exports = {WebSocket, Server}
Directory Tree
websockets
| __mocks__
| ws.js
| __tests__
| wsServer.test.js
| wsServer.js
| webSocketTestUtils.js
Dependencies
"jest": "^28.1.3",
"jest-websocket-mock": "^2.3.0"
Would be great if someone can help out, TIA.