mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-08-28 05:27:24 +00:00
162 lines
4 KiB
Markdown
162 lines
4 KiB
Markdown
# VSCode Integration Tests
|
|
|
|
This document describes the integration test setup for the Roo Code VSCode extension.
|
|
|
|
## Overview
|
|
|
|
The integration tests use the `@vscode/test-electron` package to run tests in a real VSCode environment. These tests verify that the extension works correctly within VSCode, including features like mode switching, webview interactions, and API communication.
|
|
|
|
## Test Setup
|
|
|
|
### Directory Structure
|
|
|
|
```
|
|
e2e/src/
|
|
├── runTest.ts # Main test runner
|
|
├── suite/
|
|
│ ├── index.ts # Test suite configuration
|
|
│ ├── modes.test.ts # Mode switching tests
|
|
│ ├── tasks.test.ts # Task execution tests
|
|
│ └── extension.test.ts # Extension activation tests
|
|
```
|
|
|
|
### Test Runner Configuration
|
|
|
|
The test runner (`runTest.ts`) is responsible for:
|
|
|
|
- Setting up the extension development path
|
|
- Configuring the test environment
|
|
- Running the integration tests using `@vscode/test-electron`
|
|
|
|
### Environment Setup
|
|
|
|
1. Create a `.env.local` file in the root directory with required environment variables:
|
|
|
|
```
|
|
OPENROUTER_API_KEY=sk-or-v1-...
|
|
```
|
|
|
|
2. The test suite (`suite/index.ts`) configures:
|
|
|
|
- Mocha test framework with TDD interface
|
|
- 10-minute timeout for LLM communication
|
|
- Global extension API access
|
|
- WebView panel setup
|
|
- OpenRouter API configuration
|
|
|
|
## Test Suite Structure
|
|
|
|
Tests are organized using Mocha's TDD interface (`suite` and `test` functions). The main test files are:
|
|
|
|
- `modes.test.ts`: Tests mode switching functionality
|
|
- `tasks.test.ts`: Tests task execution
|
|
- `extension.test.ts`: Tests extension activation
|
|
|
|
### Global Objects
|
|
|
|
The following global objects are available in tests:
|
|
|
|
```typescript
|
|
declare global {
|
|
var api: RooCodeAPI
|
|
var provider: ClineProvider
|
|
var extension: vscode.Extension<RooCodeAPI>
|
|
var panel: vscode.WebviewPanel
|
|
}
|
|
```
|
|
|
|
## Running Tests
|
|
|
|
1. Ensure you have the required environment variables set in `.env.local`
|
|
|
|
2. Run the integration tests:
|
|
|
|
```bash
|
|
npm run test:integration
|
|
```
|
|
|
|
3. If you want to run a specific test, you can use the `test.only` function in the test file. This will run only the test you specify and ignore the others. Be sure to remove the `test.only` function before committing your changes.
|
|
|
|
The tests will:
|
|
|
|
- Download and launch a clean VSCode instance
|
|
- Install the extension
|
|
- Execute the test suite
|
|
- Report results
|
|
|
|
## Writing New Tests
|
|
|
|
When writing new integration tests:
|
|
|
|
1. Create a new test file in `src/test/suite/` with the `.test.ts` extension
|
|
|
|
2. Structure your tests using the TDD interface:
|
|
|
|
```typescript
|
|
import * as assert from "assert"
|
|
import * as vscode from "vscode"
|
|
|
|
suite("Your Test Suite Name", () => {
|
|
test("Should do something specific", async function () {
|
|
// Your test code here
|
|
})
|
|
})
|
|
```
|
|
|
|
3. Use the global objects (`api`, `provider`, `extension`, `panel`) to interact with the extension
|
|
|
|
### Best Practices
|
|
|
|
1. **Timeouts**: Use appropriate timeouts for async operations:
|
|
|
|
```typescript
|
|
const timeout = 30000
|
|
const interval = 1000
|
|
```
|
|
|
|
2. **State Management**: Reset extension state before/after tests:
|
|
|
|
```typescript
|
|
await globalThis.api.setConfiguration({
|
|
mode: "Ask",
|
|
alwaysAllowModeSwitch: true,
|
|
})
|
|
```
|
|
|
|
3. **Assertions**: Use clear assertions with meaningful messages:
|
|
|
|
```typescript
|
|
assert.ok(condition, "Descriptive message about what failed")
|
|
```
|
|
|
|
4. **Error Handling**: Wrap test code in try/catch blocks and clean up resources:
|
|
|
|
```typescript
|
|
try {
|
|
// Test code
|
|
} finally {
|
|
// Cleanup code
|
|
}
|
|
```
|
|
|
|
5. **Wait for Operations**: Use polling when waiting for async operations:
|
|
|
|
```typescript
|
|
let startTime = Date.now()
|
|
|
|
while (Date.now() - startTime < timeout) {
|
|
if (condition) {
|
|
break
|
|
}
|
|
|
|
await new Promise((resolve) => setTimeout(resolve, interval))
|
|
}
|
|
```
|
|
|
|
6. **Grading**: When grading tests, use the `Grade:` format to ensure the test is graded correctly (See modes.test.ts for an example).
|
|
|
|
```typescript
|
|
await globalThis.api.startNewTask(
|
|
`Given this prompt: ${testPrompt} grade the response from 1 to 10 in the format of "Grade: (1-10)": ${output} \n Be sure to say 'I AM DONE GRADING' after the task is complete`,
|
|
)
|
|
```
|