UNPKG

amaran-light-cli

Version:

Command line tool for controlling Aputure Amaran lights via WebSocket to a local Amaran desktop app.

424 lines 17.9 kB
import LightController from '../deviceControl/lightControl.js'; import { MockLightServer } from '../test/MockLightServer.js'; const TEST_PORT = 8089; const WS_URL = `ws://localhost:${TEST_PORT}`; describe('LightController', () => { let server; let controller; const nodeId = '400J5-F2C008'; beforeAll(async () => { server = new MockLightServer(TEST_PORT); await new Promise((resolve) => setTimeout(resolve, 500)); // Give server time to start }); afterAll(async () => { // We need to ensure the server is closed properly await new Promise((resolve) => { server.close((err) => { if (err) console.error('Error closing server:', err); resolve(); }); }); // Add a small buffer to ensure the port is released await new Promise((resolve) => setTimeout(resolve, 100)); }); afterEach(async () => { if (controller) { await controller.disconnect(); controller = undefined; // Clear reference } server.resetState(); }); it('should initialize and fetch devices', async () => { controller = new LightController(WS_URL, 'test_client', () => { expect(controller?.getDevices().length).toBe(2); }, false); // Wait for connection/init await new Promise((resolve) => setTimeout(resolve, 500)); expect(controller?.getDevices().length).toBe(2); }, 5000); it('should turn on all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.turnOnAllLights((success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); // Check state on server const state = server.getDeviceState('400J5-F2C008'); expect(state?.sleep).toBe(false); }, 5000); it('should turn off all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.turnOffAllLights((success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); // Check state on server const state = server.getDeviceState('400J5-F2C008'); expect(state?.sleep).toBe(true); }, 5000); it('should toggle all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); // First ensure it's in a known state (e.g. sleep=false) // Direct manipulation of server state would be better, but for now we rely on default being false await new Promise((resolve) => { controller?.toggleAllLights((success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); // Default was false, toggle should make it true const state = server.getDeviceState('400J5-F2C008'); expect(state?.sleep).toBe(true); // Toggle again await new Promise((resolve) => { controller?.toggleAllLights((success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); const state2 = server.getDeviceState('400J5-F2C008'); expect(state2?.sleep).toBe(false); }, 5000); it('should set intensity for all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setIntensityForAllLights(100, (success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); const state = server.getDeviceState('400J5-F2C008'); expect(state?.intensity).toBe(100); }, 5000); it('should increment intensity for all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); // Initial set await controller.setIntensityForAllLights(500); await new Promise((res) => setTimeout(res, 100)); await new Promise((resolve) => { controller?.incrementIntensityForAllLights(100, (success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); const state = server.getDeviceState('400J5-F2C008'); // 500 + 100 = 600 expect(state?.intensity).toBe(600); }, 5000); it('should set CCT for all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setCCTAndIntensityForAllLights(5600, 100, (success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); const state = server.getDeviceState('400J5-F2C008'); expect(state?.cct).toBe(5600); expect(state?.intensity).toBe(100); expect(state?.work_mode).toBe('CCT'); }, 5000); it('should increment CCT for all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); // Initial set await controller.setCCTAndIntensityForAllLights(3200, 100); await new Promise((res) => setTimeout(res, 100)); await new Promise((resolve) => { controller?.incrementCCTForAllLights(100, 200, (success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); const state = server.getDeviceState('400J5-F2C008'); // 3200 + 100 = 3300 expect(state?.cct).toBe(3300); expect(state?.intensity).toBe(200); }, 5000); it('should set HSI for all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setHSIForAllLights(120, 80, 100, 5600, 0, (success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); const state = server.getDeviceState('400J5-F2C008'); expect(state?.hue).toBe(120); expect(state?.sat).toBe(80); expect(state?.intensity).toBe(100); expect(state?.work_mode).toBe('HSI'); }, 5000); it('should set color for all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setColorForAllLights('red', 100, (success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); // The mock server doesn't parse 'red' to HSI yet, so we just check OK response }, 5000); it('should set system effect for all lights', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setSystemEffectForAllLights('flash', 100, (success, msg) => { expect(success).toBe(true); expect(msg).toBe('OK'); resolve(); }); }); }, 5000); it('should handle scene management', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.saveScene('Midnight', (success, _msg, data) => { expect(success).toBe(true); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison expect(data.id).toBe('scene-123'); resolve(); }); }); await new Promise((resolve) => { controller?.recallScene('scene-123', (success) => { expect(success).toBe(true); resolve(); }); }); }, 5000); it('should get intensity and CCT', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); controller.setIntensity(nodeId, 750); await new Promise((resolve) => { controller?.getIntensity(nodeId, (success, _msg, data) => { expect(success).toBe(true); expect(data).toBe(750); resolve(); }); }); controller.setCCT(nodeId, 4500); await new Promise((resolve) => { controller?.getCCT(nodeId, (success, _msg, data) => { expect(success).toBe(true); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison expect(data.cct).toBe(4500); resolve(); }); }); }, 5000); it('should set and get RGB', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setRGB(nodeId, 255, 0, 128, 500, (success) => { expect(success).toBe(true); resolve(); }); }); await new Promise((resolve) => { controller?.getRGB(nodeId, (success, _msg, data) => { expect(success).toBe(true); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison expect(data.r).toBe(255); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison expect(data.b).toBe(128); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison expect(data.intensity).toBe(500); resolve(); }); }); }, 5000); it('should set and get XY', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setXY(nodeId, 0.3, 0.4, 600, (success) => { expect(success).toBe(true); resolve(); }); }); await new Promise((resolve) => { controller?.getXY(nodeId, (success, _msg, data) => { expect(success).toBe(true); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison expect(data.x).toBe(0.3); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison expect(data.y).toBe(0.4); resolve(); }); }); }, 5000); it('should manage custom effects', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setEffect(nodeId, 'Strobe', { speed: 10 }, (success) => { expect(success).toBe(true); resolve(); }); }); await new Promise((resolve) => { controller?.getEffect(nodeId, (success, _msg, data) => { expect(success).toBe(true); expect(data).toBe('Strobe'); resolve(); }); }); }, 5000); it('should control fan', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setFanMode(nodeId, 1, (success) => { expect(success).toBe(true); resolve(); }); }); await new Promise((resolve) => { controller?.getFanMode(nodeId, (success, _msg, data) => { expect(success).toBe(true); expect(data).toBe(1); resolve(); }); }); await new Promise((resolve) => { controller?.setFanSpeed(nodeId, 2200, (success) => { expect(success).toBe(true); resolve(); }); }); await new Promise((resolve) => { controller?.getFanSpeed(nodeId, (success, _msg, data) => { expect(success).toBe(true); expect(data).toBe(2200); resolve(); }); }); }, 5000); describe('Advanced Effect & Preset Control', () => { it('should control effect speed and intensity', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setEffectSpeed(nodeId, 50, (success) => { expect(success).toBe(true); resolve(); }); }); await new Promise((resolve) => { controller?.setEffectIntensity(nodeId, 800, (success) => { expect(success).toBe(true); resolve(); }); }); }); it('should set preset', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setPreset(nodeId, 'preset-456', (success, _msg, data) => { expect(success).toBe(true); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison expect(data.id).toBe('preset-456'); resolve(); }); }); }); }); describe('Quickshot Control', () => { it('should get quickshot list', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.getQuickshotList((success, _msg, data) => { expect(success).toBe(true); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison expect(data.data.length).toBeGreaterThan(0); resolve(); }); }); }); it('should set quickshot', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); await new Promise((resolve) => { controller?.setQuickshot('qs-123', (success, _msg, data) => { expect(success).toBe(true); expect(data).toBe('qs-123'); resolve(); }); }); }); }); describe('Group Management', () => { it('should manage groups', async () => { controller = new LightController(WS_URL, 'test_client', undefined, false); await new Promise((res) => setTimeout(res, 200)); let createdGroupId = ''; // Create group await new Promise((resolve) => { controller?.createGroup('All Room', (success, _msg, data) => { expect(success).toBe(true); // biome-ignore lint/suspicious/noExplicitAny: Mock data comparison createdGroupId = data.id; resolve(); }); }); // Add to group await new Promise((resolve) => { controller?.addToGroup(createdGroupId, nodeId, (success) => { expect(success).toBe(true); resolve(); }); }); // Get group list await new Promise((resolve) => { controller?.getGroupList((success) => { expect(success).toBe(true); resolve(); }); }); // Remove from group await new Promise((resolve) => { controller?.removeFromGroup(createdGroupId, nodeId, (success) => { expect(success).toBe(true); resolve(); }); }); // Delete group await new Promise((resolve) => { controller?.deleteGroup(createdGroupId, (success) => { expect(success).toBe(true); resolve(); }); }); }); }); }); //# sourceMappingURL=lightControl.test.js.map