Skip to content

Commit bf3adfc

Browse files
committed
feat: added tests and translations fixes
1 parent 4906396 commit bf3adfc

File tree

19 files changed

+199
-0
lines changed

19 files changed

+199
-0
lines changed

src/core/webview/__tests__/webviewMessageHandler.test.ts

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,20 @@ import { webviewMessageHandler } from "../webviewMessageHandler"
22
import { ClineProvider } from "../ClineProvider"
33
import { getModels } from "../../../api/providers/fetchers/modelCache"
44
import { ModelRecord } from "../../../shared/api"
5+
import type { ClineMessage } from "@roo-code/types"
6+
import * as vscode from "vscode"
57

68
// Mock dependencies
79
jest.mock("../../../api/providers/fetchers/modelCache")
10+
jest.mock("vscode", () => ({
11+
window: {
12+
showWarningMessage: jest.fn(),
13+
},
14+
}))
15+
jest.mock("../../checkpoints", () => ({
16+
checkpointRestore: jest.fn(),
17+
}))
18+
819
const mockGetModels = getModels as jest.MockedFunction<typeof getModels>
920

1021
// Mock ClineProvider
@@ -272,3 +283,93 @@ describe("webviewMessageHandler - requestRouterModels", () => {
272283
})
273284
})
274285
})
286+
287+
describe("webviewMessageHandler - editMessage", () => {
288+
let mockCline: any
289+
290+
beforeEach(() => {
291+
jest.clearAllMocks()
292+
293+
// Mock Cline instance
294+
mockCline = {
295+
taskId: "test-task-id",
296+
clineMessages: [
297+
{ ts: 1000, type: "say", say: "user_feedback", text: "First message" },
298+
{ ts: 2000, type: "say", say: "user_feedback", text: "Second message" },
299+
{ ts: 3000, type: "say", say: "checkpoint_saved", text: "Checkpoint saved" },
300+
{ ts: 4000, type: "say", say: "user_feedback", text: "Third message" },
301+
] as ClineMessage[],
302+
apiConversationHistory: [
303+
{ ts: 1000, role: "user", content: "First message" },
304+
{ ts: 2000, role: "user", content: "Second message" },
305+
{ ts: 4000, role: "user", content: "Third message" },
306+
],
307+
overwriteClineMessages: jest.fn(),
308+
overwriteApiConversationHistory: jest.fn(),
309+
}
310+
311+
mockClineProvider.getCurrentCline = jest.fn().mockReturnValue(mockCline)
312+
mockClineProvider.getState = jest.fn().mockResolvedValue({ enableCheckpoints: true })
313+
mockClineProvider.getTaskWithId = jest.fn().mockResolvedValue({
314+
historyItem: { clineMessages: mockCline.clineMessages },
315+
})
316+
mockClineProvider.postStateToWebview = jest.fn()
317+
mockClineProvider.initClineWithHistoryItem = jest.fn()
318+
})
319+
320+
it("handles basic message editing without confirmation", async () => {
321+
// Mock no subsequent messages and no checkpoints
322+
mockCline.clineMessages = [{ ts: 1000, type: "say", say: "user_feedback", text: "Only message" }]
323+
mockClineProvider.getState = jest.fn().mockResolvedValue({ enableCheckpoints: false })
324+
325+
await webviewMessageHandler(mockClineProvider, {
326+
type: "editMessage",
327+
value: 1000,
328+
text: "Edited message",
329+
})
330+
331+
expect(mockClineProvider.initClineWithHistoryItem).toHaveBeenCalled()
332+
})
333+
334+
it("shows confirmation dialog when editing affects subsequent messages", async () => {
335+
const mockShowWarning = vscode.window.showWarningMessage as jest.Mock
336+
mockShowWarning.mockResolvedValue("Edit Message")
337+
338+
await webviewMessageHandler(mockClineProvider, {
339+
type: "editMessage",
340+
value: 2000, // Edit second message, affecting third message
341+
text: "Edited second message",
342+
})
343+
344+
expect(mockShowWarning).toHaveBeenCalledWith(
345+
"Edit and delete subsequent messages?\n\n• 1 checkpoint(s) will be removed",
346+
{ modal: true },
347+
"Edit Message",
348+
)
349+
expect(mockClineProvider.initClineWithHistoryItem).toHaveBeenCalled()
350+
})
351+
352+
it("cancels edit when user declines confirmation", async () => {
353+
const mockShowWarning = vscode.window.showWarningMessage as jest.Mock
354+
mockShowWarning.mockResolvedValue(undefined) // User cancelled
355+
356+
await webviewMessageHandler(mockClineProvider, {
357+
type: "editMessage",
358+
value: 2000,
359+
text: "This edit should be cancelled",
360+
})
361+
362+
expect(mockClineProvider.postStateToWebview).toHaveBeenCalled()
363+
expect(mockClineProvider.initClineWithHistoryItem).not.toHaveBeenCalled()
364+
})
365+
366+
it("handles invalid message parameters gracefully", async () => {
367+
await webviewMessageHandler(mockClineProvider, {
368+
type: "editMessage",
369+
value: undefined, // Invalid value
370+
text: "Should not process",
371+
})
372+
373+
expect(mockClineProvider.initClineWithHistoryItem).not.toHaveBeenCalled()
374+
})
375+
})

