@matterbridge/vitest-utils 3.9.1-dev-20260614-89d7aeb → 3.9.1-dev-20260617-b1e1b99
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/README.md +5 -3
- package/dist/matterRequest.d.ts +1 -1
- package/dist/vitestMatterTest.d.ts +4 -8
- package/dist/vitestMatterTest.js +21 -29
- package/dist/vitestSetupTest.d.ts +1 -1
- package/dist/vitestSetupTest.js +18 -14
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -6,10 +6,12 @@
|
|
|
6
6
|
[](https://hub.docker.com/r/luligu/matterbridge)
|
|
7
7
|

|
|
8
8
|

|
|
9
|
-
[](https://codecov.io/gh/Luligu/matterbridge)
|
|
10
|
+
[](https://vitest.dev)
|
|
11
|
+
[](https://oxc.rs/docs/guide/usage/formatter.html)
|
|
12
|
+
[](https://oxc.rs/docs/guide/usage/linter.html)
|
|
12
13
|
[](https://www.typescriptlang.org/)
|
|
14
|
+
[](https://github.com/microsoft/typescript-go)
|
|
13
15
|
[](https://nodejs.org/)
|
|
14
16
|
[](https://matterbridge.io)
|
|
15
17
|
|
package/dist/matterRequest.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ColorControl } from '@matter/types/clusters/color-control';
|
|
2
|
-
import {
|
|
2
|
+
import type { LevelControl } from '@matter/types/clusters/level-control';
|
|
3
3
|
export declare function getMoveToLevelRequest(level: number, transitionTime: number, executeIfOff: boolean): LevelControl.MoveToLevelRequest;
|
|
4
4
|
export declare function getMoveToColorTemperatureRequest(colorTemperatureMireds: number, transitionTime: number, executeIfOff: boolean): ColorControl.MoveToColorTemperatureRequest;
|
|
5
5
|
export declare function getMoveToHueRequest(hue: number, transitionTime: number, executeIfOff: boolean): ColorControl.MoveToHueRequest;
|
|
@@ -10,14 +10,10 @@ export declare let aggregator: Endpoint<AggregatorEndpoint>;
|
|
|
10
10
|
export declare function createTestEnvironment(): Promise<Environment>;
|
|
11
11
|
export declare function destroyTestEnvironment(): Promise<void>;
|
|
12
12
|
export declare function getMatterbridge(): PlatformMatterbridge;
|
|
13
|
-
export declare const addBridgedEndpoint:
|
|
14
|
-
export declare const removeBridgedEndpoint:
|
|
15
|
-
export declare const removeAllBridgedEndpoints:
|
|
16
|
-
export declare const addVirtualEndpoint:
|
|
17
|
-
export declare const addBridgedEndpointMatterbridgeSpy: import("vitest").Mock<(pluginName: string, device: Endpoint) => Promise<boolean>>;
|
|
18
|
-
export declare const removeBridgedEndpointMatterbridgeSpy: import("vitest").Mock<(pluginName: string, device: Endpoint) => Promise<boolean>>;
|
|
19
|
-
export declare const removeAllBridgedEndpointsMatterbridgeSpy: import("vitest").Mock<(pluginName: string, _delay?: number) => Promise<boolean>>;
|
|
20
|
-
export declare const addVirtualEndpointMatterbridgeSpy: import("vitest").Mock<(pluginName: string, name: string, type: 'light' | 'outlet' | 'switch' | 'mounted_switch', callback: () => Promise<void>) => Promise<boolean>>;
|
|
13
|
+
export declare const addBridgedEndpoint: (pluginName: string, device: Endpoint) => Promise<boolean>;
|
|
14
|
+
export declare const removeBridgedEndpoint: (pluginName: string, device: Endpoint) => Promise<boolean>;
|
|
15
|
+
export declare const removeAllBridgedEndpoints: (_pluginName: string, _delay?: number) => Promise<boolean>;
|
|
16
|
+
export declare const addVirtualEndpoint: (pluginName: string, name: string, type: "light" | "outlet" | "switch" | "mounted_switch", callback: () => Promise<void>) => Promise<boolean>;
|
|
21
17
|
export declare function addMatterbridge(platform: object): void;
|
|
22
18
|
export declare function flushAllEndpointNumberPersistence(targetServer: ServerNode, rounds?: number, ticks?: number, microTurns?: number, pause?: number): Promise<void>;
|
|
23
19
|
export declare function assertAllEndpointNumbersPersisted(targetServer: ServerNode): Promise<number>;
|
package/dist/vitestMatterTest.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import '@matter/nodejs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { inspect } from 'node:util';
|
|
4
3
|
import { Environment, Lifecycle, LogFormat as MatterLogFormat, LogLevel as MatterLogLevel } from '@matter/general';
|
|
5
4
|
import { Endpoint, ServerNode, ServerNodeStore } from '@matter/node';
|
|
6
5
|
import { BridgedDeviceBasicInformationServer } from '@matter/node/behaviors/bridged-device-basic-information';
|
|
@@ -10,12 +9,14 @@ import { MountedOnOffControlDevice } from '@matter/node/devices/mounted-on-off-c
|
|
|
10
9
|
import { AggregatorEndpoint } from '@matter/node/endpoints';
|
|
11
10
|
import { DeviceTypeId, VendorId } from '@matter/types/datatype';
|
|
12
11
|
import { MATTER_STORAGE_DIR } from '@matterbridge/types';
|
|
12
|
+
import { inspectError } from '@matterbridge/utils/error';
|
|
13
13
|
import { er, rs } from 'node-ansi-logger';
|
|
14
14
|
import { flushAsync } from './flushAsync.js';
|
|
15
|
-
import { HOMEDIR, NAME } from './vitestSetupTest.js';
|
|
15
|
+
import { HOMEDIR, log, NAME } from './vitestSetupTest.js';
|
|
16
16
|
export let environment;
|
|
17
17
|
export let server;
|
|
18
18
|
export let aggregator;
|
|
19
|
+
const noop = () => undefined;
|
|
19
20
|
export async function createTestEnvironment() {
|
|
20
21
|
expect(NAME).toBeDefined();
|
|
21
22
|
expect(typeof NAME).toBe('string');
|
|
@@ -75,7 +76,7 @@ export function getMatterbridge() {
|
|
|
75
76
|
};
|
|
76
77
|
return matterbridge;
|
|
77
78
|
}
|
|
78
|
-
export const addBridgedEndpoint =
|
|
79
|
+
export const addBridgedEndpoint = async (pluginName, device) => {
|
|
79
80
|
try {
|
|
80
81
|
await aggregator.add(device);
|
|
81
82
|
return Promise.resolve(true);
|
|
@@ -83,8 +84,8 @@ export const addBridgedEndpoint = vi.fn(async (pluginName, device) => {
|
|
|
83
84
|
catch (error) {
|
|
84
85
|
return Promise.reject(error);
|
|
85
86
|
}
|
|
86
|
-
}
|
|
87
|
-
export const removeBridgedEndpoint =
|
|
87
|
+
};
|
|
88
|
+
export const removeBridgedEndpoint = async (pluginName, device) => {
|
|
88
89
|
try {
|
|
89
90
|
await device.delete();
|
|
90
91
|
return Promise.resolve(true);
|
|
@@ -92,8 +93,8 @@ export const removeBridgedEndpoint = vi.fn(async (pluginName, device) => {
|
|
|
92
93
|
catch (error) {
|
|
93
94
|
return Promise.reject(error);
|
|
94
95
|
}
|
|
95
|
-
}
|
|
96
|
-
export const removeAllBridgedEndpoints =
|
|
96
|
+
};
|
|
97
|
+
export const removeAllBridgedEndpoints = async (_pluginName, _delay = 0) => {
|
|
97
98
|
try {
|
|
98
99
|
for (const device of aggregator.parts) {
|
|
99
100
|
await device.delete();
|
|
@@ -103,8 +104,8 @@ export const removeAllBridgedEndpoints = vi.fn(async (pluginName, _delay = 0) =>
|
|
|
103
104
|
catch (error) {
|
|
104
105
|
return Promise.reject(error);
|
|
105
106
|
}
|
|
106
|
-
}
|
|
107
|
-
export const addVirtualEndpoint =
|
|
107
|
+
};
|
|
108
|
+
export const addVirtualEndpoint = async (pluginName, name, type, callback) => {
|
|
108
109
|
try {
|
|
109
110
|
const device = new Endpoint(MountedOnOffControlDevice.with(BridgedDeviceBasicInformationServer), {
|
|
110
111
|
id: name.replaceAll(' ', '') + ':' + type,
|
|
@@ -120,8 +121,8 @@ export const addVirtualEndpoint = vi.fn(async (pluginName, name, type, callback)
|
|
|
120
121
|
});
|
|
121
122
|
device.events.onOff.onOff$Changed.on((value) => {
|
|
122
123
|
if (value) {
|
|
123
|
-
void callback().catch(
|
|
124
|
-
void device.setStateOf(OnOffServer, { onOff: false }).catch(
|
|
124
|
+
void callback().catch(noop);
|
|
125
|
+
void device.setStateOf(OnOffServer, { onOff: false }).catch(noop);
|
|
125
126
|
}
|
|
126
127
|
});
|
|
127
128
|
await aggregator.add(device);
|
|
@@ -135,11 +136,7 @@ export const addVirtualEndpoint = vi.fn(async (pluginName, name, type, callback)
|
|
|
135
136
|
catch (error) {
|
|
136
137
|
return Promise.reject(error);
|
|
137
138
|
}
|
|
138
|
-
}
|
|
139
|
-
export const addBridgedEndpointMatterbridgeSpy = addBridgedEndpoint;
|
|
140
|
-
export const removeBridgedEndpointMatterbridgeSpy = removeBridgedEndpoint;
|
|
141
|
-
export const removeAllBridgedEndpointsMatterbridgeSpy = removeAllBridgedEndpoints;
|
|
142
|
-
export const addVirtualEndpointMatterbridgeSpy = addVirtualEndpoint;
|
|
139
|
+
};
|
|
143
140
|
export function addMatterbridge(platform) {
|
|
144
141
|
expect(platform).toBeDefined();
|
|
145
142
|
platform.setMatterNode(addBridgedEndpoint, removeBridgedEndpoint, removeAllBridgedEndpoints, addVirtualEndpoint);
|
|
@@ -162,10 +159,8 @@ function collectAllEndpoints(root) {
|
|
|
162
159
|
const list = [];
|
|
163
160
|
const walk = (ep) => {
|
|
164
161
|
list.push(ep);
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
walk(child);
|
|
168
|
-
}
|
|
162
|
+
for (const child of ep.parts) {
|
|
163
|
+
walk(child);
|
|
169
164
|
}
|
|
170
165
|
};
|
|
171
166
|
walk(root);
|
|
@@ -187,9 +182,8 @@ export async function assertAllEndpointNumbersPersisted(targetServer) {
|
|
|
187
182
|
return all.length;
|
|
188
183
|
}
|
|
189
184
|
export async function closeServerNodeStores(targetServer) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
await targetServer?.env.get(ServerNodeStore)?.endpointStores.close();
|
|
185
|
+
const resolvedTargetServer = targetServer ?? server;
|
|
186
|
+
await resolvedTargetServer?.env.get(ServerNodeStore)?.endpointStores.close();
|
|
193
187
|
}
|
|
194
188
|
export async function createServerNode(port, deviceType = DeviceTypeId(0x000e), ticks = 1, microTurns = 1, pause = 10) {
|
|
195
189
|
const { randomBytes } = await import('node:crypto');
|
|
@@ -299,9 +293,8 @@ export async function addDevice(owner, device, rounds = 3, pause = 10) {
|
|
|
299
293
|
await owner.add(device);
|
|
300
294
|
}
|
|
301
295
|
catch (error) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
process.stderr.write(`${er}Error adding device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}${rs}\nStack: ${errorInspect}\n`);
|
|
296
|
+
inspectError(log, `Error adding device ${device.maybeId}.${device.maybeNumber}`, error);
|
|
297
|
+
process.stderr.write(`${er}Error adding device ${device.maybeId}.${device.maybeNumber}${rs}\n`);
|
|
305
298
|
return false;
|
|
306
299
|
}
|
|
307
300
|
await device.construction.ready;
|
|
@@ -327,9 +320,8 @@ export async function deleteDevice(owner, device, rounds = 3, pause = 10) {
|
|
|
327
320
|
await device.delete();
|
|
328
321
|
}
|
|
329
322
|
catch (error) {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
process.stderr.write(`${er}Error deleting device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}${rs}\nStack: ${errorInspect}\n`);
|
|
323
|
+
inspectError(log, `Error deleting device ${device.maybeId}.${device.maybeNumber}`, error);
|
|
324
|
+
process.stderr.write(`${er}Error deleting device ${device.maybeId}.${device.maybeNumber}${rs}\n`);
|
|
333
325
|
return false;
|
|
334
326
|
}
|
|
335
327
|
expect(owner.parts.has(device)).toBeFalsy();
|
|
@@ -17,5 +17,5 @@ export declare let consoleErrorSpy: MockInstance<typeof console.error>;
|
|
|
17
17
|
export declare let NAME: string;
|
|
18
18
|
export declare let HOMEDIR: string;
|
|
19
19
|
export declare let log: AnsiLogger;
|
|
20
|
-
export declare function setupTest(name: string, debug?: boolean): Promise<void>;
|
|
20
|
+
export declare function setupTest(name: string, debug?: boolean, argv?: string[], env?: Record<string, string>): Promise<void>;
|
|
21
21
|
export declare function setDebug(debug: boolean): Promise<void>;
|
package/dist/vitestSetupTest.js
CHANGED
|
@@ -18,13 +18,17 @@ export let consoleErrorSpy;
|
|
|
18
18
|
export let NAME;
|
|
19
19
|
export let HOMEDIR;
|
|
20
20
|
export let log;
|
|
21
|
-
|
|
21
|
+
const noop = () => undefined;
|
|
22
|
+
export async function setupTest(name, debug = false, argv = [], env = {}) {
|
|
22
23
|
expect(name).toBeDefined();
|
|
23
24
|
expect(typeof name).toBe('string');
|
|
24
25
|
expect(name.length).toBeGreaterThanOrEqual(4);
|
|
25
26
|
NAME = name;
|
|
26
27
|
HOMEDIR = path.join('.cache', 'vitest', name);
|
|
27
|
-
process.argv = ['vitest', name];
|
|
28
|
+
process.argv = ['vitest', name, ...argv];
|
|
29
|
+
for (const [key, value] of Object.entries(env)) {
|
|
30
|
+
process.env[key] = value;
|
|
31
|
+
}
|
|
28
32
|
log = new AnsiLogger({ logName: 'Vitest', logTimestampFormat: 4, logLevel: "info" });
|
|
29
33
|
rmSync(HOMEDIR, { recursive: true, force: true });
|
|
30
34
|
mkdirSync(HOMEDIR, { recursive: true });
|
|
@@ -44,12 +48,12 @@ export async function setupTest(name, debug = false) {
|
|
|
44
48
|
consoleErrorSpy = vi.spyOn(console, 'error');
|
|
45
49
|
}
|
|
46
50
|
else {
|
|
47
|
-
loggerLogSpy = vi.spyOn(AnsiLogger.prototype, 'log').mockImplementation(
|
|
48
|
-
consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(
|
|
49
|
-
consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(
|
|
50
|
-
consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(
|
|
51
|
-
consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(
|
|
52
|
-
consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(
|
|
51
|
+
loggerLogSpy = vi.spyOn(AnsiLogger.prototype, 'log').mockImplementation(noop);
|
|
52
|
+
consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(noop);
|
|
53
|
+
consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(noop);
|
|
54
|
+
consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(noop);
|
|
55
|
+
consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(noop);
|
|
56
|
+
consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(noop);
|
|
53
57
|
}
|
|
54
58
|
}
|
|
55
59
|
export async function setDebug(debug) {
|
|
@@ -69,11 +73,11 @@ export async function setDebug(debug) {
|
|
|
69
73
|
consoleErrorSpy = vi.spyOn(console, 'error');
|
|
70
74
|
}
|
|
71
75
|
else {
|
|
72
|
-
loggerLogSpy = vi.spyOn(AnsiLogger.prototype, 'log').mockImplementation(
|
|
73
|
-
consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(
|
|
74
|
-
consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(
|
|
75
|
-
consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(
|
|
76
|
-
consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(
|
|
77
|
-
consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(
|
|
76
|
+
loggerLogSpy = vi.spyOn(AnsiLogger.prototype, 'log').mockImplementation(noop);
|
|
77
|
+
consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(noop);
|
|
78
|
+
consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(noop);
|
|
79
|
+
consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(noop);
|
|
80
|
+
consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(noop);
|
|
81
|
+
consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(noop);
|
|
78
82
|
}
|
|
79
83
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matterbridge/vitest-utils",
|
|
3
|
-
"version": "3.9.1-dev-
|
|
3
|
+
"version": "3.9.1-dev-20260617-b1e1b99",
|
|
4
4
|
"description": "Matterbridge vitest utility library",
|
|
5
5
|
"author": "https://github.com/Luligu",
|
|
6
6
|
"homepage": "https://matterbridge.io/",
|
|
@@ -65,7 +65,9 @@
|
|
|
65
65
|
"CHANGELOG.md"
|
|
66
66
|
],
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@
|
|
68
|
+
"@matter/main": "0.17.3",
|
|
69
|
+
"@matterbridge/types": "3.9.1-dev-20260617-b1e1b99",
|
|
70
|
+
"@matterbridge/utils": "3.9.1-dev-20260617-b1e1b99",
|
|
69
71
|
"node-ansi-logger": "3.3.0-dev-20260607-585945a"
|
|
70
72
|
}
|
|
71
73
|
}
|