test(grep): ensure error bubbles up if not exiterror

tauraamui created

Change summary

internal/llm/tools/grep_test.go | 63 ++++++++++++++++++++++++++--------
1 file changed, 47 insertions(+), 16 deletions(-)

Detailed changes

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