feat: added tests and translations fixes

This commit is contained in:
Sannidhya Sah 2025-06-15 15:59:28 +05:30
parent 4906396517
commit bf3adfc258
19 changed files with 199 additions and 0 deletions

View file

@ -2,9 +2,20 @@ import { webviewMessageHandler } from "../webviewMessageHandler"
import { ClineProvider } from "../ClineProvider"
import { getModels } from "../../../api/providers/fetchers/modelCache"
import { ModelRecord } from "../../../shared/api"
import type { ClineMessage } from "@roo-code/types"
import * as vscode from "vscode"
// Mock dependencies
jest.mock("../../../api/providers/fetchers/modelCache")
jest.mock("vscode", () => ({
window: {
showWarningMessage: jest.fn(),
},
}))
jest.mock("../../checkpoints", () => ({
checkpointRestore: jest.fn(),
}))
const mockGetModels = getModels as jest.MockedFunction<typeof getModels>
// Mock ClineProvider
@ -272,3 +283,93 @@ describe("webviewMessageHandler - requestRouterModels", () => {
})
})
})
describe("webviewMessageHandler - editMessage", () => {
let mockCline: any
beforeEach(() => {
jest.clearAllMocks()
// Mock Cline instance
mockCline = {
taskId: "test-task-id",
clineMessages: [
{ ts: 1000, type: "say", say: "user_feedback", text: "First message" },
{ ts: 2000, type: "say", say: "user_feedback", text: "Second message" },
{ ts: 3000, type: "say", say: "checkpoint_saved", text: "Checkpoint saved" },
{ ts: 4000, type: "say", say: "user_feedback", text: "Third message" },
] as ClineMessage[],
apiConversationHistory: [
{ ts: 1000, role: "user", content: "First message" },
{ ts: 2000, role: "user", content: "Second message" },
{ ts: 4000, role: "user", content: "Third message" },
],
overwriteClineMessages: jest.fn(),
overwriteApiConversationHistory: jest.fn(),
}
mockClineProvider.getCurrentCline = jest.fn().mockReturnValue(mockCline)
mockClineProvider.getState = jest.fn().mockResolvedValue({ enableCheckpoints: true })
mockClineProvider.getTaskWithId = jest.fn().mockResolvedValue({
historyItem: { clineMessages: mockCline.clineMessages },
})
mockClineProvider.postStateToWebview = jest.fn()
mockClineProvider.initClineWithHistoryItem = jest.fn()
})
it("handles basic message editing without confirmation", async () => {
// Mock no subsequent messages and no checkpoints
mockCline.clineMessages = [{ ts: 1000, type: "say", say: "user_feedback", text: "Only message" }]
mockClineProvider.getState = jest.fn().mockResolvedValue({ enableCheckpoints: false })
await webviewMessageHandler(mockClineProvider, {
type: "editMessage",
value: 1000,
text: "Edited message",
})
expect(mockClineProvider.initClineWithHistoryItem).toHaveBeenCalled()
})
it("shows confirmation dialog when editing affects subsequent messages", async () => {
const mockShowWarning = vscode.window.showWarningMessage as jest.Mock
mockShowWarning.mockResolvedValue("Edit Message")
await webviewMessageHandler(mockClineProvider, {
type: "editMessage",
value: 2000, // Edit second message, affecting third message
text: "Edited second message",
})
expect(mockShowWarning).toHaveBeenCalledWith(
"Edit and delete subsequent messages?\n\n• 1 checkpoint(s) will be removed",
{ modal: true },
"Edit Message",
)
expect(mockClineProvider.initClineWithHistoryItem).toHaveBeenCalled()
})
it("cancels edit when user declines confirmation", async () => {
const mockShowWarning = vscode.window.showWarningMessage as jest.Mock
mockShowWarning.mockResolvedValue(undefined) // User cancelled
await webviewMessageHandler(mockClineProvider, {
type: "editMessage",
value: 2000,
text: "This edit should be cancelled",
})
expect(mockClineProvider.postStateToWebview).toHaveBeenCalled()
expect(mockClineProvider.initClineWithHistoryItem).not.toHaveBeenCalled()
})
it("handles invalid message parameters gracefully", async () => {
await webviewMessageHandler(mockClineProvider, {
type: "editMessage",
value: undefined, // Invalid value
text: "Should not process",
})
expect(mockClineProvider.initClineWithHistoryItem).not.toHaveBeenCalled()
})
})

