home-assistant-js-websocket/test/util.ts

76 lines
1.8 KiB
TypeScript

import { Connection } from "../dist/connection";
import { HaWebSocket } from "../dist/socket";
class MockWebSocket {
addEventListener(eventType: string, callback: () => {}) {}
removeEventListener(eventType: string, callback: () => {}) {}
send(message: string) {}
close() {}
}
export class MockConnection extends Connection {
private _mockListeners: { [event: string]: ((data: any) => void)[] };
private _mockResponses: {};
constructor() {
super(new MockWebSocket() as HaWebSocket, {} as any);
this._mockListeners = {};
this._mockResponses = {};
}
// hass events
async subscribeEvents<EventType>(
eventCallback: (ev: EventType) => void,
eventType?: string,
) {
if (!eventType) {
throw new Error("mock all events not implemented");
}
if (!(eventType in this._mockListeners)) {
this._mockListeners[eventType] = [];
}
this._mockListeners[eventType].push(eventCallback);
return () => Promise.resolve();
}
mockEvent(event: any, data: any) {
this._mockListeners[event].forEach((cb) => cb(data));
}
mockResponse(type: any, data: any) {
// @ts-ignore
this._mockResponses[type] = data;
}
async sendMessagePromise(message: any) {
if (message.type in this._mockResponses) {
// @ts-ignore
return this._mockResponses[message.type];
}
throw new Error("Unexpected type");
}
}
export class AwaitableEvent {
curPromise?: Promise<any>;
curResolve?: (...args: any[]) => void;
constructor() {
this.set = this.set.bind(this);
}
set(...args: any[]): void {
if (this.curResolve) this.curResolve(...args);
}
prime(): void {
this.curPromise = new Promise((resolve) => {
this.curResolve = resolve;
});
}
wait() {
return this.curPromise;
}
}