refactor(ui): fix AutoApproveDropdown memo deps to avoid recomputation; test: ensure Browser toggle hidden when browser tool disabled

This commit is contained in:
Hannes Rudolph 2025-11-17 12:11:28 -07:00
parent d04ec522c9
commit 1de4b8db53
2 changed files with 60 additions and 5 deletions

View file

@ -149,13 +149,13 @@ export const AutoApproveDropdown = ({ disabled = false, triggerClassName = "" }:
vscode.postMessage({ type: "autoApprovalEnabled", bool: newValue })
}, [autoApprovalEnabled, setAutoApprovalEnabled])
// Calculate enabled and total counts as separate properties
const settingsArray = Object.values(autoApproveSettingsConfig)
// Filter out Browser toggle when browser tool is disabled
const visibleSettingsArray = React.useMemo(
() => settingsArray.filter((s) => browserToolEnabled || s.key !== "alwaysAllowBrowser"),
[settingsArray, browserToolEnabled],
() =>
Object.values(autoApproveSettingsConfig).filter(
(s) => browserToolEnabled || s.key !== "alwaysAllowBrowser",
),
[browserToolEnabled],
)
const visibleKeys = React.useMemo(() => visibleSettingsArray.map((s) => s.key), [visibleSettingsArray])

View file

@ -0,0 +1,55 @@
import { render, screen } from "@/utils/test-utils"
import { TranslationProvider } from "@/i18n/__mocks__/TranslationContext"
import { AutoApproveToggle, autoApproveSettingsConfig } from "../AutoApproveToggle"
vi.mock("@/i18n/TranslationContext", () => {
const actual = vi.importActual("@/i18n/TranslationContext")
return {
...actual,
useAppTranslation: () => ({
t: (key: string) => key,
}),
}
})
// Mock ExtensionState with browserToolEnabled = false to verify visibility gating
vi.mock("@/context/ExtensionStateContext", () => {
return {
useExtensionState: () => ({ browserToolEnabled: false }),
ExtensionStateContextProvider: ({ children }: any) => children,
}
})
describe("AutoApproveToggle - hidden Browser toggle when browser tool disabled", () => {
const initialProps = {
alwaysAllowReadOnly: true,
alwaysAllowWrite: false,
alwaysAllowBrowser: false,
alwaysApproveResubmit: true,
alwaysAllowMcp: false,
alwaysAllowModeSwitch: true,
alwaysAllowSubtasks: false,
alwaysAllowExecute: true,
alwaysAllowFollowupQuestions: false,
alwaysAllowUpdateTodoList: true,
onToggle: vi.fn(),
}
test("does not render the Browser auto-approve toggle when browserToolEnabled is false", () => {
render(
<TranslationProvider>
<AutoApproveToggle {...initialProps} />
</TranslationProvider>,
)
// Browser toggle should be hidden
const browserToggle = screen.queryByTestId(autoApproveSettingsConfig.alwaysAllowBrowser.testId)
expect(browserToggle).toBeNull()
// A non-browser toggle should still be present to ensure the component renders others
const readOnlyToggle = screen.getByTestId(autoApproveSettingsConfig.alwaysAllowReadOnly.testId)
expect(readOnlyToggle).toBeInTheDocument()
})
})