|
|
@@ -1,243 +0,0 @@
|
|
|
-import { suite, test, before, after } from "mocha"
|
|
|
-import * as assert from "assert"
|
|
|
-import { type RooCodeAPI } from "@roo-code/types"
|
|
|
-import { waitFor, sleep } from "./utils" // Assuming utils.ts is in the same directory or path is adjusted
|
|
|
-
|
|
|
-// Define an interface for globalThis that includes the 'api' property
|
|
|
-interface GlobalWithApi extends NodeJS.Global {
|
|
|
- api: RooCodeAPI
|
|
|
-}
|
|
|
-
|
|
|
-// Cast globalThis to our new interface
|
|
|
-const g = globalThis as unknown as GlobalWithApi
|
|
|
-
|
|
|
-// Define a minimal interface for task messages for type safety in callbacks
|
|
|
-interface TestTaskMessage {
|
|
|
- role: string
|
|
|
- content: string | unknown // Content can be complex
|
|
|
- isSummary?: boolean
|
|
|
- // Allow other properties
|
|
|
- [key: string]: unknown
|
|
|
-}
|
|
|
-
|
|
|
-suite("Context Condensing Integration Tests", () => {
|
|
|
- let initialConfig: ReturnType<RooCodeAPI["getConfiguration"]>
|
|
|
-
|
|
|
- before(async () => {
|
|
|
- // Ensure API is ready before starting tests
|
|
|
- await waitFor(() => g.api && g.api.isReady())
|
|
|
- initialConfig = g.api.getConfiguration()
|
|
|
- })
|
|
|
-
|
|
|
- after(async () => {
|
|
|
- // Restore initial configuration after tests
|
|
|
- if (initialConfig) {
|
|
|
- // Type issue: RooCodeSettings might not include new props.
|
|
|
- // This will cause a type error if initialConfig contains new props not in RooCodeSettings.
|
|
|
- // For now, we assume initialConfig is a valid RooCodeSettings or types need update.
|
|
|
- await g.api.setConfiguration(initialConfig)
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- suite("Settings Persistence", () => {
|
|
|
- test("should persist condensingApiConfigId when set", async () => {
|
|
|
- const testConfigId = "test-condensing-api-config"
|
|
|
- // @ts-expect-error - Argument of type '{ condensingApiConfigId: string; }' is not assignable to parameter of type 'RooCodeSettings'.
|
|
|
- await g.api.setConfiguration({ condensingApiConfigId: testConfigId })
|
|
|
- await sleep(100)
|
|
|
- const updatedConfig = g.api.getConfiguration()
|
|
|
- assert.strictEqual(
|
|
|
- // @ts-expect-error - Property 'condensingApiConfigId' does not exist on type 'RooCodeSettings'.
|
|
|
- updatedConfig.condensingApiConfigId,
|
|
|
- testConfigId,
|
|
|
- "condensingApiConfigId did not persist",
|
|
|
- )
|
|
|
- })
|
|
|
-
|
|
|
- test("should persist customCondensingPrompt when set", async () => {
|
|
|
- const testPrompt = "This is a custom condensing prompt for testing."
|
|
|
- // @ts-expect-error - Argument of type '{ customCondensingPrompt: string; }' is not assignable to parameter of type 'RooCodeSettings'.
|
|
|
- await g.api.setConfiguration({ customCondensingPrompt: testPrompt })
|
|
|
- await sleep(100)
|
|
|
- const updatedConfig = g.api.getConfiguration()
|
|
|
- assert.strictEqual(
|
|
|
- // @ts-expect-error - Property 'customCondensingPrompt' does not exist on type 'RooCodeSettings'.
|
|
|
- updatedConfig.customCondensingPrompt,
|
|
|
- testPrompt,
|
|
|
- "customCondensingPrompt did not persist",
|
|
|
- )
|
|
|
- })
|
|
|
-
|
|
|
- test("should clear customCondensingPrompt when set to empty string", async () => {
|
|
|
- const initialPrompt = "A prompt to be cleared."
|
|
|
- // @ts-expect-error - Argument of type '{ customCondensingPrompt: string; }' is not assignable to parameter of type 'RooCodeSettings'.
|
|
|
- await g.api.setConfiguration({ customCondensingPrompt: initialPrompt })
|
|
|
- await sleep(100)
|
|
|
- let updatedConfig = g.api.getConfiguration()
|
|
|
- // @ts-expect-error - Property 'customCondensingPrompt' does not exist on type 'RooCodeSettings'.
|
|
|
- assert.strictEqual(updatedConfig.customCondensingPrompt, initialPrompt, "Initial prompt was not set")
|
|
|
-
|
|
|
- // @ts-expect-error - Argument of type '{ customCondensingPrompt: string; }' is not assignable to parameter of type 'RooCodeSettings'.
|
|
|
- await g.api.setConfiguration({ customCondensingPrompt: "" })
|
|
|
- await sleep(100)
|
|
|
- updatedConfig = g.api.getConfiguration()
|
|
|
- // @ts-expect-error - Property 'customCondensingPrompt' does not exist on type 'RooCodeSettings'.
|
|
|
- assert.strictEqual(updatedConfig.customCondensingPrompt, "", "customCondensingPrompt was not cleared")
|
|
|
- })
|
|
|
-
|
|
|
- test("should clear customCondensingPrompt when set to undefined", async () => {
|
|
|
- const initialPrompt = "Another prompt to be cleared."
|
|
|
- // @ts-expect-error - Argument of type '{ customCondensingPrompt: string; }' is not assignable to parameter of type 'RooCodeSettings'.
|
|
|
- await g.api.setConfiguration({ customCondensingPrompt: initialPrompt })
|
|
|
- await sleep(100)
|
|
|
- let updatedConfig = g.api.getConfiguration()
|
|
|
- assert.strictEqual(
|
|
|
- // @ts-expect-error - Property 'customCondensingPrompt' does not exist on type 'RooCodeSettings'.
|
|
|
- updatedConfig.customCondensingPrompt,
|
|
|
- initialPrompt,
|
|
|
- "Initial prompt for undefined test was not set",
|
|
|
- )
|
|
|
-
|
|
|
- // @ts-expect-error - Argument of type '{ customCondensingPrompt: undefined; }' is not assignable to parameter of type 'RooCodeSettings'.
|
|
|
- await g.api.setConfiguration({ customCondensingPrompt: undefined })
|
|
|
- await sleep(100)
|
|
|
- updatedConfig = g.api.getConfiguration()
|
|
|
- // @ts-expect-error - Property 'customCondensingPrompt' does not exist on type 'RooCodeSettings'.
|
|
|
- const currentPrompt = updatedConfig.customCondensingPrompt
|
|
|
- assert.ok(
|
|
|
- currentPrompt === "" || currentPrompt === undefined || currentPrompt === null,
|
|
|
- "customCondensingPrompt was not cleared by undefined",
|
|
|
- )
|
|
|
- })
|
|
|
- })
|
|
|
-
|
|
|
- suite("Message Handling (Conceptual - Covered by Settings Persistence)", () => {
|
|
|
- test.skip("should correctly update backend state from webview messages", () => {
|
|
|
- assert.ok(true, "Skipping direct webview message test, covered by settings persistence.")
|
|
|
- })
|
|
|
- })
|
|
|
-
|
|
|
- suite("API Configuration Resolution and Prompt Customization", () => {
|
|
|
- let taskId: string | undefined
|
|
|
-
|
|
|
- beforeEach(async () => {
|
|
|
- // @ts-expect-error - Property 'tasks' does not exist on type 'RooCodeAPI'.
|
|
|
- const taskResponse = await g.api.tasks.createTask({
|
|
|
- initialMessage: "This is the first message for a new task.",
|
|
|
- })
|
|
|
- taskId = taskResponse.taskId
|
|
|
- assert.ok(taskId, "Task ID should be created")
|
|
|
- await sleep(500)
|
|
|
- })
|
|
|
-
|
|
|
- afterEach(async () => {
|
|
|
- if (taskId) {
|
|
|
- taskId = undefined
|
|
|
- }
|
|
|
- // This directive was unused, meaning setConfiguration(initialConfig) is fine.
|
|
|
- await g.api.setConfiguration(initialConfig)
|
|
|
- await sleep(100)
|
|
|
- })
|
|
|
-
|
|
|
- test("should trigger condensation with default settings", async function () {
|
|
|
- this.timeout(60000)
|
|
|
- assert.ok(taskId, "Task ID must be defined for this test")
|
|
|
-
|
|
|
- for (let i = 0; i < 5; i++) {
|
|
|
- // @ts-expect-error - Property 'tasks' does not exist on type 'RooCodeAPI'.
|
|
|
- await g.api.tasks.sendMessage({
|
|
|
- taskId: taskId!,
|
|
|
- message: `This is message number ${i + 2} in the conversation.`,
|
|
|
- messageType: "user",
|
|
|
- })
|
|
|
- await sleep(2000)
|
|
|
- }
|
|
|
-
|
|
|
- // @ts-expect-error - Property 'tasks' does not exist on type 'RooCodeAPI'.
|
|
|
- const task = await g.api.tasks.getTask(taskId!)
|
|
|
- assert.ok(task, "Task should be retrievable")
|
|
|
- const hasSummary = task.messages.some((msg: TestTaskMessage) => msg.isSummary === true)
|
|
|
- console.log(
|
|
|
- `Task messages for default settings test (taskId: ${taskId}):`,
|
|
|
- JSON.stringify(task.messages, null, 2),
|
|
|
- )
|
|
|
- console.log(`Has summary (default settings): ${hasSummary}`)
|
|
|
- assert.ok(
|
|
|
- true,
|
|
|
- "Condensation process completed with default settings (actual summary check is complex for e2e).",
|
|
|
- )
|
|
|
- })
|
|
|
-
|
|
|
- test("should trigger condensation with custom condensing API config", async function () {
|
|
|
- this.timeout(60000)
|
|
|
- assert.ok(taskId, "Task ID must be defined for this test")
|
|
|
-
|
|
|
- const customCondensingConfigId = "condensing-test-provider"
|
|
|
- // This directive was unused. The error is on the property itself.
|
|
|
- await g.api.setConfiguration({
|
|
|
- // @ts-expect-error - condensingApiConfigId is not a known property in RooCodeSettings.
|
|
|
- condensingApiConfigId: customCondensingConfigId,
|
|
|
- })
|
|
|
- await sleep(100)
|
|
|
-
|
|
|
- for (let i = 0; i < 5; i++) {
|
|
|
- // @ts-expect-error - Property 'tasks' does not exist on type 'RooCodeAPI'.
|
|
|
- await g.api.tasks.sendMessage({
|
|
|
- taskId: taskId!,
|
|
|
- message: `Message ${i + 2} with custom API config.`,
|
|
|
- messageType: "user",
|
|
|
- })
|
|
|
- await sleep(2000)
|
|
|
- }
|
|
|
- // @ts-expect-error - Property 'tasks' does not exist on type 'RooCodeAPI'.
|
|
|
- const task = await g.api.tasks.getTask(taskId!)
|
|
|
- assert.ok(task, "Task should be retrievable with custom API config")
|
|
|
- const hasSummary = task.messages.some((msg: TestTaskMessage) => msg.isSummary === true)
|
|
|
- console.log(
|
|
|
- `Task messages for custom API config test (taskId: ${taskId}):`,
|
|
|
- JSON.stringify(task.messages, null, 2),
|
|
|
- )
|
|
|
- console.log(`Has summary (custom API config): ${hasSummary}`)
|
|
|
- assert.ok(
|
|
|
- true,
|
|
|
- "Condensation process completed with custom API config (specific handler verification is complex for e2e).",
|
|
|
- )
|
|
|
- })
|
|
|
-
|
|
|
- test("should trigger condensation with custom condensing prompt", async function () {
|
|
|
- this.timeout(60000)
|
|
|
- assert.ok(taskId, "Task ID must be defined for this test")
|
|
|
-
|
|
|
- const customPrompt = "E2E Test: Summarize this conversation very briefly."
|
|
|
- // @ts-expect-error - Argument of type '{ customCondensingPrompt: string; }' is not assignable to parameter of type 'RooCodeSettings'.
|
|
|
- await g.api.setConfiguration({ customCondensingPrompt: customPrompt })
|
|
|
- await sleep(100)
|
|
|
-
|
|
|
- for (let i = 0; i < 5; i++) {
|
|
|
- // @ts-expect-error - Property 'tasks' does not exist on type 'RooCodeAPI'.
|
|
|
- await g.api.tasks.sendMessage({
|
|
|
- taskId: taskId!,
|
|
|
- message: `Message ${i + 2} with custom prompt.`,
|
|
|
- messageType: "user",
|
|
|
- })
|
|
|
- await sleep(2000)
|
|
|
- }
|
|
|
-
|
|
|
- // @ts-expect-error - Property 'tasks' does not exist on type 'RooCodeAPI'.
|
|
|
- const task = await g.api.tasks.getTask(taskId!)
|
|
|
- assert.ok(task, "Task should be retrievable with custom prompt")
|
|
|
- const summaryMessage = task.messages.find((msg: TestTaskMessage) => msg.isSummary === true)
|
|
|
- console.log(
|
|
|
- `Task messages for custom prompt test (taskId: ${taskId}):`,
|
|
|
- JSON.stringify(task.messages, null, 2),
|
|
|
- )
|
|
|
- if (summaryMessage) {
|
|
|
- console.log("Summary content with custom prompt:", summaryMessage.content)
|
|
|
- }
|
|
|
- assert.ok(
|
|
|
- true,
|
|
|
- "Condensation process completed with custom prompt (prompt content verification is complex for e2e).",
|
|
|
- )
|
|
|
- })
|
|
|
- })
|
|
|
-})
|