Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/eslint-suppressions.json
Original file line number Diff line number Diff line change
Expand Up @@ -1301,7 +1301,7 @@
},
"services/code-index/__tests__/manager.spec.ts": {
"@typescript-eslint/no-explicit-any": {
"count": 87
"count": 84
}
},
"services/code-index/__tests__/orchestrator.spec.ts": {
Expand Down
62 changes: 10 additions & 52 deletions src/services/code-index/__tests__/manager.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { makeExtensionContext } from "../../../test-utils/vscode"
import { CodeIndexManager } from "../manager"
import { CodeIndexManagerRegistry } from "../code-index-manager-registry"
import { CodeIndexServiceFactory } from "../service-factory"
import { CodeIndexOrchestrator } from "../orchestrator"
import { CodeIndexSearchService } from "../search-service"
import type { MockedClass } from "vitest"
import * as path from "path"
import { providerIdentifiers } from "@roo-code/types/provider-identifiers"
Expand Down Expand Up @@ -474,63 +476,19 @@ describe("CodeIndexManager - handleSettingsChange regression", () => {
;(manager as any)._configManager = mockConfigManager
})

it("should validate embedder during _recreateServices when validation succeeds", async () => {
// Arrange
mockServiceFactoryInstance.validateEmbedder.mockResolvedValue({ valid: true })

// Act - directly call the private method for testing
await (manager as any)._recreateServices()

// Assert
expect(mockServiceFactoryInstance.createServices).toHaveBeenCalled()
const createdEmbedder = mockServiceFactoryInstance.createServices.mock.results[0].value.embedder
expect(mockServiceFactoryInstance.validateEmbedder).toHaveBeenCalledWith(createdEmbedder)
expect(mockStateManager.setSystemState).not.toHaveBeenCalledWith("Error", expect.any(String))
})

it("should set error state when embedder validation fails", async () => {
// Arrange
it("should create indexing services without a startup embedder validation request", async () => {
mockServiceFactoryInstance.validateEmbedder.mockResolvedValue({
valid: false,
error: "embeddings:validation.authenticationFailed",
error: "Embedder unavailable",
})

// Act & Assert
await expect((manager as any)._recreateServices()).rejects.toThrow(
"embeddings:validation.authenticationFailed",
)
await manager["_recreateServices"]()

// Assert other expectations
expect(mockServiceFactoryInstance.createServices).toHaveBeenCalled()
const createdEmbedder = mockServiceFactoryInstance.createServices.mock.results[0].value.embedder
expect(mockServiceFactoryInstance.validateEmbedder).toHaveBeenCalledWith(createdEmbedder)
expect(mockStateManager.setSystemState).toHaveBeenCalledWith(
"Error",
"embeddings:validation.authenticationFailed",
)
})

it("should set generic error state when embedder validation throws", async () => {
// Arrange
// Since the real service factory catches exceptions, we should mock it to resolve with an error
mockServiceFactoryInstance.validateEmbedder.mockResolvedValue({
valid: false,
error: "embeddings:validation.configurationError",
})

// Act & Assert
await expect((manager as any)._recreateServices()).rejects.toThrow(
"embeddings:validation.configurationError",
)

// Assert other expectations
expect(mockServiceFactoryInstance.createServices).toHaveBeenCalled()
const createdEmbedder = mockServiceFactoryInstance.createServices.mock.results[0].value.embedder
expect(mockServiceFactoryInstance.validateEmbedder).toHaveBeenCalledWith(createdEmbedder)
expect(mockStateManager.setSystemState).toHaveBeenCalledWith(
"Error",
"embeddings:validation.configurationError",
)
expect(mockServiceFactoryInstance.validateEmbedder).not.toHaveBeenCalled()
expect(mockStateManager.setSystemState).not.toHaveBeenCalledWith("Error", expect.any(String))
expect(manager["_orchestrator"]).toBeInstanceOf(CodeIndexOrchestrator)
expect(manager["_searchService"]).toBeInstanceOf(CodeIndexSearchService)
})

it("should handle embedder creation failure", async () => {
Expand Down Expand Up @@ -684,7 +642,7 @@ describe("CodeIndexManager - handleSettingsChange regression", () => {
// Assert - manager should be initialized again
expect(manager.isInitialized).toBe(true)
expect(mockServiceFactoryInstance.createServices).toHaveBeenCalled()
expect(mockServiceFactoryInstance.validateEmbedder).toHaveBeenCalled()
expect(mockServiceFactoryInstance.validateEmbedder).not.toHaveBeenCalled()
})

it("should be safe to call when not in error state (idempotent)", async () => {
Expand Down
8 changes: 0 additions & 8 deletions src/services/code-index/manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -416,14 +416,6 @@ export class CodeIndexManager {
rooIgnoreController,
)

// Validate embedder configuration before proceeding
const validationResult = await this._serviceFactory.validateEmbedder(embedder)
if (!validationResult.valid) {
const errorMessage = validationResult.error || "Embedder configuration validation failed"
this._stateManager.setSystemState("Error", errorMessage)
throw new Error(errorMessage)
}

// (Re)Initialize orchestrator
this._orchestrator = new CodeIndexOrchestrator(
this._configManager!,
Expand Down
Loading