@@ -26,6 +26,10 @@ vi.mock("../../../services/command/commands", () => ({
2626 getCommands : vi . fn ( ) ,
2727} ) )
2828
29+ vi . mock ( "../../../services/destructive-command-guard" , ( ) => ( {
30+ ensureDcgInstalled : vi . fn ( ) ,
31+ } ) )
32+
2933vi . mock ( "@anthropic-ai/vertex-sdk" , ( ) => ( {
3034 AnthropicVertex : vi . fn ( ) ,
3135} ) )
@@ -58,6 +62,7 @@ import type { ClineProvider } from "../ClineProvider"
5862import { flushModels , getModels } from "../../../api/providers/fetchers/modelCache"
5963import { getLMStudioModels } from "../../../api/providers/fetchers/lmstudio"
6064import { getCommands } from "../../../services/command/commands"
65+ import { ensureDcgInstalled } from "../../../services/destructive-command-guard"
6166import {
6267 handleCreateRule ,
6368 handleDeleteRule ,
@@ -1098,6 +1103,79 @@ describe("webviewMessageHandler - mcpEnabled", () => {
10981103 } )
10991104} )
11001105
1106+ describe ( "webviewMessageHandler - destructiveCommandGuardEnabled" , ( ) => {
1107+ beforeEach ( ( ) => {
1108+ vi . clearAllMocks ( )
1109+ vi . mocked ( ensureDcgInstalled ) . mockResolvedValue ( "/mock/global/storage/dcg" )
1110+ } )
1111+
1112+ it ( "installs and persists destructive command guard when enabled" , async ( ) => {
1113+ await webviewMessageHandler ( mockClineProvider , {
1114+ type : "updateSettings" ,
1115+ updatedSettings : { destructiveCommandGuardEnabled : true } ,
1116+ } )
1117+
1118+ expect ( ensureDcgInstalled ) . toHaveBeenCalledWith ( "/mock/global/storage" )
1119+ expect ( mockClineProvider . contextProxy . setValue ) . toHaveBeenCalledWith ( "destructiveCommandGuardEnabled" , true )
1120+ expect ( vscode . window . showErrorMessage ) . not . toHaveBeenCalled ( )
1121+ } )
1122+
1123+ it ( "disables the setting and reports an installation failure" , async ( ) => {
1124+ vi . mocked ( ensureDcgInstalled ) . mockRejectedValue ( new Error ( "checksum mismatch" ) )
1125+
1126+ await webviewMessageHandler ( mockClineProvider , {
1127+ type : "updateSettings" ,
1128+ updatedSettings : { destructiveCommandGuardEnabled : true } ,
1129+ } )
1130+
1131+ expect ( mockClineProvider . contextProxy . setValue ) . toHaveBeenCalledWith ( "destructiveCommandGuardEnabled" , false )
1132+ expect ( vscode . window . showErrorMessage ) . toHaveBeenCalledWith (
1133+ "common:errors.destructive_command_guard_enable_failed" ,
1134+ )
1135+ } )
1136+
1137+ it ( "disables the setting when DCG is unavailable for the current platform" , async ( ) => {
1138+ vi . mocked ( ensureDcgInstalled ) . mockResolvedValue ( undefined )
1139+
1140+ await webviewMessageHandler ( mockClineProvider , {
1141+ type : "updateSettings" ,
1142+ updatedSettings : { destructiveCommandGuardEnabled : true } ,
1143+ } )
1144+
1145+ expect ( mockClineProvider . contextProxy . setValue ) . toHaveBeenCalledWith ( "destructiveCommandGuardEnabled" , false )
1146+ expect ( t ) . toHaveBeenCalledWith ( "common:errors.destructive_command_guard_enable_failed" , {
1147+ error : "common:errors.destructiveCommandGuard.unavailable" ,
1148+ } )
1149+ expect ( vscode . window . showErrorMessage ) . toHaveBeenCalledWith (
1150+ "common:errors.destructive_command_guard_enable_failed" ,
1151+ )
1152+ } )
1153+
1154+ it ( "reports non-Error installation failures" , async ( ) => {
1155+ vi . mocked ( ensureDcgInstalled ) . mockRejectedValue ( "download unavailable" )
1156+
1157+ await webviewMessageHandler ( mockClineProvider , {
1158+ type : "updateSettings" ,
1159+ updatedSettings : { destructiveCommandGuardEnabled : true } ,
1160+ } )
1161+
1162+ expect ( mockClineProvider . contextProxy . setValue ) . toHaveBeenCalledWith ( "destructiveCommandGuardEnabled" , false )
1163+ expect ( t ) . toHaveBeenCalledWith ( "common:errors.destructive_command_guard_enable_failed" , {
1164+ error : "download unavailable" ,
1165+ } )
1166+ } )
1167+
1168+ it ( "persists disabled state without trying to install" , async ( ) => {
1169+ await webviewMessageHandler ( mockClineProvider , {
1170+ type : "updateSettings" ,
1171+ updatedSettings : { destructiveCommandGuardEnabled : false } ,
1172+ } )
1173+
1174+ expect ( ensureDcgInstalled ) . not . toHaveBeenCalled ( )
1175+ expect ( mockClineProvider . contextProxy . setValue ) . toHaveBeenCalledWith ( "destructiveCommandGuardEnabled" , false )
1176+ } )
1177+ } )
1178+
11011179describe ( "webviewMessageHandler - terminalProfile" , ( ) => {
11021180 beforeEach ( ( ) => {
11031181 vi . clearAllMocks ( )
0 commit comments