1
0

mcp-debounce-env.test.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /**
  2. * CODEGRAPH_WATCH_DEBOUNCE_MS env override (issue #403).
  3. *
  4. * Lets users tune the watcher quiet window from MCP-launched configs without
  5. * editing the agent's command line — formatter-on-save chains and large
  6. * generated outputs benefit from a longer window. Clamped to [100ms, 60s];
  7. * out-of-range / non-numeric values fall back to the FileWatcher default
  8. * (2000ms) rather than throwing or silently capping a likely typo.
  9. */
  10. import { describe, it, expect } from 'vitest';
  11. import { parseDebounceEnv } from '../src/mcp/engine';
  12. describe('parseDebounceEnv', () => {
  13. it('returns undefined for unset / empty values', () => {
  14. expect(parseDebounceEnv(undefined)).toBeUndefined();
  15. expect(parseDebounceEnv('')).toBeUndefined();
  16. expect(parseDebounceEnv(' ')).toBeUndefined();
  17. });
  18. it('accepts integer values inside [100, 60000]', () => {
  19. expect(parseDebounceEnv('100')).toBe(100);
  20. expect(parseDebounceEnv('2000')).toBe(2000);
  21. expect(parseDebounceEnv('5000')).toBe(5000);
  22. expect(parseDebounceEnv('60000')).toBe(60000);
  23. });
  24. it('rejects out-of-range values (returns undefined, lets default win)', () => {
  25. expect(parseDebounceEnv('0')).toBeUndefined();
  26. expect(parseDebounceEnv('50')).toBeUndefined(); // below 100
  27. expect(parseDebounceEnv('99')).toBeUndefined();
  28. expect(parseDebounceEnv('60001')).toBeUndefined(); // above 60s
  29. expect(parseDebounceEnv('-500')).toBeUndefined();
  30. });
  31. it('rejects non-integer / non-numeric values', () => {
  32. expect(parseDebounceEnv('abc')).toBeUndefined();
  33. expect(parseDebounceEnv('500.5')).toBeUndefined();
  34. expect(parseDebounceEnv('NaN')).toBeUndefined();
  35. expect(parseDebounceEnv('Infinity')).toBeUndefined();
  36. });
  37. it('accepts scientific notation that resolves to an in-range integer', () => {
  38. // Number('1e3') === 1000, Number.isInteger(1000) === true. Power users
  39. // who write debounce as 1e3 should not be surprised; the clamp still applies.
  40. expect(parseDebounceEnv('1e3')).toBe(1000);
  41. });
  42. });