fix unit test set-up and CI workflow (#3154)

* Fix unit test set-up

* run tests on CI

* update failing tests

* Update node

Update the coverage job node version
This commit is contained in:
Tomás Barreiro 2025-04-29 01:30:40 +02:00 committed by GitHub
parent df7f9fcba4
commit b8e2fd669d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 41 additions and 22 deletions

View File

@ -23,7 +23,7 @@ jobs:
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: 20.15.1
node-version: 22
# Setup Python for coverage script
- name: Setup Python
@ -73,9 +73,8 @@ jobs:
- name: Build Extension
run: npm run compile
# Disabling due to compatability with test framework and ESM modules
# - name: Unit Tests
# run: npm run test:unit
- name: Unit Tests
run: npm run test:unit
# Run extension tests with coverage
- name: Extension Tests with Coverage
@ -132,7 +131,7 @@ jobs:
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: 20.15.1
node-version: 22
# Cache root dependencies - only reuse if package-lock.json exactly matches
- name: Cache root dependencies

View File

@ -1,6 +1,6 @@
{
"extension": ["ts"],
"spec": "src/**/__tests__/*.ts",
"require": ["ts-node/register", "source-map-support/register"],
"require": ["ts-node/register", "source-map-support/register", "./src/test/requires.ts"],
"recursive": true
}

View File

@ -34,24 +34,24 @@ describe("ContextManager", () => {
const messages = createMessages(11)
const result = contextManager.getNextTruncationRange(messages, undefined, "half")
expect(result).to.deep.equal([1, 4])
expect(result).to.deep.equal([2, 5])
})
it("first truncation with quarter keep", () => {
const messages = createMessages(11)
const result = contextManager.getNextTruncationRange(messages, undefined, "quarter")
expect(result).to.deep.equal([1, 6])
expect(result).to.deep.equal([2, 7])
})
it("sequential truncation with half keep", () => {
const messages = createMessages(21)
const firstRange = contextManager.getNextTruncationRange(messages, undefined, "half")
expect(firstRange).to.deep.equal([1, 10])
expect(firstRange).to.deep.equal([2, 9])
// Pass the previous range for sequential truncation
const secondRange = contextManager.getNextTruncationRange(messages, firstRange, "half")
expect(secondRange).to.deep.equal([1, 14])
expect(secondRange).to.deep.equal([2, 13])
})
it("sequential truncation with quarter keep", () => {
@ -60,7 +60,7 @@ describe("ContextManager", () => {
const secondRange = contextManager.getNextTruncationRange(messages, firstRange, "quarter")
expect(secondRange[0]).to.equal(1)
expect(secondRange[0]).to.equal(2)
expect(secondRange[1]).to.be.greaterThan(firstRange[1])
})
@ -68,20 +68,20 @@ describe("ContextManager", () => {
const messages = createMessages(14)
const result = contextManager.getNextTruncationRange(messages, undefined, "half")
// Check if the message at the end of range is a user message
// Check if the message at the end of range is an assistant message
const lastRemovedMessage = messages[result[1]]
expect(lastRemovedMessage.role).to.equal("user")
expect(lastRemovedMessage.role).to.equal("assistant")
// Check if the next message after the range is an assistant message
// Check if the next message after the range is a user message
const nextMessage = messages[result[1] + 1]
expect(nextMessage.role).to.equal("assistant")
expect(nextMessage.role).to.equal("user")
})
it("handles small message arrays", () => {
const messages = createMessages(3)
const result = contextManager.getNextTruncationRange(messages, undefined, "half")
expect(result).to.deep.equal([1, 0])
expect(result).to.deep.equal([2, 1])
})
it("preserves the message structure when truncating", () => {
@ -120,9 +120,10 @@ describe("ContextManager", () => {
const range: [number, number] = [1, 3]
const result = contextManager.getTruncatedMessages(messages, range)
expect(result).to.have.lengthOf(2)
expect(result).to.have.lengthOf(3)
expect(result[0]).to.deep.equal(messages[0])
expect(result[1]).to.deep.equal(messages[4])
expect(result[1]).to.deep.equal(messages[1])
expect(result[2]).to.deep.equal(messages[4])
})
it("works with a range that starts at the first message after task", () => {
@ -131,20 +132,21 @@ describe("ContextManager", () => {
const range: [number, number] = [1, 2]
const result = contextManager.getTruncatedMessages(messages, range)
expect(result).to.have.lengthOf(2)
expect(result).to.have.lengthOf(3)
expect(result[0]).to.deep.equal(messages[0])
expect(result[1]).to.deep.equal(messages[3])
expect(result[1]).to.deep.equal(messages[1])
expect(result[2]).to.deep.equal(messages[3])
})
it("correctly handles removing a range while preserving alternation pattern", () => {
const messages = createMessages(5)
const range: [number, number] = [1, 2]
const range: [number, number] = [2, 3]
const result = contextManager.getTruncatedMessages(messages, range)
expect(result).to.have.lengthOf(3)
expect(result[0]).to.deep.equal(messages[0])
expect(result[1]).to.deep.equal(messages[3])
expect(result[1]).to.deep.equal(messages[1])
expect(result[2]).to.deep.equal(messages[4])
expect(result[0].role).to.equal("user")

17
src/test/requires.ts Normal file
View File

@ -0,0 +1,17 @@
const Module = require("module")
const originalRequire = Module.prototype.require
/**
* VSCode is not available during unit tests
* @see {@link file://./vscode-mock.ts}
*/
Module.prototype.require = function (path: string) {
if (path === "vscode") {
return require("./vscode-mock")
}
return originalRequire.call(this, path)
}
// Required to have access to String.prototype.toPosix
import "../utils/path"

1
src/test/vscode-mock.ts Normal file
View File

@ -0,0 +1 @@
export {}