From 98981dd5b90908978a57fe6a4ed331704ba3fc1b Mon Sep 17 00:00:00 2001 From: tauraamui Date: Wed, 15 Oct 2025 08:36:03 +0100 Subject: [PATCH] test(grep): ensure error bubbles up if not exiterror --- internal/llm/tools/grep_test.go | 63 ++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/internal/llm/tools/grep_test.go b/internal/llm/tools/grep_test.go index a23563583661148d0026cd4f09667dfbe92a9e78..d258d93d7739b8b3c155ecc8caeb9c3921133edf 100644 --- a/internal/llm/tools/grep_test.go +++ b/internal/llm/tools/grep_test.go @@ -194,26 +194,57 @@ func (m *mockRgExecCmd) Output() ([]byte, error) { } func TestSearchWithRipGrepButItFailsToRunHandleError(t *testing.T) { - // create separate proc state that exits with code 1 - cmd := exec.Command("sh", "-c", "exit 1") - err := cmd.Run() - require.Error(t, err) + tests := []struct { + name string + err error + expectMatches bool + expectError bool + }{ + { + name: "exit code 1 returns no matches and no error", + err: func() error { + cmd := exec.Command("sh", "-c", "exit 1") + err := cmd.Run() + require.Error(t, err) + exitErr, ok := err.(*exec.ExitError) + require.True(t, ok) + require.Equal(t, 1, exitErr.ExitCode()) + return exitErr + }(), + expectMatches: false, + expectError: false, + }, + { + name: "non-exit error returns error", + err: os.ErrPermission, + expectMatches: false, + expectError: true, + }, + } - // Extract the ExitError with real ProcessState. - exitErr, ok := err.(*exec.ExitError) - require.True(t, ok) - require.Equal(t, 1, exitErr.ExitCode()) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockRgCmd := mockRgExecCmd{ + err: tt.err, + } - mockRgCmd := mockRgExecCmd{ - err: exitErr, - } + matches, err := searchWithRipgrep(t.Context(), func(ctx context.Context, pattern, path, include string) execCmd { + return &mockRgCmd + }, "", "", "") - matches, err := searchWithRipgrep(t.Context(), func(ctx context.Context, pattern, path, include string) execCmd { - return &mockRgCmd - }, "", "", "") + if tt.expectMatches { + require.NotEmpty(t, matches) + } else { + require.Empty(t, matches) + } - require.Empty(t, matches) - require.NoError(t, err) + if tt.expectError { + require.Error(t, err) + } else { + require.NoError(t, err) + } + }) + } } // Benchmark to show performance improvement