UNPKG

matterbridge-roborock-vacuum-plugin

Version:
169 lines 7.72 kB
import { beforeEach, describe, expect, it, vi } from 'vitest'; import { ClientRouter } from '../../../roborockCommunication/routing/clientRouter.js'; import { asPartial, asType } from '../../testUtils.js'; describe('ClientRouter', () => { let mockLogger; let mockUserData; let mockMQTTClient; let mockLocalNetworkClient; beforeEach(() => { mockLogger = { debug: vi.fn(), notice: vi.fn() }; mockUserData = { username: 'testuser', uid: '123', token: '123:123/lfrZhw==:123', tokentype: 'Bearer', rruid: '123', region: 'eu', countrycode: '33', country: 'FR', nickname: '123', rriot: { u: '123', s: '123', h: '123', k: '123', r: { r: 'EU', a: 'https://api-eu.roborock.com', m: 'ssl://mqtt-eu-2.roborock.com:8883', l: 'https://wood-eu.roborock.com', }, }, }; mockMQTTClient = { isConnected: vi.fn().mockReturnValue(true), connect: vi.fn(), disconnect: vi.fn(), }; mockLocalNetworkClient = { isConnected: vi.fn().mockReturnValue(true), isReady: vi.fn().mockReturnValue(true), connect: vi.fn(), disconnect: vi.fn(), send: vi.fn(), get: vi.fn(), }; }); it('registerConnectionListener should call connectionListener.register', () => { const router = new ClientRouter(mockLogger, mockUserData); const listener = asType({}); const spy = vi.spyOn(router['connectionBroadcaster'], 'register'); router.registerConnectionListener(listener); expect(spy).toHaveBeenCalledWith(listener); }); it('registerMessageListener should call responseBroadcaster.register', () => { const router = new ClientRouter(mockLogger, mockUserData); const listener = asType({}); const spy = vi.spyOn(router['broadcasterFactory'], 'register'); router.registerMessageListener(listener); expect(spy).toHaveBeenCalledWith(listener); }); it('isConnected should return mqttClient.isConnected', () => { const router = new ClientRouter(mockLogger, mockUserData); mockMQTTClient = { isConnected: vi.fn().mockReturnValue(true), }; router['mqttClient'] = mockMQTTClient; expect(router.isConnected()).toBe(true); }); it('connect should call connect on mqttClient and all localClients', () => { const router = new ClientRouter(mockLogger, mockUserData); router['mqttClient'] = mockMQTTClient; router.registerClient('duid', '127.0.0.1'); router['localClients'].set('duid', mockLocalNetworkClient); router.connect(); expect(mockMQTTClient.connect).toHaveBeenCalled(); expect(mockLocalNetworkClient.connect).toHaveBeenCalled(); }); it('disconnect should call disconnect on mqttClient and all localClients', async () => { const router = new ClientRouter(mockLogger, mockUserData); router.registerClient('duid', '127.0.0.1'); mockMQTTClient = { isConnected: vi.fn().mockReturnValue(false), connect: vi.fn(), disconnect: vi.fn(), }; router['mqttClient'] = mockMQTTClient; router['localClients'].set('duid', mockLocalNetworkClient); await router.disconnect(); expect(mockMQTTClient.disconnect).toHaveBeenCalled(); expect(mockLocalNetworkClient.disconnect).toHaveBeenCalled(); }); it('send should use mqttClient for secure requests', async () => { mockMQTTClient = { isConnected: vi.fn().mockReturnValue(false), connect: vi.fn(), disconnect: vi.fn(), send: vi.fn(), }; const router = new ClientRouter(mockLogger, mockUserData); const request = asPartial({ secure: true }); router['mqttClient'] = mockMQTTClient; await router.send('duid', request); expect(mockMQTTClient.send).toHaveBeenCalledWith('duid', request); }); it('send should use localClient for non-secure requests', async () => { const router = new ClientRouter(mockLogger, mockUserData); router.registerClient('duid', '127.0.0.1'); const request = asPartial({ secure: false }); router['localClients'].set('duid', mockLocalNetworkClient); await router.send('duid', request); expect(mockLocalNetworkClient.send).toHaveBeenCalledWith('duid', request); }); it('get should use mqttClient for secure requests', async () => { const router = new ClientRouter(mockLogger, mockUserData); const request = asPartial({ secure: true }); mockMQTTClient = { isConnected: vi.fn().mockReturnValue(false), connect: vi.fn(), disconnect: vi.fn(), send: vi.fn(), get: vi.fn(), }; router['mqttClient'] = mockMQTTClient; await router.get('duid', request); expect(mockMQTTClient.get).toHaveBeenCalledWith('duid', request); }); it('get should use localClient for non-secure requests', async () => { const router = new ClientRouter(mockLogger, mockUserData); router.registerClient('duid', '127.0.0.1'); const request = asPartial({ secure: false }); router['localClients'].set('duid', mockLocalNetworkClient); await router.get('duid', request); expect(mockLocalNetworkClient.get).toHaveBeenCalledWith('duid', request); }); it('getLocalClient should return localClient if connected', () => { const router = new ClientRouter(mockLogger, mockUserData); router.registerClient('duid', '127.0.0.1'); router['localClients'].set('duid', mockLocalNetworkClient); expect(router['getLocalClient']('duid')).toBe(mockLocalNetworkClient); }); it('getLocalClient should return mqttClient if localClient not connected', () => { mockLocalNetworkClient.isConnected.mockReturnValue(false); const router = new ClientRouter(mockLogger, mockUserData); router.registerClient('duid', '127.0.0.1'); router['mqttClient'] = mockMQTTClient; expect(router['getLocalClient']('duid')).toBe(mockMQTTClient); }); it('getLocalClient should return mqttClient when localClient isReady returns false', () => { mockLocalNetworkClient.isReady = vi.fn().mockReturnValue(false); const router = new ClientRouter(mockLogger, mockUserData); router['mqttClient'] = mockMQTTClient; router['localClients'].set('duid', mockLocalNetworkClient); expect(router['getLocalClient']('duid')).toBe(mockMQTTClient); }); it('getLocalClient should return mqttClient when no localClient is registered for duid', () => { const router = new ClientRouter(mockLogger, mockUserData); router['mqttClient'] = mockMQTTClient; expect(router['getLocalClient']('unknown-duid')).toBe(mockMQTTClient); }); it('getLocalClient should return mqttClient when LocalNetworkClient isReconnecting', () => { const router = new ClientRouter(mockLogger, mockUserData); router['mqttClient'] = mockMQTTClient; const localClient = router.registerClient('duid', '127.0.0.1'); localClient.intentionalDisconnect = true; expect(router['getLocalClient']('duid')).toBe(mockMQTTClient); }); }); //# sourceMappingURL=clientRouter.test.js.map