View file

@ -1072,3 +1072,33 @@ describe("ChatView - Focus Grabbing Tests", () => {
expect(mockFocus).toHaveBeenCalledTimes(FOCUS_CALLS_ON_INIT)
})
})
describe("ChatView - Message Edit Tests", () => {
beforeEach(() => jest.clearAllMocks())
it("renders ChatView component without errors", () => {
const { container } = renderChatView()
// Verify the component renders
expect(container).toBeInTheDocument()
})
it("accepts message state updates", () => {
renderChatView()
// Mock a user message state
mockPostMessage({
clineMessages: [
{
type: "say",
say: "user_feedback",
ts: 1234567890,
text: "Test message",
},
],
})
// Verify no errors occurred during state update
expect(vscode.postMessage).toHaveBeenCalled()
})
})

View file

@ -6,6 +6,10 @@
"remove": "Eliminar",
"keep": "Mantenir"
},
"actions": {
"edit": "Editar",
"delete": "Suprimir"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "Entfernen",
"keep": "Behalten"
},
"actions": {
"edit": "Bearbeiten",
"delete": "Löschen"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "Eliminar",
"keep": "Mantener"
},
"actions": {
"edit": "Editar",
"delete": "Eliminar"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "Supprimer",
"keep": "Conserver"
},
"actions": {
"edit": "Modifier",
"delete": "Supprimer"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "हटाएं",
"keep": "रखें"
},
"actions": {
"edit": "संपादित करें",
"delete": "हटाएं"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "Hapus",
"keep": "Simpan"
},
"actions": {
"edit": "Ubah",
"delete": "Hapus"
},
"number_format": {
"thousand_suffix": "rb",
"million_suffix": "jt",

View file

@ -6,6 +6,10 @@
"remove": "Rimuovi",
"keep": "Mantieni"
},
"actions": {
"edit": "Modifica",
"delete": "Elimina"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "削除",
"keep": "保持"
},
"actions": {
"edit": "編集",
"delete": "削除"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "삭제",
"keep": "유지"
},
"actions": {
"edit": "편집",
"delete": "삭제"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "Verwijderen",
"keep": "Behouden"
},
"actions": {
"edit": "Bewerken",
"delete": "Verwijderen"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -11,6 +11,10 @@
"remove": "Usuń",
"keep": "Zachowaj"
},
"actions": {
"edit": "Edytuj",
"delete": "Usuń"
},
"ui": {
"search_placeholder": "Szukaj..."
},

View file

@ -11,6 +11,10 @@
"remove": "Remover",
"keep": "Manter"
},
"actions": {
"edit": "Editar",
"delete": "Excluir"
},
"ui": {
"search_placeholder": "Pesquisar..."
},

View file

@ -11,6 +11,10 @@
"remove": "Удалить",
"keep": "Оставить"
},
"actions": {
"edit": "Редактировать",
"delete": "Удалить"
},
"ui": {
"search_placeholder": "Поиск..."
},

View file

@ -6,6 +6,10 @@
"remove": "Kaldır",
"keep": "Tut"
},
"actions": {
"edit": "Düzenle",
"delete": "Sil"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "Xóa",
"keep": "Giữ"
},
"actions": {
"edit": "Chỉnh sửa",
"delete": "Xóa"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "移除",
"keep": "保留"
},
"actions": {
"edit": "编辑",
"delete": "删除"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",

View file

@ -6,6 +6,10 @@
"remove": "移除",
"keep": "保留"
},
"actions": {
"edit": "編輯",
"delete": "刪除"
},
"number_format": {
"thousand_suffix": "k",
"million_suffix": "m",