amaran-light-cli 1.1.4 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -9
- package/README.md +32 -5
- package/dist/__tests__/autoCct.test.js +89 -20
- package/dist/__tests__/autoCct.test.js.map +1 -1
- package/dist/__tests__/autostart.test.js +87 -41
- package/dist/__tests__/autostart.test.js.map +1 -1
- package/dist/__tests__/cctUtil.test.js +26 -27
- package/dist/__tests__/cctUtil.test.js.map +1 -1
- package/dist/__tests__/cli.smoke.test.js +18 -13
- package/dist/__tests__/cli.smoke.test.js.map +1 -1
- package/dist/__tests__/intensityApi.test.js +4 -9
- package/dist/__tests__/intensityApi.test.js.map +1 -1
- package/dist/__tests__/lightControl.test.js +79 -68
- package/dist/__tests__/lightControl.test.js.map +1 -1
- package/dist/__tests__/setupTests.js +9 -8
- package/dist/__tests__/setupTests.js.map +1 -1
- package/dist/__tests__/simulateSchedule.test.d.ts +2 -0
- package/dist/__tests__/simulateSchedule.test.d.ts.map +1 -0
- package/dist/__tests__/simulateSchedule.test.js +87 -0
- package/dist/__tests__/simulateSchedule.test.js.map +1 -0
- package/dist/autostart.js +19 -60
- package/dist/autostart.js.map +1 -1
- package/dist/cctUtil.d.ts.map +1 -1
- package/dist/cctUtil.js +106 -107
- package/dist/cctUtil.js.map +1 -1
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +52 -247
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/integration.test.d.ts +2 -0
- package/dist/commands/__tests__/integration.test.d.ts.map +1 -0
- package/dist/commands/__tests__/integration.test.js +279 -0
- package/dist/commands/__tests__/integration.test.js.map +1 -0
- package/dist/commands/autoCct.d.ts +1 -1
- package/dist/commands/autoCct.d.ts.map +1 -1
- package/dist/commands/autoCct.js +74 -76
- package/dist/commands/autoCct.js.map +1 -1
- package/dist/commands/cct.d.ts +1 -1
- package/dist/commands/cct.d.ts.map +1 -1
- package/dist/commands/cct.js +17 -23
- package/dist/commands/cct.js.map +1 -1
- package/dist/commands/color.d.ts +1 -1
- package/dist/commands/color.d.ts.map +1 -1
- package/dist/commands/color.js +9 -15
- package/dist/commands/color.js.map +1 -1
- package/dist/commands/config.d.ts +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +64 -66
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/discover.d.ts +1 -1
- package/dist/commands/discover.d.ts.map +1 -1
- package/dist/commands/discover.js +8 -14
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/graphSchedule.d.ts +5 -0
- package/dist/commands/graphSchedule.d.ts.map +1 -0
- package/dist/commands/graphSchedule.js +293 -0
- package/dist/commands/graphSchedule.js.map +1 -0
- package/dist/commands/hsi.d.ts +1 -1
- package/dist/commands/hsi.d.ts.map +1 -1
- package/dist/commands/hsi.js +11 -17
- package/dist/commands/hsi.js.map +1 -1
- package/dist/commands/intensity.d.ts +1 -1
- package/dist/commands/intensity.d.ts.map +1 -1
- package/dist/commands/intensity.js +9 -15
- package/dist/commands/intensity.js.map +1 -1
- package/dist/commands/list.d.ts +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +6 -12
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/power.d.ts +1 -1
- package/dist/commands/power.d.ts.map +1 -1
- package/dist/commands/power.js +18 -24
- package/dist/commands/power.js.map +1 -1
- package/dist/commands/printSchedule.d.ts +5 -0
- package/dist/commands/printSchedule.d.ts.map +1 -0
- package/dist/commands/{schedule.js → printSchedule.js} +113 -116
- package/dist/commands/printSchedule.js.map +1 -0
- package/dist/commands/service.d.ts +1 -1
- package/dist/commands/service.d.ts.map +1 -1
- package/dist/commands/service.js +54 -88
- package/dist/commands/service.js.map +1 -1
- package/dist/commands/simulateSchedule.d.ts +1 -1
- package/dist/commands/simulateSchedule.d.ts.map +1 -1
- package/dist/commands/simulateSchedule.js +50 -70
- package/dist/commands/simulateSchedule.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +8 -14
- package/dist/commands/status.js.map +1 -1
- package/dist/commands.d.ts +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +52 -54
- package/dist/commands.js.map +1 -1
- package/dist/constants.d.ts +13 -14
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +21 -27
- package/dist/constants.js.map +1 -1
- package/dist/discovery.js +8 -15
- package/dist/discovery.js.map +1 -1
- package/dist/geoipUtil.js +3 -9
- package/dist/geoipUtil.js.map +1 -1
- package/dist/lightControl.js +18 -20
- package/dist/lightControl.js.map +1 -1
- package/dist/test/MockLightServer.d.ts +13 -0
- package/dist/test/MockLightServer.d.ts.map +1 -0
- package/dist/test/MockLightServer.js +140 -0
- package/dist/test/MockLightServer.js.map +1 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -2
- package/package.json +17 -15
- package/scripts/release.js +8 -4
- package/scripts/test.sh +2 -2
- package/dist/commands/schedule.d.ts +0 -5
- package/dist/commands/schedule.d.ts.map +0 -1
- package/dist/commands/schedule.js.map +0 -1
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const constants_1 = require("../constants");
|
|
1
|
+
import SunCalc from 'suncalc';
|
|
2
|
+
const { getTimes } = SunCalc;
|
|
3
|
+
import { calculateCCT } from '../cctUtil.js';
|
|
4
|
+
import { CCT_DEFAULTS } from '../constants.js';
|
|
6
5
|
describe('calculateCCT', () => {
|
|
7
6
|
const NYC_LAT = 40.7128;
|
|
8
7
|
const NYC_LON = -74.006;
|
|
9
8
|
// Use the actual defaults from the module for all tests
|
|
10
|
-
const MIN_INTENSITY_PCT =
|
|
11
|
-
const MAX_INTENSITY_PCT =
|
|
12
|
-
const MIN_CCT =
|
|
13
|
-
const MAX_CCT =
|
|
9
|
+
const MIN_INTENSITY_PCT = CCT_DEFAULTS.intensityMinPct;
|
|
10
|
+
const MAX_INTENSITY_PCT = CCT_DEFAULTS.intensityMaxPct;
|
|
11
|
+
const MIN_CCT = CCT_DEFAULTS.cctMinK;
|
|
12
|
+
const MAX_CCT = CCT_DEFAULTS.cctMaxK;
|
|
14
13
|
const MIN_INTENSITY_API = MIN_INTENSITY_PCT * 10; // API format (50)
|
|
15
14
|
const MAX_INTENSITY_API = MAX_INTENSITY_PCT * 10; // API format (1000)
|
|
16
15
|
describe('NYC circadian lighting tests', () => {
|
|
@@ -23,7 +22,7 @@ describe('calculateCCT', () => {
|
|
|
23
22
|
beforeAll(() => {
|
|
24
23
|
// Use a fixed date for consistent test results
|
|
25
24
|
testDate = new Date('2024-06-21T12:00:00Z'); // Summer solstice
|
|
26
|
-
const times =
|
|
25
|
+
const times = getTimes(testDate, NYC_LAT, NYC_LON);
|
|
27
26
|
_sunrise = times.sunrise;
|
|
28
27
|
sunset = times.sunset;
|
|
29
28
|
solarNoon = times.solarNoon;
|
|
@@ -31,8 +30,8 @@ describe('calculateCCT', () => {
|
|
|
31
30
|
night = times.night;
|
|
32
31
|
});
|
|
33
32
|
it('should return minimum CCT and intensity before nightEnd', () => {
|
|
34
|
-
const beforeNightEnd = new Date(nightEnd.getTime() -
|
|
35
|
-
const result =
|
|
33
|
+
const beforeNightEnd = new Date(nightEnd.getTime() - 60_000); // 1 minute before
|
|
34
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, beforeNightEnd, {
|
|
36
35
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
37
36
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
38
37
|
cctMinK: MIN_CCT,
|
|
@@ -43,7 +42,7 @@ describe('calculateCCT', () => {
|
|
|
43
42
|
});
|
|
44
43
|
it('should return minimum CCT and intensity at nightEnd edge', () => {
|
|
45
44
|
const atNightEnd = new Date(nightEnd.getTime());
|
|
46
|
-
const result =
|
|
45
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, atNightEnd, {
|
|
47
46
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
48
47
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
49
48
|
cctMinK: MIN_CCT,
|
|
@@ -55,7 +54,7 @@ describe('calculateCCT', () => {
|
|
|
55
54
|
});
|
|
56
55
|
it('should return maximum CCT and intensity at solar noon', () => {
|
|
57
56
|
const atNoon = new Date(solarNoon.getTime());
|
|
58
|
-
const result =
|
|
57
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, atNoon, {
|
|
59
58
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
60
59
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
61
60
|
cctMinK: MIN_CCT,
|
|
@@ -67,7 +66,7 @@ describe('calculateCCT', () => {
|
|
|
67
66
|
});
|
|
68
67
|
it('should return minimum CCT and intensity at night edge', () => {
|
|
69
68
|
const atNight = new Date(night.getTime());
|
|
70
|
-
const result =
|
|
69
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, atNight, {
|
|
71
70
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
72
71
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
73
72
|
cctMinK: MIN_CCT,
|
|
@@ -78,8 +77,8 @@ describe('calculateCCT', () => {
|
|
|
78
77
|
expect(result.intensity).toBe(MIN_INTENSITY_API);
|
|
79
78
|
});
|
|
80
79
|
it('should return minimum CCT and intensity after night', () => {
|
|
81
|
-
const afterNight = new Date(night.getTime() +
|
|
82
|
-
const result =
|
|
80
|
+
const afterNight = new Date(night.getTime() + 60_000); // 1 minute after
|
|
81
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, afterNight, {
|
|
83
82
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
84
83
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
85
84
|
cctMinK: MIN_CCT,
|
|
@@ -90,7 +89,7 @@ describe('calculateCCT', () => {
|
|
|
90
89
|
});
|
|
91
90
|
it('should have smooth progression from nightEnd to noon', () => {
|
|
92
91
|
const quarterWay = new Date(nightEnd.getTime() + (solarNoon.getTime() - nightEnd.getTime()) / 4);
|
|
93
|
-
const result =
|
|
92
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, quarterWay, {
|
|
94
93
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
95
94
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
96
95
|
cctMinK: MIN_CCT,
|
|
@@ -104,7 +103,7 @@ describe('calculateCCT', () => {
|
|
|
104
103
|
});
|
|
105
104
|
it('should have smooth progression from noon to sunset', () => {
|
|
106
105
|
const threeQuartersWay = new Date(solarNoon.getTime() + (sunset.getTime() - solarNoon.getTime()) / 2);
|
|
107
|
-
const result =
|
|
106
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, threeQuartersWay, {
|
|
108
107
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
109
108
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
110
109
|
cctMinK: MIN_CCT,
|
|
@@ -120,7 +119,7 @@ describe('calculateCCT', () => {
|
|
|
120
119
|
describe('Edge cases', () => {
|
|
121
120
|
it('should handle midnight times', () => {
|
|
122
121
|
const midnight = new Date('2024-06-21T04:00:00Z'); // Midnight in NYC
|
|
123
|
-
const result =
|
|
122
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, midnight);
|
|
124
123
|
expect(result.cct).toBe(MIN_CCT);
|
|
125
124
|
expect(result.intensity).toBe(MIN_INTENSITY_API);
|
|
126
125
|
});
|
|
@@ -128,21 +127,21 @@ describe('calculateCCT', () => {
|
|
|
128
127
|
const LONDON_LAT = 51.5074;
|
|
129
128
|
const LONDON_LON = -0.1278;
|
|
130
129
|
const testDate = new Date('2024-06-21T12:00:00Z');
|
|
131
|
-
const result =
|
|
130
|
+
const result = calculateCCT(LONDON_LAT, LONDON_LON, testDate);
|
|
132
131
|
expect(result.cct).toBeGreaterThanOrEqual(MIN_CCT);
|
|
133
132
|
expect(result.cct).toBeLessThanOrEqual(MAX_CCT);
|
|
134
133
|
expect(result.intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
135
134
|
expect(result.intensity).toBeLessThanOrEqual(MAX_INTENSITY_API);
|
|
136
135
|
});
|
|
137
136
|
it('should use default options when none provided', () => {
|
|
138
|
-
const result =
|
|
137
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, new Date('2024-06-21T12:00:00Z'));
|
|
139
138
|
expect(result.cct).toBeGreaterThanOrEqual(MIN_CCT);
|
|
140
139
|
expect(result.cct).toBeLessThanOrEqual(MAX_CCT);
|
|
141
140
|
expect(result.intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
142
141
|
expect(result.intensity).toBeLessThanOrEqual(MAX_INTENSITY_API);
|
|
143
142
|
});
|
|
144
143
|
it('should use default date if not provided', () => {
|
|
145
|
-
const result =
|
|
144
|
+
const result = calculateCCT(NYC_LAT, NYC_LON);
|
|
146
145
|
expect(result.cct).toBeGreaterThanOrEqual(MIN_CCT);
|
|
147
146
|
expect(result.cct).toBeLessThanOrEqual(MAX_CCT);
|
|
148
147
|
expect(result.intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
@@ -152,13 +151,13 @@ describe('calculateCCT', () => {
|
|
|
152
151
|
describe('Return value format', () => {
|
|
153
152
|
it('should return rounded integer values', () => {
|
|
154
153
|
const testDate = new Date('2024-06-21T12:00:00Z');
|
|
155
|
-
const result =
|
|
154
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, testDate);
|
|
156
155
|
expect(Number.isInteger(result.cct)).toBe(true);
|
|
157
156
|
expect(Number.isInteger(result.intensity)).toBe(true);
|
|
158
157
|
});
|
|
159
158
|
it('should have correct properties', () => {
|
|
160
159
|
const testDate = new Date('2024-06-21T12:00:00Z');
|
|
161
|
-
const result =
|
|
160
|
+
const result = calculateCCT(NYC_LAT, NYC_LON, testDate);
|
|
162
161
|
expect(result).toHaveProperty('cct');
|
|
163
162
|
expect(result).toHaveProperty('intensity');
|
|
164
163
|
expect(typeof result.cct).toBe('number');
|
|
@@ -172,7 +171,7 @@ describe('calculateCCT', () => {
|
|
|
172
171
|
const base = new Date('2024-06-21T00:00:00Z'); // summer solstice
|
|
173
172
|
for (let hour = 0; hour < 24; hour++) {
|
|
174
173
|
const sample = new Date(base.getTime() + hour * 60 * 60 * 1000);
|
|
175
|
-
const { intensity } =
|
|
174
|
+
const { intensity } = calculateCCT(NYC_LAT, NYC_LON, sample);
|
|
176
175
|
expect(intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
177
176
|
expect(intensity).toBeLessThanOrEqual(MAX_INTENSITY_API);
|
|
178
177
|
}
|
|
@@ -196,7 +195,7 @@ describe('calculateCCT', () => {
|
|
|
196
195
|
for (const { lat, lon } of locations) {
|
|
197
196
|
for (const h of offsetsHours) {
|
|
198
197
|
const d = new Date(base.getTime() + h * 60 * 60 * 1000);
|
|
199
|
-
const { intensity } =
|
|
198
|
+
const { intensity } = calculateCCT(lat, lon, d);
|
|
200
199
|
expect(intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
201
200
|
expect(intensity).toBeLessThanOrEqual(MAX_INTENSITY_API);
|
|
202
201
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cctUtil.test.js","sourceRoot":"","sources":["../../src/__tests__/cctUtil.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cctUtil.test.js","sourceRoot":"","sources":["../../src/__tests__/cctUtil.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const node_child_process_1 = require("node:child_process");
|
|
7
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
import path, { dirname } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = dirname(__filename);
|
|
8
6
|
describe('CLI Smoke Test', () => {
|
|
9
7
|
const runTest = process.platform === 'darwin' ? it : it.skip;
|
|
10
|
-
runTest('should run cli help without error - macOS only', (
|
|
11
|
-
const cliPath =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
runTest('should run cli help without error - macOS only', async () => {
|
|
9
|
+
const cliPath = path.resolve(__dirname, '../../dist/cli.js');
|
|
10
|
+
// We use a promise wrapper for exec to use async/await
|
|
11
|
+
// biome-ignore lint/suspicious/noExplicitAny: opts type matches exec options
|
|
12
|
+
const execPromise = (cmd, opts) => new Promise((resolve, reject) => {
|
|
13
|
+
exec(cmd, opts, (error, stdout, stderr) => {
|
|
14
|
+
if (error)
|
|
15
|
+
reject(error);
|
|
16
|
+
else
|
|
17
|
+
resolve({ stdout: stdout.toString(), stderr: stderr.toString() });
|
|
18
|
+
});
|
|
16
19
|
});
|
|
20
|
+
const { stdout } = await execPromise(`node ${cliPath} --help`, { timeout: 10000 });
|
|
21
|
+
expect(stdout).toMatch(/Usage|Help|Options/i);
|
|
17
22
|
}, 15000);
|
|
18
23
|
});
|
|
19
24
|
//# sourceMappingURL=cli.smoke.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.smoke.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.smoke.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;IAE7D,OAAO,CACL,gDAAgD,EAChD,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAC7D,uDAAuD;QACvD,6EAA6E;QAC7E,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,IAAS,EAAE,EAAE,CAC7C,IAAI,OAAO,CAAqC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACxC,IAAI,KAAK;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;oBACpB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACzE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEL,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,OAAO,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAChD,CAAC,EACD,KAAK,CACN,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const commander_1 = require("commander");
|
|
7
|
-
const commands_1 = __importDefault(require("../commands"));
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import registerCommands from '../commands.js';
|
|
8
3
|
describe('CLI intensity API usage (0-100 -> 0-1000)', () => {
|
|
9
4
|
function buildProgram(capture) {
|
|
10
|
-
const program = new
|
|
5
|
+
const program = new Command();
|
|
11
6
|
program.exitOverride();
|
|
12
7
|
const mockController = {
|
|
13
8
|
setIntensityForAllLights: async (intensity, cb) => {
|
|
@@ -64,7 +59,7 @@ describe('CLI intensity API usage (0-100 -> 0-1000)', () => {
|
|
|
64
59
|
saveWsUrl: undefined,
|
|
65
60
|
loadConfig: undefined,
|
|
66
61
|
};
|
|
67
|
-
(
|
|
62
|
+
registerCommands(program, deps);
|
|
68
63
|
return program;
|
|
69
64
|
}
|
|
70
65
|
test('intensity command maps percent to 0-1000 for all devices', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intensityApi.test.js","sourceRoot":"","sources":["../../src/__tests__/intensityApi.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"intensityApi.test.js","sourceRoot":"","sources":["../../src/__tests__/intensityApi.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,gBAAgB,MAAM,gBAAgB,CAAC;AAuC9C,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,SAAS,YAAY,CAAC,OAAoB;QACxC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,YAAY,EAAE,CAAC;QAEvB,MAAM,cAAc,GAAmB;YACrC,wBAAwB,EAAE,KAAK,EAAE,SAAiB,EAAE,EAAgD,EAAE,EAAE;gBACtG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;gBACpC,IAAI,EAAE,EAAE,CAAC;oBACP,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,YAAY,EAAE,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAgD,EAAE,EAAE;gBACpG,OAAO,CAAC,YAAY,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBAC7C,IAAI,EAAE,EAAE,CAAC;oBACP,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,8BAA8B,EAAE,KAAK,EACnC,GAAW,EACX,SAAkB,EAClB,EAAgD,EAChD,EAAE;gBACF,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;gBACvC,IAAI,EAAE,EAAE,CAAC;oBACP,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,kBAAkB,EAAE,KAAK,EACvB,CAAS,EACT,CAAS,EACT,CAAS,EACT,EAAW,EACX,EAAW,EACX,EAAgD,EAChD,EAAE;gBACF,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChC,IAAI,EAAE,EAAE,CAAC;oBACP,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,oBAAoB,EAAE,KAAK,EACzB,KAAa,EACb,SAAkB,EAClB,EAAgD,EAChD,EAAE;gBACF,OAAO,CAAC,WAAW,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBAC3C,IAAI,EAAE,EAAE,CAAC;oBACP,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,UAAU,EAAE,KAAK,IAAI,EAAE;gBACrB,kBAAkB;YACpB,CAAC;YACD,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;YACnE,eAAe,EAAE,KAAK,IAAI,EAAE;gBAC1B,kBAAkB;YACpB,CAAC;YACD,gBAAgB,EAAE,KAAK,IAAI,EAAE;gBAC3B,kBAAkB;YACpB,CAAC;YACD,eAAe,EAAE,KAAK,IAAI,EAAE;gBAC1B,kBAAkB;YACpB,CAAC;SACF,CAAC;QAEF,MAAM,IAAI,GAAG;YACX,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,cAA4C;YAC1E,UAAU,EAAE,CAAC,WAAoB,EAAE,MAAc,EAAiB,EAAE,CAAC,CAAC;gBACpE,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,YAAY;aAC1B,CAAC;YACF,YAAY,EACV,CAAsB,EAAiC,EAAE,EAAE,CAC3D,CAAC,GAAG,IAAO,EAAE,EAAE,CACb,EAAE,CAAC,GAAG,IAAI,CAAC;YACf,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,SAAS;SACtB,CAAC;QAEF,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,78 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const ws_1 = require("ws");
|
|
7
|
-
const lightControl_1 = __importDefault(require("../lightControl"));
|
|
1
|
+
import LightController from '../lightControl.js';
|
|
2
|
+
import { MockLightServer } from '../test/MockLightServer.js';
|
|
8
3
|
const TEST_PORT = 8089;
|
|
9
4
|
const WS_URL = `ws://localhost:${TEST_PORT}`;
|
|
10
|
-
// Simple mock WebSocket server for LightController
|
|
11
|
-
class MockLightServer {
|
|
12
|
-
constructor(port) {
|
|
13
|
-
this.devices = [
|
|
14
|
-
{ node_id: '400J5-F2C008', device_name: 'Test Light 1' },
|
|
15
|
-
{ node_id: '400J5-F2C009', device_name: 'Test Light 2' },
|
|
16
|
-
];
|
|
17
|
-
this.wss = new ws_1.Server({ port });
|
|
18
|
-
this.wss.on('connection', (ws) => {
|
|
19
|
-
ws.on('message', (message) => {
|
|
20
|
-
const cmd = JSON.parse(message.toString());
|
|
21
|
-
const response = {
|
|
22
|
-
code: 0,
|
|
23
|
-
message: 'OK',
|
|
24
|
-
request: { type: cmd.type },
|
|
25
|
-
};
|
|
26
|
-
switch (cmd.type) {
|
|
27
|
-
case 'get_device_list':
|
|
28
|
-
response.data = { data: this.devices };
|
|
29
|
-
break;
|
|
30
|
-
case 'get_scene_list':
|
|
31
|
-
response.data = { data: [] };
|
|
32
|
-
break;
|
|
33
|
-
case 'get_node_config':
|
|
34
|
-
response.data = { node_id: cmd.node_id, data: { config: 'mock' } };
|
|
35
|
-
break;
|
|
36
|
-
default:
|
|
37
|
-
response.data = {};
|
|
38
|
-
}
|
|
39
|
-
ws.send(JSON.stringify(response));
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
close(callback) {
|
|
44
|
-
this.wss.clients.forEach((client) => {
|
|
45
|
-
client.terminate();
|
|
46
|
-
});
|
|
47
|
-
this.wss.close(callback);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
5
|
describe('LightController', () => {
|
|
51
6
|
let server;
|
|
52
7
|
let controller;
|
|
53
|
-
beforeAll((
|
|
8
|
+
beforeAll(async () => {
|
|
54
9
|
server = new MockLightServer(TEST_PORT);
|
|
55
|
-
setTimeout(
|
|
10
|
+
await new Promise((resolve) => setTimeout(resolve, 500)); // Give server time to start
|
|
56
11
|
});
|
|
57
|
-
afterAll((
|
|
58
|
-
server
|
|
59
|
-
|
|
12
|
+
afterAll(async () => {
|
|
13
|
+
// We need to ensure the server is closed properly
|
|
14
|
+
await new Promise((resolve) => {
|
|
15
|
+
server.close((err) => {
|
|
16
|
+
if (err)
|
|
17
|
+
console.error('Error closing server:', err);
|
|
18
|
+
resolve();
|
|
19
|
+
});
|
|
60
20
|
});
|
|
21
|
+
// Add a small buffer to ensure the port is released
|
|
22
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
61
23
|
});
|
|
62
24
|
afterEach(async () => {
|
|
63
25
|
if (controller) {
|
|
64
26
|
await controller.disconnect();
|
|
65
27
|
controller = undefined; // Clear reference
|
|
66
28
|
}
|
|
29
|
+
server.resetState();
|
|
67
30
|
});
|
|
68
|
-
it('should initialize and fetch devices', (
|
|
69
|
-
controller = new
|
|
31
|
+
it('should initialize and fetch devices', async () => {
|
|
32
|
+
controller = new LightController(WS_URL, 'test_client', () => {
|
|
70
33
|
expect(controller?.getDevices().length).toBe(2);
|
|
71
|
-
done();
|
|
72
34
|
}, false);
|
|
73
|
-
|
|
35
|
+
// Wait for connection/init
|
|
36
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
37
|
+
expect(controller?.getDevices().length).toBe(2);
|
|
38
|
+
}, 5000);
|
|
74
39
|
it('should turn on all lights', async () => {
|
|
75
|
-
controller = new
|
|
40
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
76
41
|
await new Promise((res) => setTimeout(res, 200));
|
|
77
42
|
await new Promise((resolve) => {
|
|
78
43
|
controller?.turnOnAllLights((success, msg) => {
|
|
@@ -81,9 +46,12 @@ describe('LightController', () => {
|
|
|
81
46
|
resolve();
|
|
82
47
|
});
|
|
83
48
|
});
|
|
49
|
+
// Check state on server
|
|
50
|
+
const state = server.getDeviceState('400J5-F2C008');
|
|
51
|
+
expect(state?.sleep).toBe(false);
|
|
84
52
|
}, 5000);
|
|
85
53
|
it('should turn off all lights', async () => {
|
|
86
|
-
controller = new
|
|
54
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
87
55
|
await new Promise((res) => setTimeout(res, 200));
|
|
88
56
|
await new Promise((resolve) => {
|
|
89
57
|
controller?.turnOffAllLights((success, msg) => {
|
|
@@ -92,10 +60,26 @@ describe('LightController', () => {
|
|
|
92
60
|
resolve();
|
|
93
61
|
});
|
|
94
62
|
});
|
|
63
|
+
// Check state on server
|
|
64
|
+
const state = server.getDeviceState('400J5-F2C008');
|
|
65
|
+
expect(state?.sleep).toBe(true);
|
|
95
66
|
}, 5000);
|
|
96
67
|
it('should toggle all lights', async () => {
|
|
97
|
-
controller = new
|
|
68
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
98
69
|
await new Promise((res) => setTimeout(res, 200));
|
|
70
|
+
// First ensure it's in a known state (e.g. sleep=false)
|
|
71
|
+
// Direct manipulation of server state would be better, but for now we rely on default being false
|
|
72
|
+
await new Promise((resolve) => {
|
|
73
|
+
controller?.toggleAllLights((success, msg) => {
|
|
74
|
+
expect(success).toBe(true);
|
|
75
|
+
expect(msg).toBe('OK');
|
|
76
|
+
resolve();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
// Default was false, toggle should make it true
|
|
80
|
+
const state = server.getDeviceState('400J5-F2C008');
|
|
81
|
+
expect(state?.sleep).toBe(true);
|
|
82
|
+
// Toggle again
|
|
99
83
|
await new Promise((resolve) => {
|
|
100
84
|
controller?.toggleAllLights((success, msg) => {
|
|
101
85
|
expect(success).toBe(true);
|
|
@@ -103,9 +87,11 @@ describe('LightController', () => {
|
|
|
103
87
|
resolve();
|
|
104
88
|
});
|
|
105
89
|
});
|
|
90
|
+
const state2 = server.getDeviceState('400J5-F2C008');
|
|
91
|
+
expect(state2?.sleep).toBe(false);
|
|
106
92
|
}, 5000);
|
|
107
93
|
it('should set intensity for all lights', async () => {
|
|
108
|
-
controller = new
|
|
94
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
109
95
|
await new Promise((res) => setTimeout(res, 200));
|
|
110
96
|
await new Promise((resolve) => {
|
|
111
97
|
controller?.setIntensityForAllLights(100, (success, msg) => {
|
|
@@ -114,20 +100,28 @@ describe('LightController', () => {
|
|
|
114
100
|
resolve();
|
|
115
101
|
});
|
|
116
102
|
});
|
|
103
|
+
const state = server.getDeviceState('400J5-F2C008');
|
|
104
|
+
expect(state?.intensity).toBe(100);
|
|
117
105
|
}, 5000);
|
|
118
106
|
it('should increment intensity for all lights', async () => {
|
|
119
|
-
controller = new
|
|
107
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
120
108
|
await new Promise((res) => setTimeout(res, 200));
|
|
109
|
+
// Initial set
|
|
110
|
+
await controller.setIntensityForAllLights(500);
|
|
111
|
+
await new Promise((res) => setTimeout(res, 100));
|
|
121
112
|
await new Promise((resolve) => {
|
|
122
|
-
controller?.incrementIntensityForAllLights(
|
|
113
|
+
controller?.incrementIntensityForAllLights(100, (success, msg) => {
|
|
123
114
|
expect(success).toBe(true);
|
|
124
115
|
expect(msg).toBe('OK');
|
|
125
116
|
resolve();
|
|
126
117
|
});
|
|
127
118
|
});
|
|
119
|
+
const state = server.getDeviceState('400J5-F2C008');
|
|
120
|
+
// 500 + 100 = 600
|
|
121
|
+
expect(state?.intensity).toBe(600);
|
|
128
122
|
}, 5000);
|
|
129
123
|
it('should set CCT for all lights', async () => {
|
|
130
|
-
controller = new
|
|
124
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
131
125
|
await new Promise((res) => setTimeout(res, 200));
|
|
132
126
|
await new Promise((resolve) => {
|
|
133
127
|
controller?.setCCTAndIntensityForAllLights(5600, 100, (success, msg) => {
|
|
@@ -136,20 +130,31 @@ describe('LightController', () => {
|
|
|
136
130
|
resolve();
|
|
137
131
|
});
|
|
138
132
|
});
|
|
133
|
+
const state = server.getDeviceState('400J5-F2C008');
|
|
134
|
+
expect(state?.cct).toBe(5600);
|
|
135
|
+
expect(state?.intensity).toBe(100);
|
|
136
|
+
expect(state?.work_mode).toBe('CCT');
|
|
139
137
|
}, 5000);
|
|
140
138
|
it('should increment CCT for all lights', async () => {
|
|
141
|
-
controller = new
|
|
139
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
142
140
|
await new Promise((res) => setTimeout(res, 200));
|
|
141
|
+
// Initial set
|
|
142
|
+
await controller.setCCTAndIntensityForAllLights(3200, 100);
|
|
143
|
+
await new Promise((res) => setTimeout(res, 100));
|
|
143
144
|
await new Promise((resolve) => {
|
|
144
|
-
controller?.incrementCCTForAllLights(100,
|
|
145
|
+
controller?.incrementCCTForAllLights(100, 200, (success, msg) => {
|
|
145
146
|
expect(success).toBe(true);
|
|
146
147
|
expect(msg).toBe('OK');
|
|
147
148
|
resolve();
|
|
148
149
|
});
|
|
149
150
|
});
|
|
151
|
+
const state = server.getDeviceState('400J5-F2C008');
|
|
152
|
+
// 3200 + 100 = 3300
|
|
153
|
+
expect(state?.cct).toBe(3300);
|
|
154
|
+
expect(state?.intensity).toBe(200);
|
|
150
155
|
}, 5000);
|
|
151
156
|
it('should set HSI for all lights', async () => {
|
|
152
|
-
controller = new
|
|
157
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
153
158
|
await new Promise((res) => setTimeout(res, 200));
|
|
154
159
|
await new Promise((resolve) => {
|
|
155
160
|
controller?.setHSIForAllLights(120, 80, 100, 5600, 0, (success, msg) => {
|
|
@@ -158,9 +163,14 @@ describe('LightController', () => {
|
|
|
158
163
|
resolve();
|
|
159
164
|
});
|
|
160
165
|
});
|
|
166
|
+
const state = server.getDeviceState('400J5-F2C008');
|
|
167
|
+
expect(state?.hue).toBe(120);
|
|
168
|
+
expect(state?.sat).toBe(80);
|
|
169
|
+
expect(state?.intensity).toBe(100);
|
|
170
|
+
expect(state?.work_mode).toBe('HSI');
|
|
161
171
|
}, 5000);
|
|
162
172
|
it('should set color for all lights', async () => {
|
|
163
|
-
controller = new
|
|
173
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
164
174
|
await new Promise((res) => setTimeout(res, 200));
|
|
165
175
|
await new Promise((resolve) => {
|
|
166
176
|
controller?.setColorForAllLights('red', 100, (success, msg) => {
|
|
@@ -169,9 +179,10 @@ describe('LightController', () => {
|
|
|
169
179
|
resolve();
|
|
170
180
|
});
|
|
171
181
|
});
|
|
182
|
+
// The mock server doesn't parse 'red' to HSI yet, so we just check OK response
|
|
172
183
|
}, 5000);
|
|
173
184
|
it('should set system effect for all lights', async () => {
|
|
174
|
-
controller = new
|
|
185
|
+
controller = new LightController(WS_URL, 'test_client', undefined, false);
|
|
175
186
|
await new Promise((res) => setTimeout(res, 200));
|
|
176
187
|
await new Promise((resolve) => {
|
|
177
188
|
controller?.setSystemEffectForAllLights('flash', 100, (success, msg) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightControl.test.js","sourceRoot":"","sources":["../../src/__tests__/lightControl.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lightControl.test.js","sourceRoot":"","sources":["../../src/__tests__/lightControl.test.ts"],"names":[],"mappings":"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"}
|