inventoresed
Version:
Z-Wave driver written entirely in JavaScript/TypeScript
76 lines (66 loc) • 2.31 kB
text/typescript
/* eslint-disable @typescript-eslint/no-empty-function */
import { MockSerialPort } from "@zwave-js/serial";
import type { DeepPartial } from "@zwave-js/shared";
import { Driver } from "../driver/Driver";
import type { ZWaveOptions } from "../driver/ZWaveOptions";
// load the driver with stubbed out Serialport
jest.mock("@zwave-js/serial", () => {
const mdl: typeof import("@zwave-js/serial") =
jest.requireActual("@zwave-js/serial");
return {
...mdl,
ZWaveSerialPort: mdl.MockSerialPort,
};
});
export const PORT_ADDRESS = "/tty/FAKE";
/** Creates a real driver instance with a mocked serial port to enable end to end tests */
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export async function createAndStartDriver(
options: DeepPartial<ZWaveOptions> = {},
) {
// Usually we don't want logs in these tests
if (!options.logConfig) {
options.logConfig = {
enabled: false,
};
}
const driver = new Driver(PORT_ADDRESS, {
...options,
testingHooks: {
skipControllerIdentification: true,
skipNodeInterview: true,
},
});
driver.on("error", () => {
/* swallow error events during testing */
});
// We don't need to test the soft reset logic in CI
// Return a promise that never resolves, so we don't accidentally stumble into interview code
driver.softReset = () => new Promise(() => {});
await driver.start();
const portInstance = MockSerialPort.getInstance(PORT_ADDRESS)!;
portInstance.openStub.mockClear();
portInstance.closeStub.mockClear();
portInstance.writeStub.mockClear();
portInstance["_lastWrite"] = undefined;
// Mock the value DB, because the original one will not be initialized
// with skipInterview: true
driver["_valueDB"] = new Map() as any;
driver["_valueDB"]!.close = () => Promise.resolve();
driver["_metadataDB"] = new Map() as any;
driver["_metadataDB"]!.close = () => Promise.resolve();
driver["_networkCache"] = new Map() as any;
driver["_networkCache"]!.close = () => Promise.resolve();
// Mock the controller as it will not be initialized with skipInterview: true
driver["_controller"] = {
ownNodeId: 1,
isFunctionSupported: () => true,
nodes: new Map(),
incrementStatistics: () => {},
removeAllListeners: () => {},
} as any;
return {
driver,
serialport: portInstance,
};
}