@@ -12,10 +12,13 @@ vi.mock("vscode", () => ({
1212} ) )
1313
1414vi . 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
2124vi . 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+ } )
3664vi . mock ( "../../core/config/ContextProxy" )
3765vi . mock ( "../../core/config/CustomModesManager" )
3866
3967import { autoImportConfig } from "../autoImportConfig"
4068import * as vscode from "vscode"
41- import * as fs from "fs/promises"
69+ import fsPromises from "fs/promises" // Changed from * as fs
4270import { fileExistsAtPath } from "../fs"
4371
4472describe ( "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 } )
0 commit comments