summaryrefslogtreecommitdiff
path: root/packages/cli/src/services/prompt-processors/argumentProcessor.test.ts
blob: 6af578a91179b9122bd5cf8bc9947f1f9259b8a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
 * @license
 * Copyright 2025 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

import {
  DefaultArgumentProcessor,
  ShorthandArgumentProcessor,
} from './argumentProcessor.js';
import { createMockCommandContext } from '../../test-utils/mockCommandContext.js';

describe('Argument Processors', () => {
  describe('ShorthandArgumentProcessor', () => {
    const processor = new ShorthandArgumentProcessor();

    it('should replace a single {{args}} instance', async () => {
      const prompt = 'Refactor the following code: {{args}}';
      const context = createMockCommandContext({
        invocation: {
          raw: '/refactor make it faster',
          name: 'refactor',
          args: 'make it faster',
        },
      });
      const result = await processor.process(prompt, context);
      expect(result).toBe('Refactor the following code: make it faster');
    });

    it('should replace multiple {{args}} instances', async () => {
      const prompt = 'User said: {{args}}. I repeat: {{args}}!';
      const context = createMockCommandContext({
        invocation: {
          raw: '/repeat hello world',
          name: 'repeat',
          args: 'hello world',
        },
      });
      const result = await processor.process(prompt, context);
      expect(result).toBe('User said: hello world. I repeat: hello world!');
    });

    it('should handle an empty args string', async () => {
      const prompt = 'The user provided no input: {{args}}.';
      const context = createMockCommandContext({
        invocation: {
          raw: '/input',
          name: 'input',
          args: '',
        },
      });
      const result = await processor.process(prompt, context);
      expect(result).toBe('The user provided no input: .');
    });

    it('should not change the prompt if {{args}} is not present', async () => {
      const prompt = 'This is a static prompt.';
      const context = createMockCommandContext({
        invocation: {
          raw: '/static some arguments',
          name: 'static',
          args: 'some arguments',
        },
      });
      const result = await processor.process(prompt, context);
      expect(result).toBe('This is a static prompt.');
    });
  });

  describe('DefaultArgumentProcessor', () => {
    const processor = new DefaultArgumentProcessor();

    it('should append the full command if args are provided', async () => {
      const prompt = 'Parse the command.';
      const context = createMockCommandContext({
        invocation: {
          raw: '/mycommand arg1 "arg two"',
          name: 'mycommand',
          args: 'arg1 "arg two"',
        },
      });
      const result = await processor.process(prompt, context);
      expect(result).toBe('Parse the command.\n\n/mycommand arg1 "arg two"');
    });

    it('should NOT append the full command if no args are provided', async () => {
      const prompt = 'Parse the command.';
      const context = createMockCommandContext({
        invocation: {
          raw: '/mycommand',
          name: 'mycommand',
          args: '',
        },
      });
      const result = await processor.process(prompt, context);
      expect(result).toBe('Parse the command.');
    });
  });
});