1
- import { describe , it , expect , vi } from 'vitest'
2
- import { parseCommandLineArgs , shouldIncludeTool , mcpProxy } from './utils'
3
- import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'
4
1
import { describe , it , expect , vi , beforeEach , afterEach } from 'vitest'
5
- import { parseCommandLineArgs , setupOAuthCallbackServerWithLongPoll } from './utils'
2
+ import { parseCommandLineArgs , shouldIncludeTool , mcpProxy , setupOAuthCallbackServerWithLongPoll } from './utils'
3
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'
6
4
import { EventEmitter } from 'events'
7
5
import express from 'express'
8
6
@@ -326,6 +324,100 @@ describe('Feature: Command Line Arguments Parsing', () => {
326
324
expect ( result . transportStrategy ) . toBe ( 'sse-only' )
327
325
expect ( result . ignoredTools ) . toEqual ( [ 'tool1' , 'tool2' ] )
328
326
} )
327
+
328
+ it ( 'Scenario: Use default auth timeout when not specified' , async ( ) => {
329
+ // Given command line arguments without --auth-timeout flag
330
+ const args = [ 'https://example.com/sse' ]
331
+ const usage = 'test usage'
332
+
333
+ // When parsing the command line arguments
334
+ const result = await parseCommandLineArgs ( args , usage )
335
+
336
+ // Then the default auth timeout should be 30000ms
337
+ expect ( result . authTimeoutMs ) . toBe ( 30000 )
338
+ } )
339
+
340
+ it ( 'Scenario: Parse valid auth timeout in seconds and convert to milliseconds' , async ( ) => {
341
+ // Given command line arguments with valid --auth-timeout
342
+ const args = [ 'https://example.com/sse' , '--auth-timeout' , '60' ]
343
+ const usage = 'test usage'
344
+
345
+ // When parsing the command line arguments
346
+ const result = await parseCommandLineArgs ( args , usage )
347
+
348
+ // Then the timeout should be converted to milliseconds
349
+ expect ( result . authTimeoutMs ) . toBe ( 60000 )
350
+ } )
351
+
352
+ it ( 'Scenario: Use default timeout when invalid auth timeout value is provided' , async ( ) => {
353
+ // Given command line arguments with invalid --auth-timeout value
354
+ const consoleSpy = vi . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
355
+ const args = [ 'https://example.com/sse' , '--auth-timeout' , 'invalid' ]
356
+ const usage = 'test usage'
357
+
358
+ // When parsing the command line arguments
359
+ const result = await parseCommandLineArgs ( args , usage )
360
+
361
+ // Then the default timeout should be used and warning logged
362
+ expect ( result . authTimeoutMs ) . toBe ( 30000 )
363
+ expect ( consoleSpy ) . toHaveBeenCalledWith (
364
+ expect . stringContaining ( 'Warning: Ignoring invalid auth timeout value: invalid. Must be a positive number.' ) ,
365
+ )
366
+
367
+ consoleSpy . mockRestore ( )
368
+ } )
369
+
370
+ it ( 'Scenario: Use default timeout when negative auth timeout value is provided' , async ( ) => {
371
+ // Given command line arguments with negative --auth-timeout value
372
+ const consoleSpy = vi . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
373
+ const args = [ 'https://example.com/sse' , '--auth-timeout' , '-30' ]
374
+ const usage = 'test usage'
375
+
376
+ // When parsing the command line arguments
377
+ const result = await parseCommandLineArgs ( args , usage )
378
+
379
+ // Then the default timeout should be used and warning logged
380
+ expect ( result . authTimeoutMs ) . toBe ( 30000 )
381
+ expect ( consoleSpy ) . toHaveBeenCalledWith (
382
+ expect . stringContaining ( 'Warning: Ignoring invalid auth timeout value: -30. Must be a positive number.' ) ,
383
+ )
384
+
385
+ consoleSpy . mockRestore ( )
386
+ } )
387
+
388
+ it ( 'Scenario: Use default timeout when zero auth timeout value is provided' , async ( ) => {
389
+ // Given command line arguments with zero --auth-timeout value
390
+ const consoleSpy = vi . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
391
+ const args = [ 'https://example.com/sse' , '--auth-timeout' , '0' ]
392
+ const usage = 'test usage'
393
+
394
+ // When parsing the command line arguments
395
+ const result = await parseCommandLineArgs ( args , usage )
396
+
397
+ // Then the default timeout should be used and warning logged
398
+ expect ( result . authTimeoutMs ) . toBe ( 30000 )
399
+ expect ( consoleSpy ) . toHaveBeenCalledWith (
400
+ expect . stringContaining ( 'Warning: Ignoring invalid auth timeout value: 0. Must be a positive number.' ) ,
401
+ )
402
+
403
+ consoleSpy . mockRestore ( )
404
+ } )
405
+
406
+ it ( 'Scenario: Log when using custom auth timeout' , async ( ) => {
407
+ // Given command line arguments with custom --auth-timeout value
408
+ const consoleSpy = vi . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
409
+ const args = [ 'https://example.com/sse' , '--auth-timeout' , '45' ]
410
+ const usage = 'test usage'
411
+
412
+ // When parsing the command line arguments
413
+ const result = await parseCommandLineArgs ( args , usage )
414
+
415
+ // Then the custom timeout should be used and logged
416
+ expect ( result . authTimeoutMs ) . toBe ( 45000 )
417
+ expect ( consoleSpy ) . toHaveBeenCalledWith ( expect . stringContaining ( 'Using auth callback timeout: 45 seconds' ) )
418
+
419
+ consoleSpy . mockRestore ( )
420
+ } )
329
421
} )
330
422
331
423
describe ( 'Feature: Tool Filtering with Ignore Patterns' , ( ) => {
@@ -778,107 +870,6 @@ describe('Feature: MCP Proxy', () => {
778
870
} )
779
871
} )
780
872
781
- describe ( 'parseCommandLineArgs' , ( ) => {
782
- const mockUsage = 'Usage: test <url>'
783
- const mockExit = vi . spyOn ( process , 'exit' ) . mockImplementation ( ( ) => {
784
- throw new Error ( 'process.exit called' )
785
- } )
786
-
787
- beforeEach ( ( ) => {
788
- vi . clearAllMocks ( )
789
- } )
790
-
791
- afterEach ( ( ) => {
792
- mockExit . mockReset ( )
793
- } )
794
-
795
- describe ( '--auth-timeout parsing' , ( ) => {
796
- it ( 'should use default timeout of 30000ms when no --auth-timeout flag is provided' , async ( ) => {
797
- const args = [ 'https://example.com' ]
798
- const result = await parseCommandLineArgs ( args , mockUsage )
799
-
800
- expect ( result . authTimeoutMs ) . toBe ( 30000 )
801
- } )
802
-
803
- it ( 'should parse valid timeout in seconds and convert to milliseconds' , async ( ) => {
804
- const args = [ 'https://example.com' , '--auth-timeout' , '60' ]
805
- const result = await parseCommandLineArgs ( args , mockUsage )
806
-
807
- expect ( result . authTimeoutMs ) . toBe ( 60000 )
808
- } )
809
-
810
- it ( 'should parse another valid timeout value' , async ( ) => {
811
- const args = [ 'https://example.com' , '--auth-timeout' , '120' ]
812
- const result = await parseCommandLineArgs ( args , mockUsage )
813
-
814
- expect ( result . authTimeoutMs ) . toBe ( 120000 )
815
- } )
816
-
817
- it ( 'should use default timeout when invalid timeout value is provided' , async ( ) => {
818
- const consoleSpy = vi . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
819
-
820
- const args = [ 'https://example.com' , '--auth-timeout' , 'invalid' ]
821
- const result = await parseCommandLineArgs ( args , mockUsage )
822
-
823
- expect ( result . authTimeoutMs ) . toBe ( 30000 )
824
- expect ( consoleSpy ) . toHaveBeenCalledWith (
825
- expect . stringContaining ( 'Warning: Ignoring invalid auth timeout value: invalid. Must be a positive number.' )
826
- )
827
-
828
- consoleSpy . mockRestore ( )
829
- } )
830
-
831
- it ( 'should use default timeout when negative timeout value is provided' , async ( ) => {
832
- const consoleSpy = vi . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
833
-
834
- const args = [ 'https://example.com' , '--auth-timeout' , '-30' ]
835
- const result = await parseCommandLineArgs ( args , mockUsage )
836
-
837
- expect ( result . authTimeoutMs ) . toBe ( 30000 )
838
- expect ( consoleSpy ) . toHaveBeenCalledWith (
839
- expect . stringContaining ( 'Warning: Ignoring invalid auth timeout value: -30. Must be a positive number.' )
840
- )
841
-
842
- consoleSpy . mockRestore ( )
843
- } )
844
-
845
- it ( 'should use default timeout when zero timeout value is provided' , async ( ) => {
846
- const consoleSpy = vi . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
847
-
848
- const args = [ 'https://example.com' , '--auth-timeout' , '0' ]
849
- const result = await parseCommandLineArgs ( args , mockUsage )
850
-
851
- expect ( result . authTimeoutMs ) . toBe ( 30000 )
852
- expect ( consoleSpy ) . toHaveBeenCalledWith (
853
- expect . stringContaining ( 'Warning: Ignoring invalid auth timeout value: 0. Must be a positive number.' )
854
- )
855
-
856
- consoleSpy . mockRestore ( )
857
- } )
858
-
859
- it ( 'should use default timeout when --auth-timeout flag has no value' , async ( ) => {
860
- const args = [ 'https://example.com' , '--auth-timeout' ]
861
- const result = await parseCommandLineArgs ( args , mockUsage )
862
-
863
- expect ( result . authTimeoutMs ) . toBe ( 30000 )
864
- } )
865
-
866
- it ( 'should log when using custom timeout' , async ( ) => {
867
- const consoleSpy = vi . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } )
868
-
869
- const args = [ 'https://example.com' , '--auth-timeout' , '45' ]
870
- const result = await parseCommandLineArgs ( args , mockUsage )
871
-
872
- expect ( result . authTimeoutMs ) . toBe ( 45000 )
873
- expect ( consoleSpy ) . toHaveBeenCalledWith (
874
- expect . stringContaining ( 'Using auth callback timeout: 45 seconds' )
875
- )
876
-
877
- consoleSpy . mockRestore ( )
878
- } )
879
- } )
880
- } )
881
-
882
873
describe ( 'setupOAuthCallbackServerWithLongPoll' , ( ) => {
883
874
let server : any
884
875
let events : EventEmitter
@@ -900,7 +891,7 @@ describe('setupOAuthCallbackServerWithLongPoll', () => {
900
891
port : 0 , // Use any available port
901
892
path : '/oauth/callback' ,
902
893
events,
903
- authTimeoutMs : customTimeout
894
+ authTimeoutMs : customTimeout ,
904
895
} )
905
896
906
897
server = result . server
@@ -914,7 +905,7 @@ describe('setupOAuthCallbackServerWithLongPoll', () => {
914
905
const result = setupOAuthCallbackServerWithLongPoll ( {
915
906
port : 0 , // Use any available port
916
907
path : '/oauth/callback' ,
917
- events
908
+ events,
918
909
} )
919
910
920
911
server = result . server
0 commit comments