Unable to get the mock WebSocket client running

Viewed 35

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.

0 Answers
Related