Skip to content

Commit 95c84ae

Browse files
committed
fix changes from initial PR, add importing using ClineProvider, revise
tests
1 parent c0eea94 commit 95c84ae

File tree

4 files changed

+82
-51
lines changed

4 files changed

+82
-51
lines changed

apps/vscode-e2e/src/types/global.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { RooCodeAPI } from "@roo-code/types"
22

33
declare global {
4-
// eslint-disable-next-line no-var
54
var api: RooCodeAPI
65
}
76

src/extension.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ export async function activate(context: vscode.ExtensionContext) {
114114
// Auto-import configuration if specified in settings
115115
try {
116116
await autoImportConfig({
117-
providerSettingsManager: provider.providerSettingsManager,
118-
contextProxy,
117+
provider,
119118
customModesManager: provider.customModesManager,
120119
outputChannel,
121120
})

src/utils/__tests__/autoImportConfig.spec.ts

Lines changed: 55 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ vi.mock("vscode", () => ({
1212
}))
1313

1414
vi.mock("fs/promises", () => ({
15+
__esModule: true,
1516
default: {
16-
readFile: vi.fn(),
17+
readFile: vi.fn(), // This will be fs.default.readFile for the test
18+
// If other default export properties are used by SUT, mock them here
1719
},
18-
readFile: vi.fn(),
20+
// If SUT or tests use named exports from "fs/promises" (e.g. import { stat } from "fs/promises")
21+
readFile: vi.fn(), // Example for a named export
1922
}))
2023

2124
vi.mock("path", () => ({
@@ -32,20 +35,46 @@ vi.mock("../fs", () => ({
3235
fileExistsAtPath: vi.fn(),
3336
}))
3437

35-
vi.mock("../../core/config/ProviderSettingsManager")
38+
vi.mock("../../core/config/ProviderSettingsManager", async (importOriginal) => {
39+
const originalModule = await importOriginal()
40+
return {
41+
// @ts-expect-error - we are overriding the type with a partial mock
42+
__esModule: true,
43+
// We need to mock the class constructor and its methods,
44+
// but keep other exports (like schemas) as their original values.
45+
// @ts-expect-error - we are overriding the type with a partial mock
46+
...(originalModule || {}), // Spread original exports
47+
ProviderSettingsManager: vi.fn().mockImplementation(() => ({
48+
// Mock the class
49+
export: vi.fn().mockResolvedValue({
50+
apiConfigs: {},
51+
modeApiConfigs: {},
52+
currentApiConfigName: "default",
53+
}),
54+
import: vi.fn().mockResolvedValue({ success: true }),
55+
listConfig: vi.fn().mockResolvedValue([]),
56+
// Add other methods of ProviderSettingsManager here if they are called
57+
})),
58+
// Ensure providerProfilesSchema is the actual schema, not a mock fn
59+
// If providerProfilesSchema is exported from this module, it will be retained by the spread.
60+
// If it's a named export and you want to be explicit:
61+
// providerProfilesSchema: (originalModule as any).providerProfilesSchema,
62+
}
63+
})
3664
vi.mock("../../core/config/ContextProxy")
3765
vi.mock("../../core/config/CustomModesManager")
3866

3967
import { autoImportConfig } from "../autoImportConfig"
4068
import * as vscode from "vscode"
41-
import * as fs from "fs/promises"
69+
import fsPromises from "fs/promises" // Changed from * as fs
4270
import { fileExistsAtPath } from "../fs"
4371

4472
describe("autoImportConfig", () => {
4573
let mockProviderSettingsManager: any
4674
let mockContextProxy: any
4775
let mockCustomModesManager: any
4876
let mockOutputChannel: any
77+
let mockProvider: any
4978

5079
beforeEach(() => {
5180
// Reset all mocks
@@ -63,7 +92,7 @@ describe("autoImportConfig", () => {
6392
modeApiConfigs: {},
6493
currentApiConfigName: "default",
6594
}),
66-
import: vi.fn().mockResolvedValue(undefined),
95+
import: vi.fn().mockResolvedValue({ success: true }), // Changed to return an object
6796
listConfig: vi.fn().mockResolvedValue([]),
6897
}
6998

@@ -79,8 +108,17 @@ describe("autoImportConfig", () => {
79108
updateCustomMode: vi.fn().mockResolvedValue(undefined),
80109
}
81110

111+
// mockProvider must be initialized AFTER its dependencies
112+
mockProvider = {
113+
providerSettingsManager: mockProviderSettingsManager,
114+
contextProxy: mockContextProxy, // Now mockContextProxy is defined
115+
upsertProviderProfile: vi.fn().mockResolvedValue({ success: true }), // Return an object
116+
postStateToWebview: vi.fn().mockResolvedValue({ success: true }), // Return an object
117+
// settingsImportedAt will be set directly by the SUT
118+
}
119+
82120
// Reset fs mock
83-
vi.mocked(fs.readFile).mockReset()
121+
vi.mocked(fsPromises.readFile).mockReset()
84122
vi.mocked(fileExistsAtPath).mockReset()
85123
vi.mocked(vscode.workspace.getConfiguration).mockReset()
86124
vi.mocked(vscode.window.showInformationMessage).mockReset()
@@ -97,8 +135,7 @@ describe("autoImportConfig", () => {
97135
} as any)
98136

99137
await autoImportConfig({
100-
providerSettingsManager: mockProviderSettingsManager,
101-
contextProxy: mockContextProxy,
138+
provider: mockProvider,
102139
customModesManager: mockCustomModesManager,
103140
outputChannel: mockOutputChannel,
104141
})
@@ -119,8 +156,7 @@ describe("autoImportConfig", () => {
119156
vi.mocked(fileExistsAtPath).mockResolvedValue(false)
120157

121158
await autoImportConfig({
122-
providerSettingsManager: mockProviderSettingsManager,
123-
contextProxy: mockContextProxy,
159+
provider: mockProvider,
124160
customModesManager: mockCustomModesManager,
125161
outputChannel: mockOutputChannel,
126162
})
@@ -153,17 +189,17 @@ describe("autoImportConfig", () => {
153189
anthropicApiKey: "test-key",
154190
},
155191
},
156-
modeApiConfigs: {},
157192
},
158193
globalSettings: {
159194
customInstructions: "Test instructions",
160195
},
161196
}
162-
vi.mocked(fs.readFile).mockResolvedValue(JSON.stringify(mockConfig) as any)
197+
// The SUT uses `import fs from "fs/promises"`, then `fs.readFile`.
198+
// In the test, `import * as fs` means this is `fs.default.readFile`.
199+
vi.mocked(fsPromises.readFile).mockResolvedValue(JSON.stringify(mockConfig) as any)
163200

164201
await autoImportConfig({
165-
providerSettingsManager: mockProviderSettingsManager,
166-
contextProxy: mockContextProxy,
202+
provider: mockProvider,
167203
customModesManager: mockCustomModesManager,
168204
outputChannel: mockOutputChannel,
169205
})
@@ -191,11 +227,10 @@ describe("autoImportConfig", () => {
191227
vi.mocked(fileExistsAtPath).mockResolvedValue(true)
192228

193229
// Mock fs.readFile to return invalid JSON
194-
vi.mocked(fs.readFile).mockResolvedValue("invalid json" as any)
230+
vi.mocked(fsPromises.readFile).mockResolvedValue("invalid json" as any)
195231

196232
await autoImportConfig({
197-
providerSettingsManager: mockProviderSettingsManager,
198-
contextProxy: mockContextProxy,
233+
provider: mockProvider,
199234
customModesManager: mockCustomModesManager,
200235
outputChannel: mockOutputChannel,
201236
})
@@ -219,8 +254,7 @@ describe("autoImportConfig", () => {
219254
vi.mocked(fileExistsAtPath).mockResolvedValue(false)
220255

221256
await autoImportConfig({
222-
providerSettingsManager: mockProviderSettingsManager,
223-
contextProxy: mockContextProxy,
257+
provider: mockProvider,
224258
customModesManager: mockCustomModesManager,
225259
outputChannel: mockOutputChannel,
226260
})
@@ -240,8 +274,7 @@ describe("autoImportConfig", () => {
240274
vi.mocked(fileExistsAtPath).mockResolvedValue(false)
241275

242276
await autoImportConfig({
243-
providerSettingsManager: mockProviderSettingsManager,
244-
contextProxy: mockContextProxy,
277+
provider: mockProvider,
245278
customModesManager: mockCustomModesManager,
246279
outputChannel: mockOutputChannel,
247280
})
@@ -261,8 +294,7 @@ describe("autoImportConfig", () => {
261294
vi.mocked(fileExistsAtPath).mockRejectedValue(new Error("File system error"))
262295

263296
await autoImportConfig({
264-
providerSettingsManager: mockProviderSettingsManager,
265-
contextProxy: mockContextProxy,
297+
provider: mockProvider,
266298
customModesManager: mockCustomModesManager,
267299
outputChannel: mockOutputChannel,
268300
})

src/utils/autoImportConfig.ts

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import { z, ZodError } from "zod"
77
import { globalSettingsSchema } from "@roo-code/types"
88
import { TelemetryService } from "@roo-code/telemetry"
99

10-
import { ProviderSettingsManager, providerProfilesSchema } from "../core/config/ProviderSettingsManager"
11-
import { ContextProxy } from "../core/config/ContextProxy"
10+
import { Package } from "../shared/package"
11+
import { ClineProvider } from "../core/webview/ClineProvider"
12+
13+
import { providerProfilesSchema } from "../core/config/ProviderSettingsManager"
1214
import { CustomModesManager } from "../core/config/CustomModesManager"
1315
import { fileExistsAtPath } from "./fs"
1416

1517
type AutoImportOptions = {
16-
providerSettingsManager: ProviderSettingsManager
17-
contextProxy: ContextProxy
18+
provider: ClineProvider
1819
customModesManager: CustomModesManager
1920
outputChannel: vscode.OutputChannel
2021
}
@@ -25,14 +26,13 @@ type AutoImportOptions = {
2526
* their settings by placing a config file at a predefined location.
2627
*/
2728
export async function autoImportConfig({
28-
providerSettingsManager,
29-
contextProxy,
29+
provider,
3030
customModesManager,
3131
outputChannel,
3232
}: AutoImportOptions): Promise<void> {
3333
try {
3434
// Get the auto-import config path from VSCode settings
35-
const configPath = vscode.workspace.getConfiguration("roo-cline").get<string>("autoImportConfigPath")
35+
const configPath = vscode.workspace.getConfiguration(Package.name).get<string>("autoImportConfigPath")
3636

3737
if (!configPath || configPath.trim() === "") {
3838
outputChannel.appendLine("[AutoImport] No auto-import config path specified, skipping auto-import")
@@ -51,8 +51,7 @@ export async function autoImportConfig({
5151

5252
// Attempt to import the configuration
5353
const result = await importConfigFromPath(resolvedPath, {
54-
providerSettingsManager,
55-
contextProxy,
54+
provider,
5655
customModesManager,
5756
})
5857

@@ -103,18 +102,21 @@ function resolvePath(configPath: string): string {
103102
*/
104103
async function importConfigFromPath(
105104
filePath: string,
106-
{ providerSettingsManager, contextProxy, customModesManager }: Omit<AutoImportOptions, "outputChannel">,
105+
{ provider, customModesManager }: Omit<AutoImportOptions, "outputChannel">,
107106
): Promise<{ success: boolean; error?: string }> {
108-
const schema = z.object({
109-
providerProfiles: providerProfilesSchema,
110-
globalSettings: globalSettingsSchema.optional(),
111-
})
112-
113107
try {
108+
const { providerSettingsManager, contextProxy } = provider
109+
110+
const schema = z.object({
111+
providerProfiles: providerProfilesSchema,
112+
globalSettings: globalSettingsSchema,
113+
})
114+
114115
const previousProviderProfiles = await providerSettingsManager.export()
115116

116-
const data = JSON.parse(await fs.readFile(filePath, "utf-8"))
117-
const { providerProfiles: newProviderProfiles, globalSettings = {} } = schema.parse(data)
117+
const { providerProfiles: newProviderProfiles, globalSettings } = schema.parse(
118+
JSON.parse(await fs.readFile(filePath, "utf-8")),
119+
)
118120

119121
const providerProfiles = {
120122
currentApiConfigName: newProviderProfiles.currentApiConfigName,
@@ -135,16 +137,15 @@ async function importConfigFromPath(
135137
await providerSettingsManager.import(newProviderProfiles)
136138
await contextProxy.setValues(globalSettings)
137139

138-
// Set the current provider
139-
const currentProviderName = providerProfiles.currentApiConfigName
140-
const currentProvider = providerProfiles.apiConfigs[currentProviderName]
141-
contextProxy.setValue("currentApiConfigName", currentProviderName)
140+
const listApiConfigMetaResult = await providerSettingsManager.listConfig()
141+
contextProxy.setValue("currentApiConfigName", providerProfiles.currentApiConfigName)
142+
contextProxy.setValue("listApiConfigMeta", listApiConfigMetaResult)
142143

143-
if (currentProvider) {
144-
contextProxy.setProviderSettings(currentProvider)
145-
}
144+
const apiConfiguration = newProviderProfiles.apiConfigs[newProviderProfiles.currentApiConfigName]
145+
await provider.upsertProviderProfile(newProviderProfiles.currentApiConfigName, apiConfiguration)
146146

147-
contextProxy.setValue("listApiConfigMeta", await providerSettingsManager.listConfig())
147+
provider.settingsImportedAt = Date.now()
148+
await provider.postStateToWebview()
148149

149150
return { success: true }
150151
} catch (e) {

0 commit comments

Comments
 (0)