jest.mock('../config', () => ({ siw: { baseUrl: 'https://siw.example.com/api', username: 'u', password: 'p' }, logLevel: 'error', })); const { AgentNotConnectedError } = require('../services/websocket'); jest.mock('../services/websocket', () => { class AgentNotConnectedError extends Error { constructor() { super('No remote agent connected'); this.code = 'AGENT_NOT_CONNECTED'; } } return { proxyRequest: jest.fn(), isAgentConnected: () => false, AgentNotConnectedError, }; }); const { proxyRequest } = require('../services/websocket'); const siw = require('../services/siw'); describe('siw service degrades gracefully when remote agent is offline', () => { beforeEach(() => { proxyRequest.mockReset(); proxyRequest.mockRejectedValue(new AgentNotConnectedError()); }); it('getStoreLocation returns null without throwing', async () => { await expect(siw.getStoreLocation('305')).resolves.toBeNull(); }); it('getStoreGeneral returns null without throwing', async () => { await expect(siw.getStoreGeneral('305')).resolves.toBeNull(); }); it('getStoreRegisters returns []', async () => { await expect(siw.getStoreRegisters('305')).resolves.toEqual([]); }); it('getStorePrinters returns []', async () => { await expect(siw.getStorePrinters('305')).resolves.toEqual([]); }); it('getStorePaymentTerminals returns []', async () => { await expect(siw.getStorePaymentTerminals('305')).resolves.toEqual([]); }); it('rethrows non-agent errors', async () => { proxyRequest.mockRejectedValue(new Error('boom')); await expect(siw.getStoreRegisters('305')).rejects.toThrow('boom'); }); });