Greetings,
Unfortunately I never had time to finish this project (add tests, modify codebase, add source maps and so on). As you can see it's abandoned for some time.
If you're interested in improving or further developing this project, please fork or contact me - I can move the ownership to you.
Table of Contents:
-
-
-
- mws.
track
(method) - mws.
untrack
(method) - mws.
readyState
(object with constants) - mws.
trackedConnections
(object with methods)- mws.trackedConnections.
getAll
(method) - mws.trackedConnections.
getByUrl
(method) - mws.trackedConnections.
when
(method)
- mws.trackedConnections.
- mws.
when
(method) - mws.
bus
(event emitter) - mws.
busEvent
(object with constants)
- mws.
-
Instance of
ManualWebSocketConnection
- WebSocket methods
- ability to change readyState by hand
- connection.
addServerScenario
(method)
-
There are many ways for stubbing http responses, for example in cypress we can use cy.route()
.
But there is no out of the box way to stub WebSocket communication.
Manual WebSocket is built to serve that purpose.
Check repository https://github.com/baal-cadar/manual-web-socket-example
for working example.
- Replace native
WebSocket
constructor withManualWebSocketConnection
- Tell
ManualWebSocket
which addresses to track - When
new WebSocket(addr)
is executed:- Check if
addr
is marked to be tracked- If yes - create
ManualWebSocketConnection
instance - If not - create
WebSocket
instance
- If yes - create
- Check if
ManualWebSocket
object gives you access to tracked connections, so you can manipulate them with no need to make any changes in your application code. Also can act as a server, creating fake communication channel.
window.ManualWebSocket = window.MWS = window.mws;
Add addresses you want to be tracked.
Can be used multiple times, each time it will add new addresses to the tracked list.
Be aware that track
will not close nor replace active connection.
Just next time when WebSocket will be created using given address, it will be marked as tracked
.
public track: (addresses: Array<string | RegExp>): void
Example:
mws.track([address1, address2, ...]);
/* address can be string or RegExp */
mws.track(["wss://127.0.0.1:777", /other\.domain/]);
Remove addresses you want don't want to be tracked next time.
Be aware that untrack
will not close nor replace active connection.
Just next time when WebSocket will be created using given address, it won't be marked as tracked
.
public untrack: (addresses: Array<string | RegExp>): void
Example:
mws.untrack([address1, address2]);
/* address can be string or RegExp */
mws.untrack(["wss://127.0.0.1:777", /other\.domain/]);
WebSocket ready state constants:
enum ReadyState {
CONNECTING = 0,
OPEN = 1,
CLOSING = 2,
CLOSED = 3
}
Example:
connection.readyState = mws.readyState.OPEN;
/**
* By the way - setting a new state will trigger proper callbacks
* For example `OPEN` will trigger `onOpen` and callbacks registered with `.on('open', ...)`
*/
Container with all tracked connections. Exposes public interface:
public getAll(): ManualWebSocket[]
public getByUrl(url: string): ManualWebSocket | undefined
public when(url: string): Promise<ManualWebSocket>
-
trackedConnections.
getAll
- returns list of all active tracked connectionspublic getAll(): ManualWebSocket[]
Example:
mws.trackedConnections.getAll().forEach(connection => { console.log(connection.url); });
-
trackedConnections.
getByUrl
- returns connection with given url (explicit)public getByUrl(url: string): ManualWebSocket | undefined
Example:
const connection = mws.trackedConnections.getByUrl("wss://127.0.0.1:777");
-
trackedConnections.
when
- returns a promise that will resolve into a valid connection. If connection already exists, will resolve immediatelypublic when(url: string): Promise<ManualWebSocket>
Example:
const promise = mws.trackedConnections.when("wss://127.0.0.1:777") // or mws.trackedConnections.when("wss://127.0.0.1:777").then(connection => {...})
Alias to mws.trackedConnections.when
Event emitter. Will trigger callbacks upon ManualWebSocket creation - if you need to do some private business
.
Example:
mws.bus.on(mws.busEvent.MANUAL_WEBSOCKET_CREATED, connection => {
console.log("from bus");
});
// or just simply
mws.bus.on("MANUAL_WEBSOCKET_CREATED", connection => {
console.log("from bus");
});
List of events that you can subscribe to on mws.bus
.
Currently there is only one event
- MANUAL_WEBSOCKET_CREATED : will run given callback with created
connection
(see example above)
Example:
console.log(mws.busEvent);
Prepare server response for given message. Use connection.send()
to trigger scenario.
public addServerScenario(clientMessage: string, callback: Function): void
Example:
const message = "some message";
connection.addServerScenario(message, (connection, message) => {
connection.receiveMessage(messageThatServerWouldGenerate);
});
connection.send(message);
- Install package
yarn add manual-web-socket --dev
- Require in test
const manualWebSocket = require("manual-web-socket");
- Inject script at the top of
header
section inonBeforeLoad
stage. UsegetScript
and place it manually
cy.visit("/", {
onBeforeLoad(win) {
var script = win.document.createElement("script");
script.innerText = manualWebSocket.getScript();
win.document.head.appendChild(script);
}
});
- Now you'll have access to
ManualWebSocket
object inwin
scope.
- Download
manual-web-socket.raw.js
file - Place it on top of
<head>
in yourindex.html