matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
196 lines • 7.05 kB
JavaScript
import { vi } from 'vitest';
/**
* Shared testing utilities for unit tests.
* Keep these minimal and side-effect free; tests import what they need.
*/
export function createMockLogger() {
return {
debug: vi.fn(),
error: vi.fn(),
notice: vi.fn(),
warn: vi.fn(),
info: vi.fn(),
log: vi.fn(),
};
}
export function makeMockClientRouter(overrides = {}) {
const localClient = {
connect: vi.fn(),
disconnect: vi.fn(),
isConnected: vi.fn().mockReturnValue(true),
};
return {
registerDevice: vi.fn(),
registerMessageListener: vi.fn(),
registerConnectionListener: vi.fn(),
connect: vi.fn(),
disconnect: vi.fn(),
isConnected: vi.fn().mockReturnValue(true),
isReady: vi.fn().mockReturnValue(true),
registerClient: vi.fn().mockReturnValue(localClient),
updateNonce: vi.fn(),
destroy: vi.fn(),
destroyAll: vi.fn(),
// Add common Client methods used by dispatchers
send: vi.fn().mockResolvedValue(undefined),
get: vi.fn().mockResolvedValue(undefined),
...overrides,
};
}
export function makeLocalClientStub(overrides = {}) {
return {
connect: vi.fn(),
disconnect: vi.fn(),
isConnected: vi.fn().mockReturnValue(true),
isReady: vi.fn().mockReturnValue(true),
...overrides,
};
}
export function createMockLocalStorage(overrides = {}) {
const base = {
init: vi.fn(),
setOptions: vi.fn(),
// node-persist LocalStorage methods are async; provide Promise-returning mocks with correct result types
getItem: vi.fn(async (_k) => null),
setItem: vi.fn(async (_k, _v, _o) => ({})),
removeItem: vi.fn(async (_k) => ({})),
clear: vi.fn(async () => undefined),
keys: vi.fn(async () => []),
};
// Wrap any provided overrides that may be sync into async wrappers so the resulting shape matches LocalStorage
const result = { ...base };
if (overrides.getItem) {
const f = overrides.getItem;
result.getItem = vi.fn(async (...a) => Promise.resolve(f(...a)));
}
if (overrides.setItem) {
const f = overrides.setItem;
result.setItem = vi.fn(async (...a) => Promise.resolve(f(...a)));
}
if (overrides.removeItem) {
const f = overrides.removeItem;
result.removeItem = vi.fn(async (...a) => Promise.resolve(f(...a)));
}
if (overrides.clear) {
const f = overrides.clear;
result.clear = vi.fn(async (...a) => Promise.resolve(f(...a)));
}
if (overrides.keys) {
const f = overrides.keys;
result.keys = vi.fn(async (...a) => Promise.resolve(f(...a)));
}
// Copy through any other non-function overrides
for (const [k, v] of Object.entries(overrides)) {
if (!['getItem', 'setItem', 'removeItem', 'clear', 'keys'].includes(k)) {
result[k] = v;
}
}
return result;
}
export function createMockConfigManager(overrides = {}) {
const base = {
get forceRunAtDefault() {
return overrides.forceRunAtDefault ?? false;
},
get useVacationModeToSendVacuumToDock() {
return overrides.useVacationModeToSendVacuumToDock ?? false;
},
get isMultipleMapEnabled() {
return overrides.isMultipleMapEnabled ?? false;
},
get hasWhiteListConfig() {
return overrides.hasWhiteListConfig ?? false;
},
get includeDockStationStatus() {
return overrides.includeDockStationStatus ?? false;
},
get includeVacuumErrorStatus() {
return overrides.includeVacuumErrorStatus ?? false;
},
validateConfig: () => true,
validateAuthentication: () => true,
};
return base;
}
// Generic helper to assert partial objects as full typed instances in tests
export function asPartial(obj) {
return obj;
}
// Small helper to assert a value of unknown origin as a target type in tests where
// the runtime value is intentionally invalid (e.g., undefined/null/primitive) so
// we can assert behavior without scattering `as any`/`as unknown` throughout tests.
export function asType(v) {
return v;
}
export function createMockIotApi(overrides = {}) {
const base = {
logger: createMockLogger(),
getHomev2: vi.fn().mockResolvedValue(undefined),
getHomev3: vi.fn().mockResolvedValue(undefined),
getHome: vi.fn().mockResolvedValue(undefined),
getScenes: vi.fn().mockResolvedValue(undefined),
getHomeWithProducts: vi.fn().mockResolvedValue(undefined),
};
return { ...base, ...overrides };
}
export function createMockAuthApi(overrides = {}) {
const base = {
getBasicHomeInfo: vi.fn().mockResolvedValue(undefined),
};
return { ...base, ...overrides };
}
export function createMockDeviceRegistry(overrides = {}, robots) {
const rmap = robots ?? new Map();
const base = {
robotsMap: rmap,
devicesMap: new Map(),
getRobot: (duid) => rmap.get(duid),
hasDevices: vi.fn(() => rmap.size > 0),
registerRobot: vi.fn((robot) => undefined),
register: vi.fn((_device, _robot) => undefined),
registerDevice: vi.fn((_device) => undefined),
unregister: vi.fn((_sn) => undefined),
getDevice: vi.fn((_sn) => undefined),
getAllRobots: vi.fn(() => Array.from(rmap.values())),
getAllDevices: vi.fn(() => []),
size: 0,
clear: vi.fn(),
};
return { ...base, ...overrides };
}
export function createMockRoborockService(overrides = {}) {
const base = {
getHomeDataForUpdating: vi.fn().mockResolvedValue(undefined),
getSupportedAreas: vi.fn().mockReturnValue([]),
getSupportedAreasIndexMap: vi.fn().mockReturnValue(new Map()),
getSelectedAreas: vi.fn().mockReturnValue([]),
getMapInfo: vi.fn().mockResolvedValue({ maps: [], allRooms: [] }),
getRoomMap: vi.fn().mockResolvedValue(new Map()),
getSerialNumber: vi.fn().mockResolvedValue('mock-serial'),
requestDeviceStatusOnce: vi.fn().mockResolvedValue(undefined),
};
return { ...base, ...overrides };
}
export function createMockMatterbridge(overrides = {}) {
const base = {
matterbridgeVersion: '3.5.5',
matterbridgePluginDirectory: '/tmp',
matterbridgeDirectory: '/tmp',
verifyMatterbridgeVersion: () => true,
};
return { ...base, ...overrides };
}
export function wait(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
export const mkUser = () => asPartial({
rriot: { r: { a: 'https://api.example', r: 'r', m: 'm', l: 'l' }, u: 'uid', s: 's', h: 'h', k: 'k' },
});
export function setReadOnlyProperty(obj, key, value) {
Object.defineProperty(obj, key, {
value,
writable: false,
configurable: true,
});
}
//# sourceMappingURL=testUtils.js.map