From 57784576e410c85989f31451d94e0368d4ee53cd Mon Sep 17 00:00:00 2001 From: Lukas May Date: Sat, 7 Mar 2026 01:07:43 +0100 Subject: [PATCH] perf: speed up slow git tests from ~18s to ~5.5s MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - branch-manager: beforeEach→beforeAll (all 12 tests are read-only) - worktree manager: clone template repo per test instead of full init - signal-manager: reduce setTimeout delay from 100ms to 30ms --- .../agent/lifecycle/signal-manager.test.ts | 2 +- apps/server/git/manager.test.ts | 26 ++++++++++++++++--- .../git/simple-git-branch-manager.test.ts | 10 +++---- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/apps/server/agent/lifecycle/signal-manager.test.ts b/apps/server/agent/lifecycle/signal-manager.test.ts index d9c3217..616a80d 100644 --- a/apps/server/agent/lifecycle/signal-manager.test.ts +++ b/apps/server/agent/lifecycle/signal-manager.test.ts @@ -133,7 +133,7 @@ describe('FileSystemSignalManager', () => { // Write signal after a delay setTimeout(async () => { await writeFile(signalPath, JSON.stringify(expectedSignal)); - }, 100); + }, 30); const signal = await signalManager.waitForSignal(agentWorkdir, 1000); expect(signal).toEqual(expectedSignal); diff --git a/apps/server/git/manager.test.ts b/apps/server/git/manager.test.ts index 017daeb..a040314 100644 --- a/apps/server/git/manager.test.ts +++ b/apps/server/git/manager.test.ts @@ -5,7 +5,7 @@ * Uses temporary git repositories for each test. */ -import { describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { describe, it, expect, beforeEach, afterEach, beforeAll, afterAll } from 'vitest'; import { mkdtemp, rm, writeFile, mkdir } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import path from 'node:path'; @@ -48,16 +48,34 @@ async function createTestRepo(): Promise<{ } describe('SimpleGitWorktreeManager', () => { + let templatePath: string; + let templateCleanup: () => Promise; let repoPath: string; let cleanup: () => Promise; let manager: SimpleGitWorktreeManager; let eventBus: EventBus; let emittedEvents: Array<{ type: string; payload: unknown }>; - beforeEach(async () => { + beforeAll(async () => { const testRepo = await createTestRepo(); - repoPath = testRepo.repoPath; - cleanup = testRepo.cleanup; + templatePath = testRepo.repoPath; + templateCleanup = testRepo.cleanup; + }); + + afterAll(async () => { + await templateCleanup(); + }); + + beforeEach(async () => { + // Clone the template repo locally (hard-links, ~10ms vs ~50ms full init) + repoPath = await mkdtemp(path.join(tmpdir(), 'cw-test-repo-')); + await rm(repoPath, { recursive: true, force: true }); + const git = simpleGit(); + await git.clone(templatePath, repoPath, ['--local']); + + cleanup = async () => { + await rm(repoPath, { recursive: true, force: true }); + }; // Create event bus and track emitted events eventBus = new EventEmitterBus(); diff --git a/apps/server/git/simple-git-branch-manager.test.ts b/apps/server/git/simple-git-branch-manager.test.ts index f59c65b..3b3b4d3 100644 --- a/apps/server/git/simple-git-branch-manager.test.ts +++ b/apps/server/git/simple-git-branch-manager.test.ts @@ -5,7 +5,7 @@ * a project's default branch. */ -import { describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { describe, it, expect, beforeEach, afterEach, beforeAll, afterAll } from 'vitest'; import { mkdtemp, rm, writeFile } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import path from 'node:path'; @@ -133,14 +133,14 @@ describe('SimpleGitBranchManager', () => { let cleanup: () => Promise; let branchManager: SimpleGitBranchManager; - beforeEach(async () => { + beforeAll(async () => { const setup = await createTestRepoWithRemote(); clonePath = setup.clonePath; cleanup = setup.cleanup; branchManager = new SimpleGitBranchManager(); }); - afterEach(async () => { + afterAll(async () => { await cleanup(); }); @@ -177,14 +177,14 @@ describe('SimpleGitBranchManager - diffBranchesStat and diffFileSingle', () => { let cleanup: () => Promise; let branchManager: SimpleGitBranchManager; - beforeEach(async () => { + beforeAll(async () => { const setup = await createTestRepoForDiff(); clonePath = setup.clonePath; cleanup = setup.cleanup; branchManager = new SimpleGitBranchManager(); }); - afterEach(async () => { + afterAll(async () => { await cleanup(); });