UNPKG

matterbridge-roborock-vacuum-plugin

Version:
196 lines 7.05 kB
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