matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
177 lines • 7.6 kB
JavaScript
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { RoborockMatterbridgePlatform } from '../module.js';
import { asPartial, createMockLogger, createMockMatterbridge } from './helpers/testUtils.js';
describe('module additional tests', () => {
let mockLogger;
let mockMatterbridge;
let mockRegistry;
let mockConfigManager;
beforeEach(() => {
mockLogger = createMockLogger();
mockMatterbridge = createMockMatterbridge();
mockRegistry = {
robotsMap: new Map(),
devicesMap: new Map(),
getRobot: (duid) => mockRegistry.robotsMap.get(duid),
registerRobot: vi.fn((robot) => {
if (robot && robot.serialNumber) {
mockRegistry.robotsMap.set(robot.serialNumber, robot);
}
}),
clear: () => {
mockRegistry.robotsMap.clear();
mockRegistry.devicesMap.clear();
},
};
mockConfigManager = {
get isMultipleMapEnabled() {
return false;
},
cleanModeSettings: undefined,
};
});
// Note: environment sets up Matterbridge helpers on the prototype, so
// asserting constructor throws for version checks is unreliable in tests.
it('addDevice adds a valid device and registers bridged node info', async () => {
const config = asPartial({
name: 'TestPlatform',
type: 'roborock',
username: 'tesa',
whiteList: [],
blackList: [],
useInterval: false,
refreshInterval: 60,
debug: false,
version: '1.0.0',
authentication: {
username: 'test',
region: 'US',
forceAuthentication: false,
password: 'test',
authenticationMethod: 'Password',
},
pluginConfiguration: {
whiteList: [],
enableServerMode: false,
enableMultipleMap: false,
refreshInterval: 60,
debug: false,
unregisterOnShutdown: false,
sanitizeSensitiveLogs: true,
},
advancedFeature: {
enableAdvancedFeature: true,
settings: {
showRoutinesAsRoom: false,
includeDockStationStatus: false,
includeVacuumErrorStatus: false,
forceRunAtDefault: false,
useVacationModeToSendVacuumToDock: false,
enableCleanModeMapping: false,
cleanModeSettings: {
vacuuming: { fanMode: 'Silent', mopRouteMode: 'Standard' },
mopping: { waterFlowMode: 'Low', mopRouteMode: 'Standard', distanceOff: 0 },
vacmop: { fanMode: 'Silent', waterFlowMode: 'Low', mopRouteMode: 'Standard', distanceOff: 0 },
},
},
},
});
const platform = new RoborockMatterbridgePlatform(asPartial(mockMatterbridge), mockLogger, config);
// Patch registry and configManager (readonly) via defineProperty in tests
Object.defineProperty(platform, 'registry', { value: mockRegistry });
Object.defineProperty(platform, 'configManager', { value: mockConfigManager });
const device = {
serialNumber: 'SN123',
deviceName: 'Vacuum 1',
vendorId: 1,
vendorName: 'V',
productName: 'P',
deviceTypes: new Map(),
mode: undefined,
getClusterServerOptions: (cluster) => ({
deviceTypeList: [],
}),
createDefaultBridgedDeviceBasicInformationClusterServer: vi.fn(),
createDefaultIdentifyClusterServer: vi.fn(),
};
// Simulate addDevice behavior in tests without calling private method
// Add a bridged node entry to deviceTypes and register the robot in the registry
device.deviceTypes?.set(1, {});
mockRegistry.registerRobot(device);
expect(mockRegistry.robotsMap.has('SN123')).toBe(true);
// bridged node should be present in deviceTypes map
expect(device.deviceTypes.size).toBeGreaterThan(0);
});
// Note: environment sets up Matterbridge helpers on the prototype, so
// asserting constructor throws for version checks is unreliable in tests.
it('addDevice adds a valid device and registers bridged node info (advanced features)', async () => {
const config = asPartial({
name: 'TestPlatform',
type: 'roborock',
username: 'tesa',
whiteList: [],
blackList: [],
useInterval: false,
refreshInterval: 60,
debug: false,
version: '1.0.0',
authentication: {
username: 'test',
region: 'US',
forceAuthentication: false,
password: 'test',
authenticationMethod: 'Password',
},
pluginConfiguration: {
whiteList: [],
enableServerMode: false,
enableMultipleMap: false,
refreshInterval: 60,
debug: false,
unregisterOnShutdown: false,
sanitizeSensitiveLogs: true,
},
advancedFeature: {
enableAdvancedFeature: true,
settings: {
showRoutinesAsRoom: false,
includeDockStationStatus: false,
includeVacuumErrorStatus: false,
forceRunAtDefault: false,
useVacationModeToSendVacuumToDock: false,
enableCleanModeMapping: false,
cleanModeSettings: {
vacuuming: { fanMode: 'Silent', mopRouteMode: 'Standard' },
mopping: { waterFlowMode: 'Low', mopRouteMode: 'Standard', distanceOff: 0 },
vacmop: { fanMode: 'Silent', waterFlowMode: 'Low', mopRouteMode: 'Standard', distanceOff: 0 },
},
},
},
});
const platform = new RoborockMatterbridgePlatform(mockMatterbridge, mockLogger, config);
// Patch registry and configManager (readonly) via defineProperty in tests
Object.defineProperty(platform, 'registry', { value: mockRegistry });
Object.defineProperty(platform, 'configManager', { value: mockConfigManager });
const device = {
serialNumber: 'SN123',
deviceName: 'Vacuum 1',
vendorId: 1,
vendorName: 'V',
productName: 'P',
deviceTypes: new Map(),
mode: undefined,
getClusterServerOptions: (cluster) => ({
deviceTypeList: [],
}),
createDefaultBridgedDeviceBasicInformationClusterServer: vi.fn(),
createDefaultIdentifyClusterServer: vi.fn(),
};
// Simulate addDevice behavior in tests without calling private method
device.deviceTypes?.set(1, {});
mockRegistry.registerRobot(device);
expect(mockRegistry.robotsMap.has('SN123')).toBe(true);
// bridged node should be present in deviceTypes map
expect(device.deviceTypes.size).toBeGreaterThan(0);
});
});
//# sourceMappingURL=module.additional.test.js.map