|
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,102 @@ 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( |
| 418 | + expect.stringContaining('Using auth callback timeout: 45 seconds') |
| 419 | + ) |
| 420 | + |
| 421 | + consoleSpy.mockRestore() |
| 422 | + }) |
329 | 423 | })
|
330 | 424 |
|
331 | 425 | describe('Feature: Tool Filtering with Ignore Patterns', () => {
|
@@ -778,107 +872,6 @@ describe('Feature: MCP Proxy', () => {
|
778 | 872 | })
|
779 | 873 | })
|
780 | 874 |
|
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 | 875 | describe('setupOAuthCallbackServerWithLongPoll', () => {
|
883 | 876 | let server: any
|
884 | 877 | let events: EventEmitter
|
|
0 commit comments