test(project): stabilize VCS branch update test (#26979)

This commit is contained in:
Kit Langton
2026-05-11 22:12:07 -04:00
committed by GitHub
parent ce72020750
commit 0f5d4ae648

View File

@@ -1,7 +1,7 @@
import { afterEach, describe, expect } from "bun:test" import { afterEach, describe, expect } from "bun:test"
import { AppFileSystem } from "@opencode-ai/core/filesystem" import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { parsePatch } from "diff" import { parsePatch } from "diff"
import { Deferred, Effect, Layer, Stream } from "effect" import { Deferred, Effect, Layer } from "effect"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner" import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import fs from "fs/promises" import fs from "fs/promises"
import path from "path" import path from "path"
@@ -50,13 +50,26 @@ const nextBranchUpdate = Effect.fn("VcsTest.nextBranchUpdate")(function* () {
const bus = yield* Bus.Service const bus = yield* Bus.Service
const updated = yield* Deferred.make<string | undefined>() const updated = yield* Deferred.make<string | undefined>()
yield* Stream.runForEach(bus.subscribe(Vcs.Event.BranchUpdated), (evt) => const off = yield* bus.subscribeCallback(Vcs.Event.BranchUpdated, (evt) => {
Deferred.succeed(updated, evt.properties.branch), Effect.runSync(Deferred.succeed(updated, evt.properties.branch))
).pipe(Effect.forkScoped) })
yield* Effect.addFinalizer(() => Effect.sync(off))
return updated return updated
}) })
const publishHeadChangeUntil = Effect.fn("VcsTest.publishHeadChangeUntil")(function* (
pending: Deferred.Deferred<string | undefined>,
head: string,
) {
const bus = yield* Bus.Service
for (let i = 0; i < 50; i++) {
yield* bus.publish(FileWatcher.Event.Updated, { file: head, event: "change" })
if (yield* Deferred.isDone(pending)) return
yield* Effect.sleep("10 millis")
}
})
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Tests // Tests
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@@ -99,11 +112,10 @@ describe("Vcs", () => {
const vcs = yield* init() const vcs = yield* init()
yield* vcs.branch() yield* vcs.branch()
const pending = yield* nextBranchUpdate() const pending = yield* nextBranchUpdate()
const bus = yield* Bus.Service
const head = path.join(test.directory, ".git", "HEAD") const head = path.join(test.directory, ".git", "HEAD")
yield* write(head, `ref: refs/heads/${branch}\n`) yield* write(head, `ref: refs/heads/${branch}\n`)
yield* bus.publish(FileWatcher.Event.Updated, { file: head, event: "change" }) yield* publishHeadChangeUntil(pending, head)
const updated = yield* Deferred.await(pending).pipe(Effect.timeout("2 seconds")) const updated = yield* Deferred.await(pending).pipe(Effect.timeout("2 seconds"))
expect(updated).toBe(branch) expect(updated).toBe(branch)
@@ -122,11 +134,10 @@ describe("Vcs", () => {
const vcs = yield* init() const vcs = yield* init()
yield* vcs.branch() yield* vcs.branch()
const pending = yield* nextBranchUpdate() const pending = yield* nextBranchUpdate()
const bus = yield* Bus.Service
const head = path.join(test.directory, ".git", "HEAD") const head = path.join(test.directory, ".git", "HEAD")
yield* write(head, `ref: refs/heads/${branch}\n`) yield* write(head, `ref: refs/heads/${branch}\n`)
yield* bus.publish(FileWatcher.Event.Updated, { file: head, event: "change" }) yield* publishHeadChangeUntil(pending, head)
yield* Deferred.await(pending).pipe(Effect.timeout("2 seconds")) yield* Deferred.await(pending).pipe(Effect.timeout("2 seconds"))
const current = yield* vcs.branch() const current = yield* vcs.branch()