Cypress plugin to mock a websocket server during tests.
Install:
npm i cypress-websocket-server
Add cy.setWebsocketWorkflow()
command by adding the following to cypress/support/index.js
:
import { addCommand } from "cypress-websocket-server";
addCommand();
Add websocket server in cypress/plugins/index.js
, accessible via endpoint ws://localhost:1999
:
const { startMockWsServer } = require("cypress-websocket-server");
module.exports = (on, config) => {
startMockWsServer(config);
};
The fixture .json
file should contain an array of objects with properties:
type
:server
: a message that should be sent by the serverclient
: a message the server expects from the clientreconnect
: an expected client reconnection
payload
(optional): message data, can be of any object type
In a scenario where a websocket exchange is expected after the user clicking a button, the websocket can be configured to follow a specific workflow like this:
describe("Trigger WS workflow on button click", () => {
it("Run new project", () => {
cy.visit("/");
cy.setWebsocketWorkflow("expected-workflow.json");
cy.get("[data-cy=ws-trigger-button]").click();
});
});
Being the content of expected-workflow.json
, in fixtures folder:
[
{
"type": "server",
"payload": { "message": "connected" }
},
{
"type": "client",
"payload": { "action": "get-user" }
},
{
"type": "server",
"payload": {
"message": "user-info",
"data": {
"id": 1,
"name": "My User"
}
}
}
]
The server will listen to any connections in ws://localhost:1999
and:
- Send payload
{ "message": "connected" }
on client connection - Expect client message with payload
{ "action": "get-user" }
- Send back user info
If the client doesn't send the expected message in the right order, or send additional messages, an error will be printed to Cypress console.