11import * as assert from "assert" ;
22import dns from "node:dns" ;
33import ws from "ws" ;
4+ import type { LogConfig } from "@zwave-js/core" ;
5+ import Transport from "winston-transport" ;
46import { libVersion } from "zwave-js" ;
57import { ZwavejsServer } from "../lib/server.js" ;
68import { createMockDriver } from "../mock/index.js" ;
@@ -11,6 +13,7 @@ const require = createRequire(import.meta.url);
1113dns . setDefaultResultOrder ( "ipv4first" ) ;
1214
1315const PORT = 45001 ;
16+ type LogTransport = LogConfig [ "transports" ] [ number ] ;
1417
1518const createNextMessage = ( socket : ws ) => {
1619 let waitingListener : ( ( msg : unknown ) => void ) | undefined ;
@@ -37,8 +40,50 @@ const createNextMessage = (socket: ws) => {
3740 } ;
3841} ;
3942
43+ const waitForResult = async (
44+ nextMessage : ReturnType < typeof createNextMessage > ,
45+ messageId : string ,
46+ ) => {
47+ for ( ; ; ) {
48+ const message = await Promise . race ( [
49+ nextMessage ( ) ,
50+ new Promise ( ( _ , reject ) =>
51+ setTimeout (
52+ ( ) =>
53+ reject (
54+ new Error (
55+ `Timed out while waiting for result message ${ messageId } ` ,
56+ ) ,
57+ ) ,
58+ 5000 ,
59+ ) ,
60+ ) ,
61+ ] ) ;
62+ if (
63+ typeof message === "object" &&
64+ message !== undefined &&
65+ message !== null &&
66+ "type" in message &&
67+ message . type === "result" &&
68+ "messageId" in message &&
69+ message . messageId === messageId
70+ ) {
71+ return message ;
72+ }
73+ }
74+ } ;
75+
76+ class MockTransport extends Transport {
77+ public log ( _info : unknown , next : ( ) => void ) : void {
78+ next ( ) ;
79+ }
80+ }
81+
4082const runTest = async ( ) => {
41- const server = new ZwavejsServer ( createMockDriver ( ) , { port : PORT } ) ;
83+ const driver = createMockDriver ( ) ;
84+ const customTransport = new MockTransport ( ) as LogTransport ;
85+ driver . updateLogConfig ( { transports : [ customTransport ] } ) ;
86+ const server = new ZwavejsServer ( driver , { port : PORT } ) ;
4287 await server . start ( true ) ;
4388 let socket : ws | undefined = undefined ;
4489
@@ -97,6 +142,80 @@ const runTest = async () => {
97142 } ,
98143 } ) ;
99144
145+ socket . send (
146+ JSON . stringify ( {
147+ messageId : "start-listening-logs" ,
148+ command : "driver.start_listening_logs" ,
149+ } ) ,
150+ ) ;
151+
152+ assert . deepEqual ( await nextMessage ( ) , {
153+ type : "result" ,
154+ success : true ,
155+ messageId : "start-listening-logs" ,
156+ result : { } ,
157+ } ) ;
158+
159+ assert . equal (
160+ driver . getLogConfig ( ) . transports ?. includes ( customTransport ) ,
161+ true ,
162+ ) ;
163+ assert . equal ( driver . getLogConfig ( ) . transports ?. length , 2 ) ;
164+
165+ socket . send (
166+ JSON . stringify ( {
167+ messageId : "update-log-config" ,
168+ command : "driver.update_log_config" ,
169+ config : {
170+ enabled : true ,
171+ level : "info" ,
172+ transports : [ ] ,
173+ } ,
174+ } ) ,
175+ ) ;
176+
177+ assert . deepEqual ( await nextMessage ( ) , {
178+ type : "event" ,
179+ event : {
180+ source : "driver" ,
181+ event : "log config updated" ,
182+ config : {
183+ enabled : true ,
184+ level : "info" ,
185+ } ,
186+ } ,
187+ } ) ;
188+
189+ assert . deepEqual ( await waitForResult ( nextMessage , "update-log-config" ) , {
190+ type : "result" ,
191+ success : true ,
192+ messageId : "update-log-config" ,
193+ result : { } ,
194+ } ) ;
195+
196+ assert . equal ( driver . getLogConfig ( ) . level , "info" ) ;
197+ assert . equal (
198+ driver . getLogConfig ( ) . transports ?. includes ( customTransport ) ,
199+ true ,
200+ ) ;
201+ assert . equal ( driver . getLogConfig ( ) . transports ?. length , 2 ) ;
202+
203+ socket . send (
204+ JSON . stringify ( {
205+ messageId : "stop-listening-logs" ,
206+ command : "driver.stop_listening_logs" ,
207+ } ) ,
208+ ) ;
209+
210+ assert . deepEqual ( await nextMessage ( ) , {
211+ type : "result" ,
212+ success : true ,
213+ messageId : "stop-listening-logs" ,
214+ result : { } ,
215+ } ) ;
216+
217+ assert . deepEqual ( driver . getLogConfig ( ) . transports , [ customTransport ] ) ;
218+
100219 console . log ( "Integration tests passed :)" ) ;
101220 } finally {
102221 if ( socket ) {
0 commit comments