Skip to content

Commit 24da00f

Browse files
refactor: remove no-explicit-any suppressions in utils (#2281)
Co-authored-by: Roomote <roomote@roomote.dev>
1 parent 71a21c2 commit 24da00f

15 files changed

Lines changed: 412 additions & 415 deletions

‎src/eslint-suppressions.json‎

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,71 +1619,6 @@
16191619
"count": 2
16201620
}
16211621
},
1622-
"utils/__tests__/autoImportSettings.spec.ts": {
1623-
"@typescript-eslint/no-explicit-any": {
1624-
"count": 15
1625-
}
1626-
},
1627-
"utils/__tests__/enhance-prompt.spec.ts": {
1628-
"@typescript-eslint/no-explicit-any": {
1629-
"count": 6
1630-
}
1631-
},
1632-
"utils/__tests__/git.spec.ts": {
1633-
"@typescript-eslint/no-explicit-any": {
1634-
"count": 95
1635-
}
1636-
},
1637-
"utils/__tests__/json-schema.spec.ts": {
1638-
"@typescript-eslint/no-explicit-any": {
1639-
"count": 3
1640-
}
1641-
},
1642-
"utils/__tests__/migrateSettings.spec.ts": {
1643-
"@typescript-eslint/no-explicit-any": {
1644-
"count": 4
1645-
}
1646-
},
1647-
"utils/__tests__/outputChannelLogger.spec.ts": {
1648-
"@typescript-eslint/no-explicit-any": {
1649-
"count": 1
1650-
}
1651-
},
1652-
"utils/__tests__/safeWriteJson.test.ts": {
1653-
"@typescript-eslint/no-explicit-any": {
1654-
"count": 27
1655-
}
1656-
},
1657-
"utils/__tests__/shell.spec.ts": {
1658-
"@typescript-eslint/no-explicit-any": {
1659-
"count": 35
1660-
}
1661-
},
1662-
"utils/__tests__/storage.spec.ts": {
1663-
"@typescript-eslint/no-explicit-any": {
1664-
"count": 25
1665-
}
1666-
},
1667-
"utils/__tests__/tiktoken.spec.ts": {
1668-
"@typescript-eslint/no-explicit-any": {
1669-
"count": 2
1670-
}
1671-
},
1672-
"utils/config.ts": {
1673-
"@typescript-eslint/no-explicit-any": {
1674-
"count": 2
1675-
}
1676-
},
1677-
"utils/export.ts": {
1678-
"@typescript-eslint/no-explicit-any": {
1679-
"count": 2
1680-
}
1681-
},
1682-
"utils/safeWriteJson.ts": {
1683-
"@typescript-eslint/no-explicit-any": {
1684-
"count": 4
1685-
}
1686-
},
16871622
"vitest.setup.ts": {
16881623
"@typescript-eslint/no-explicit-any": {
16891624
"count": 1

‎src/utils/__tests__/autoImportSettings.spec.ts‎

Lines changed: 47 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ vi.mock("../fs", () => ({
5050
}))
5151

5252
vi.mock("../../core/config/ProviderSettingsManager", async (importOriginal) => {
53-
const originalModule = await importOriginal()
53+
const originalModule = await importOriginal<typeof import("../../core/config/ProviderSettingsManager")>()
5454
return {
5555
__esModule: true,
5656
// We need to mock the class constructor and its methods,
@@ -76,25 +76,30 @@ vi.mock("../../core/config/CustomModesManager")
7676
import { autoImportSettings } from "../autoImportSettings"
7777
import * as vscode from "vscode"
7878
import fsPromises from "fs/promises"
79+
import type { Mock } from "vitest"
7980
import { fileExistsAtPath } from "../fs"
8081
import { providerIdentifiers, retiredProviderIdentifiers } from "@roo-code/types/provider-identifiers"
82+
import { ProviderSettingsManager } from "../../core/config/ProviderSettingsManager"
83+
import { ContextProxy } from "../../core/config/ContextProxy"
84+
import { CustomModesManager } from "../../core/config/CustomModesManager"
85+
import { makeWorkspaceConfiguration } from "../../test-utils/vscode"
86+
87+
type MockedManager<T> = ReturnType<typeof vi.mocked<T>>
8188

8289
describe("autoImportSettings", () => {
83-
let mockProviderSettingsManager: any
84-
let mockContextProxy: any
85-
let mockCustomModesManager: any
86-
let mockOutputChannel: any
90+
let mockProviderSettingsManager: MockedManager<ProviderSettingsManager>
91+
let mockContextProxy: MockedManager<ContextProxy>
92+
let mockCustomModesManager: MockedManager<CustomModesManager>
93+
let mockOutputChannel: vscode.OutputChannel
8794

8895
beforeEach(() => {
8996
// Reset all mocks
9097
vi.clearAllMocks()
9198

92-
// Mock output channel
93-
mockOutputChannel = {
94-
appendLine: vi.fn(),
95-
}
99+
// Double provides only appendLine, the sole OutputChannel member the SUT calls.
100+
mockOutputChannel = { appendLine: vi.fn() } as unknown as vscode.OutputChannel
96101

97-
// Mock provider settings manager
102+
// Double provides export/import/listConfig, the members importSettingsFromPath calls.
98103
mockProviderSettingsManager = {
99104
export: vi.fn().mockResolvedValue({
100105
apiConfigs: {},
@@ -103,19 +108,19 @@ describe("autoImportSettings", () => {
103108
}),
104109
import: vi.fn().mockResolvedValue({ success: true }),
105110
listConfig: vi.fn().mockResolvedValue([]),
106-
}
111+
} as unknown as MockedManager<ProviderSettingsManager>
107112

108-
// Mock context proxy
113+
// Double provides the ContextProxy members used by auto-import.
109114
mockContextProxy = {
110115
setValues: vi.fn().mockResolvedValue(undefined),
111116
setValue: vi.fn().mockResolvedValue(undefined),
112117
setProviderSettings: vi.fn().mockResolvedValue(undefined),
113-
}
118+
} as unknown as MockedManager<ContextProxy>
114119

115-
// Mock custom modes manager
120+
// Double provides only updateCustomMode, the CustomModesManager member auto-import calls.
116121
mockCustomModesManager = {
117122
updateCustomMode: vi.fn().mockResolvedValue(undefined),
118-
}
123+
} as unknown as MockedManager<CustomModesManager>
119124

120125
// Reset fs mock
121126
vi.mocked(fsPromises.readFile).mockReset()
@@ -130,9 +135,9 @@ describe("autoImportSettings", () => {
130135
})
131136

132137
it("should skip auto-import when no settings path is specified", async () => {
133-
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({
134-
get: vi.fn().mockReturnValue(""),
135-
} as any)
138+
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue(
139+
makeWorkspaceConfiguration({ autoImportSettingsPath: "" }),
140+
)
136141

137142
await autoImportSettings(mockOutputChannel, {
138143
providerSettingsManager: mockProviderSettingsManager,
@@ -148,9 +153,9 @@ describe("autoImportSettings", () => {
148153

149154
it("should skip auto-import when settings file does not exist", async () => {
150155
const settingsPath = "~/Documents/roo-config.json"
151-
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({
152-
get: vi.fn().mockReturnValue(settingsPath),
153-
} as any)
156+
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue(
157+
makeWorkspaceConfiguration({ autoImportSettingsPath: settingsPath }),
158+
)
154159

155160
// Mock fileExistsAtPath to return false
156161
vi.mocked(fileExistsAtPath).mockResolvedValue(false)
@@ -172,9 +177,9 @@ describe("autoImportSettings", () => {
172177

173178
it("should successfully import settings when file exists and is valid", async () => {
174179
const settingsPath = "/absolute/path/to/config.json"
175-
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({
176-
get: vi.fn().mockReturnValue(settingsPath),
177-
} as any)
180+
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue(
181+
makeWorkspaceConfiguration({ autoImportSettingsPath: settingsPath }),
182+
)
178183

179184
// Mock fileExistsAtPath to return true
180185
vi.mocked(fileExistsAtPath).mockResolvedValue(true)
@@ -195,7 +200,7 @@ describe("autoImportSettings", () => {
195200
},
196201
}
197202

198-
vi.mocked(fsPromises.readFile).mockResolvedValue(JSON.stringify(mockSettings) as any)
203+
;(fsPromises.readFile as Mock).mockResolvedValue(JSON.stringify(mockSettings))
199204

200205
await autoImportSettings(mockOutputChannel, {
201206
providerSettingsManager: mockProviderSettingsManager,
@@ -216,9 +221,9 @@ describe("autoImportSettings", () => {
216221

217222
it("should log import warnings while still succeeding", async () => {
218223
const settingsPath = "/absolute/path/to/config.json"
219-
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({
220-
get: vi.fn().mockReturnValue(settingsPath),
221-
} as any)
224+
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue(
225+
makeWorkspaceConfiguration({ autoImportSettingsPath: settingsPath }),
226+
)
222227

223228
vi.mocked(fileExistsAtPath).mockResolvedValue(true)
224229

@@ -238,7 +243,7 @@ describe("autoImportSettings", () => {
238243
},
239244
}
240245

241-
vi.mocked(fsPromises.readFile).mockResolvedValue(JSON.stringify(mockSettings) as any)
246+
;(fsPromises.readFile as Mock).mockResolvedValue(JSON.stringify(mockSettings))
242247

243248
await autoImportSettings(mockOutputChannel, {
244249
providerSettingsManager: mockProviderSettingsManager,
@@ -264,15 +269,15 @@ describe("autoImportSettings", () => {
264269

265270
it("should handle invalid JSON gracefully", async () => {
266271
const settingsPath = "~/config.json"
267-
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({
268-
get: vi.fn().mockReturnValue(settingsPath),
269-
} as any)
272+
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue(
273+
makeWorkspaceConfiguration({ autoImportSettingsPath: settingsPath }),
274+
)
270275

271276
// Mock fileExistsAtPath to return true
272277
vi.mocked(fileExistsAtPath).mockResolvedValue(true)
273278

274279
// Mock fs.readFile to return invalid JSON
275-
vi.mocked(fsPromises.readFile).mockResolvedValue("invalid json" as any)
280+
;(fsPromises.readFile as Mock).mockResolvedValue("invalid json")
276281

277282
await autoImportSettings(mockOutputChannel, {
278283
providerSettingsManager: mockProviderSettingsManager,
@@ -291,9 +296,9 @@ describe("autoImportSettings", () => {
291296

292297
it("should resolve home directory paths correctly", async () => {
293298
const settingsPath = "~/Documents/config.json"
294-
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({
295-
get: vi.fn().mockReturnValue(settingsPath),
296-
} as any)
299+
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue(
300+
makeWorkspaceConfiguration({ autoImportSettingsPath: settingsPath }),
301+
)
297302

298303
// Mock fileExistsAtPath to return false (so we can check the resolved path)
299304
vi.mocked(fileExistsAtPath).mockResolvedValue(false)
@@ -311,9 +316,9 @@ describe("autoImportSettings", () => {
311316

312317
it("should handle relative paths by resolving them to home directory", async () => {
313318
const settingsPath = "Documents/config.json"
314-
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({
315-
get: vi.fn().mockReturnValue(settingsPath),
316-
} as any)
319+
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue(
320+
makeWorkspaceConfiguration({ autoImportSettingsPath: settingsPath }),
321+
)
317322

318323
// Mock fileExistsAtPath to return false (so we can check the resolved path)
319324
vi.mocked(fileExistsAtPath).mockResolvedValue(false)
@@ -331,9 +336,9 @@ describe("autoImportSettings", () => {
331336

332337
it("should handle file system errors gracefully", async () => {
333338
const settingsPath = "~/config.json"
334-
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue({
335-
get: vi.fn().mockReturnValue(settingsPath),
336-
} as any)
339+
vi.mocked(vscode.workspace.getConfiguration).mockReturnValue(
340+
makeWorkspaceConfiguration({ autoImportSettingsPath: settingsPath }),
341+
)
337342

338343
// Mock fileExistsAtPath to throw an error
339344
vi.mocked(fileExistsAtPath).mockRejectedValue(new Error("File system error"))

0 commit comments

Comments
 (0)