@@ -78,13 +78,63 @@ describe("CodeIndexManager - handleSettingsChange regression", () => {
7878 // Mock a minimal config manager that simulates first-time configuration
7979 const mockConfigManager = {
8080 loadConfiguration : vi . fn ( ) . mockResolvedValue ( { requiresRestart : true } ) ,
81+ isFeatureConfigured : true ,
82+ isFeatureEnabled : true ,
83+ getConfig : vi . fn ( ) . mockReturnValue ( {
84+ isEnabled : true ,
85+ isConfigured : true ,
86+ embedderProvider : "openai" ,
87+ modelId : "text-embedding-3-small" ,
88+ openAiOptions : { openAiNativeApiKey : "test-key" } ,
89+ qdrantUrl : "http://localhost:6333" ,
90+ qdrantApiKey : "test-key" ,
91+ searchMinScore : 0.4 ,
92+ } ) ,
8193 }
8294 ; ( manager as any ) . _configManager = mockConfigManager
8395
96+ // Mock cache manager
97+ const mockCacheManager = {
98+ initialize : vi . fn ( ) ,
99+ clearCacheFile : vi . fn ( ) ,
100+ }
101+ ; ( manager as any ) . _cacheManager = mockCacheManager
102+
84103 // Mock the feature state to simulate valid configuration that would normally trigger restart
85104 vi . spyOn ( manager , "isFeatureEnabled" , "get" ) . mockReturnValue ( true )
86105 vi . spyOn ( manager , "isFeatureConfigured" , "get" ) . mockReturnValue ( true )
87106
107+ // Mock service factory to handle _recreateServices call
108+ const mockServiceFactoryInstance = {
109+ configManager : mockConfigManager ,
110+ workspacePath : "/test/workspace" ,
111+ cacheManager : mockCacheManager ,
112+ createEmbedder : vi . fn ( ) . mockReturnValue ( { embedderInfo : { name : "openai" } } ) ,
113+ createVectorStore : vi . fn ( ) . mockReturnValue ( { } ) ,
114+ createDirectoryScanner : vi . fn ( ) . mockReturnValue ( { } ) ,
115+ createFileWatcher : vi . fn ( ) . mockReturnValue ( {
116+ onDidStartBatchProcessing : vi . fn ( ) ,
117+ onBatchProgressUpdate : vi . fn ( ) ,
118+ watch : vi . fn ( ) ,
119+ stopWatcher : vi . fn ( ) ,
120+ dispose : vi . fn ( ) ,
121+ } ) ,
122+ createServices : vi . fn ( ) . mockReturnValue ( {
123+ embedder : { embedderInfo : { name : "openai" } } ,
124+ vectorStore : { } ,
125+ scanner : { } ,
126+ fileWatcher : {
127+ onDidStartBatchProcessing : vi . fn ( ) ,
128+ onBatchProgressUpdate : vi . fn ( ) ,
129+ watch : vi . fn ( ) ,
130+ stopWatcher : vi . fn ( ) ,
131+ dispose : vi . fn ( ) ,
132+ } ,
133+ } ) ,
134+ validateEmbedder : vi . fn ( ) . mockResolvedValue ( { valid : true } ) ,
135+ }
136+ MockedCodeIndexServiceFactory . mockImplementation ( ( ) => mockServiceFactoryInstance as any )
137+
88138 // The key test: this should NOT throw "CodeIndexManager not initialized" error
89139 await expect ( manager . handleSettingsChange ( ) ) . resolves . not . toThrow ( )
90140
@@ -111,29 +161,65 @@ describe("CodeIndexManager - handleSettingsChange regression", () => {
111161 }
112162 ; ( manager as any ) . _configManager = mockConfigManager
113163
164+ // Mock cache manager
165+ const mockCacheManager = {
166+ initialize : vi . fn ( ) ,
167+ clearCacheFile : vi . fn ( ) ,
168+ }
169+ ; ( manager as any ) . _cacheManager = mockCacheManager
170+
114171 // Simulate an initialized manager by setting the required properties
115172 ; ( manager as any ) . _orchestrator = { stopWatcher : vi . fn ( ) }
116173 ; ( manager as any ) . _searchService = { }
117- ; ( manager as any ) . _cacheManager = { }
118174
119175 // Verify manager is considered initialized
120176 expect ( manager . isInitialized ) . toBe ( true )
121177
122- // Mock the methods that would be called during restart
123- const recreateServicesSpy = vi . spyOn ( manager as any , "_recreateServices" ) . mockImplementation ( ( ) => { } )
124- const startIndexingSpy = vi . spyOn ( manager , "startIndexing" ) . mockResolvedValue ( )
125-
126178 // Mock the feature state
127179 vi . spyOn ( manager , "isFeatureEnabled" , "get" ) . mockReturnValue ( true )
128180 vi . spyOn ( manager , "isFeatureConfigured" , "get" ) . mockReturnValue ( true )
129181
182+ // Mock service factory to handle _recreateServices call
183+ const mockServiceFactoryInstance = {
184+ configManager : mockConfigManager ,
185+ workspacePath : "/test/workspace" ,
186+ cacheManager : mockCacheManager ,
187+ createEmbedder : vi . fn ( ) . mockReturnValue ( { embedderInfo : { name : "openai" } } ) ,
188+ createVectorStore : vi . fn ( ) . mockReturnValue ( { } ) ,
189+ createDirectoryScanner : vi . fn ( ) . mockReturnValue ( { } ) ,
190+ createFileWatcher : vi . fn ( ) . mockReturnValue ( {
191+ onDidStartBatchProcessing : vi . fn ( ) ,
192+ onBatchProgressUpdate : vi . fn ( ) ,
193+ watch : vi . fn ( ) ,
194+ stopWatcher : vi . fn ( ) ,
195+ dispose : vi . fn ( ) ,
196+ } ) ,
197+ createServices : vi . fn ( ) . mockReturnValue ( {
198+ embedder : { embedderInfo : { name : "openai" } } ,
199+ vectorStore : { } ,
200+ scanner : { } ,
201+ fileWatcher : {
202+ onDidStartBatchProcessing : vi . fn ( ) ,
203+ onBatchProgressUpdate : vi . fn ( ) ,
204+ watch : vi . fn ( ) ,
205+ stopWatcher : vi . fn ( ) ,
206+ dispose : vi . fn ( ) ,
207+ } ,
208+ } ) ,
209+ validateEmbedder : vi . fn ( ) . mockResolvedValue ( { valid : true } ) ,
210+ }
211+ MockedCodeIndexServiceFactory . mockImplementation ( ( ) => mockServiceFactoryInstance as any )
212+
213+ // Mock the methods that would be called during restart
214+ const recreateServicesSpy = vi . spyOn ( manager as any , "_recreateServices" )
215+
130216 await manager . handleSettingsChange ( )
131217
132218 // Verify that the restart sequence was called
133219 expect ( mockConfigManager . loadConfiguration ) . toHaveBeenCalled ( )
134- // stopWatcher is called inside _recreateServices, which we mocked
220+ // _recreateServices should be called when requiresRestart is true
135221 expect ( recreateServicesSpy ) . toHaveBeenCalled ( )
136- expect ( startIndexingSpy ) . toHaveBeenCalled ( )
222+ // Note: startIndexing is NOT called by handleSettingsChange - it's only called by initialize ()
137223 } )
138224
139225 it ( "should handle case when config manager is not set" , async ( ) => {
0 commit comments