@@ -343,3 +343,96 @@ describe('parseDurationToDate', () => {
343343 } ) ;
344344 } ) ;
345345} ) ;
346+
347+ describe ( 'getPort' , ( ) => {
348+ const createServer = ( ) =>
349+ http . createServer ( ( _request , response ) => {
350+ response . end ( ) ;
351+ } ) ;
352+
353+ const startServer = async ( port : number , host = '127.0.0.1' ) => {
354+ const server = createServer ( ) . listen ( port , host ) ;
355+ await new Promise < void > ( ( resolve ) => {
356+ server . on ( 'listening' , resolve ) ;
357+ } ) ;
358+ return server ;
359+ } ;
360+
361+ it ( 'should return undefined when process is not listening on any port' , ( ) => {
362+ // This test assumes the test process itself isn't listening on any port
363+ const port = getPort ( ) ;
364+ expect ( port ) . toBeUndefined ( ) ;
365+ } ) ;
366+
367+ it ( 'should detect port when server is listening' , async ( ) => {
368+ // Use a high port number to avoid conflicts
369+ const testPort = 50000 + Math . floor ( Math . random ( ) * 10000 ) ;
370+ const server = await startServer ( testPort ) ;
371+
372+ // Give the OS a moment to register the port
373+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
374+
375+ const detectedPort = getPort ( ) ;
376+ expect ( detectedPort ) . toBe ( testPort ) ;
377+
378+ server . close ( ) ;
379+ } ) ;
380+
381+ it ( 'should return smallest port when listening on multiple ports' , async ( ) => {
382+ const port1 = 50000 + Math . floor ( Math . random ( ) * 5000 ) ;
383+ const port2 = port1 + 100 ;
384+ const port3 = port1 + 200 ;
385+
386+ const server1 = await startServer ( port1 ) ;
387+ const server2 = await startServer ( port2 ) ;
388+ const server3 = await startServer ( port3 ) ;
389+
390+ // Give the OS a moment to register the ports
391+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
392+
393+ const detectedPort = getPort ( ) ;
394+ expect ( detectedPort ) . toBe ( port1 ) ; // Should return the smallest
395+
396+ server1 . close ( ) ;
397+ server2 . close ( ) ;
398+ server3 . close ( ) ;
399+ } ) ;
400+
401+ it ( 'should work with IPv6 localhost' , async ( ) => {
402+ const testPort = 50000 + Math . floor ( Math . random ( ) * 10000 ) ;
403+ let server : http . Server | undefined ;
404+
405+ try {
406+ server = await startServer ( testPort , '::1' ) ;
407+
408+ // Give the OS a moment to register the port
409+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
410+
411+ const detectedPort = getPort ( ) ;
412+ expect ( detectedPort ) . toBe ( testPort ) ;
413+ } catch {
414+ // IPv6 might not be available on all systems, skip the test
415+ if ( server ) server . close ( ) ;
416+ return ;
417+ }
418+
419+ if ( server ) server . close ( ) ;
420+ } ) ;
421+
422+ it ( 'should handle 0.0.0.0 binding' , async ( ) => {
423+ const testPort = 50000 + Math . floor ( Math . random ( ) * 10000 ) ;
424+ const server = createServer ( ) . listen ( testPort , '0.0.0.0' ) ;
425+
426+ await new Promise < void > ( ( resolve ) => {
427+ server . on ( 'listening' , resolve ) ;
428+ } ) ;
429+
430+ // Give the OS a moment to register the port
431+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
432+
433+ const detectedPort = getPort ( ) ;
434+ expect ( detectedPort ) . toBe ( testPort ) ;
435+
436+ server . close ( ) ;
437+ } ) ;
438+ } ) ;
0 commit comments