webview-ui/src/components/chat/__tests__/ChatView.test.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1072,3 +1072,33 @@ describe("ChatView - Focus Grabbing Tests", () => {
10721072
expect(mockFocus).toHaveBeenCalledTimes(FOCUS_CALLS_ON_INIT)
10731073
})
10741074
})
1075+
1076+
describe("ChatView - Message Edit Tests", () => {
1077+
beforeEach(() => jest.clearAllMocks())
1078+
1079+
it("renders ChatView component without errors", () => {
1080+
const { container } = renderChatView()
1081+
1082+
// Verify the component renders
1083+
expect(container).toBeInTheDocument()
1084+
})
1085+
1086+
it("accepts message state updates", () => {
1087+
renderChatView()
1088+
1089+
// Mock a user message state
1090+
mockPostMessage({
1091+
clineMessages: [
1092+
{
1093+
type: "say",
1094+
say: "user_feedback",
1095+
ts: 1234567890,
1096+
text: "Test message",
1097+
},
1098+
],
1099+
})
1100+
1101+
// Verify no errors occurred during state update
1102+
expect(vscode.postMessage).toHaveBeenCalled()
1103+
})
1104+
})

webview-ui/src/i18n/locales/ca/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"remove": "Eliminar",
77
"keep": "Mantenir"
88
},
9+
"actions": {
10+
"edit": "Editar",
11+
"delete": "Suprimir"
12+
},
913
"number_format": {
1014
"thousand_suffix": "k",
1115
"million_suffix": "m",

webview-ui/src/i18n/locales/de/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"remove": "Entfernen",
77
"keep": "Behalten"
88
},
9+
"actions": {
10+
"edit": "Bearbeiten",
11+
"delete": "Löschen"
12+
},
913
"number_format": {
1014
"thousand_suffix": "k",
1115
"million_suffix": "m",

webview-ui/src/i18n/locales/es/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"remove": "Eliminar",
77
"keep": "Mantener"
88
},
9+
"actions": {
10+
"edit": "Editar",
11+
"delete": "Eliminar"
12+
},
913
"number_format": {
1014
"thousand_suffix": "k",
1115
"million_suffix": "m",

webview-ui/src/i18n/locales/fr/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"remove": "Supprimer",
77
"keep": "Conserver"
88
},
9+
"actions": {
10+
"edit": "Modifier",
11+
"delete": "Supprimer"
12+
},
913
"number_format": {
1014
"thousand_suffix": "k",
1115
"million_suffix": "m",

webview-ui/src/i18n/locales/hi/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"remove": "हटाएं",
77
"keep": "रखें"
88
},
9+
"actions": {
10+
"edit": "संपादित करें",
11+
"delete": "हटाएं"
12+
},
913
"number_format": {
1014
"thousand_suffix": "k",
1115
"million_suffix": "m",

webview-ui/src/i18n/locales/id/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"remove": "Hapus",
77
"keep": "Simpan"
88
},
9+
"actions": {
10+
"edit": "Ubah",
11+
"delete": "Hapus"
12+
},
913
"number_format": {
1014
"thousand_suffix": "rb",
1115
"million_suffix": "jt",

webview-ui/src/i18n/locales/it/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"remove": "Rimuovi",
77
"keep": "Mantieni"
88
},
9+
"actions": {
10+
"edit": "Modifica",
11+
"delete": "Elimina"
12+
},
913
"number_format": {
1014
"thousand_suffix": "k",
1115
"million_suffix": "m",

webview-ui/src/i18n/locales/ja/common.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"remove": "削除",
77
"keep": "保持"
88
},
9+
"actions": {
10+
"edit": "編集",
11+
"delete": "削除"
12+
},
913
"number_format": {
1014
"thousand_suffix": "k",
1115
"million_suffix": "m",

0 commit comments

Comments
 (0)