From d35e09f1fc77372932458547cf28fa701b1950e2 Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Fri, 15 May 2026 04:19:39 +0530 Subject: [PATCH] test(workspace): use runtime flags in workspace tests (#27612) --- .../test/control-plane/workspace.test.ts | 4 --- packages/opencode/test/fixture/workspace.ts | 28 +++++++++++++++++++ .../test/plugin/workspace-adapter.test.ts | 11 +------- .../server/httpapi-instance-context.test.ts | 12 ++------ .../httpapi-promptasync-context.test.ts | 12 ++------ .../server/httpapi-workspace-routing.test.ts | 12 ++------ 6 files changed, 35 insertions(+), 44 deletions(-) create mode 100644 packages/opencode/test/fixture/workspace.ts diff --git a/packages/opencode/test/control-plane/workspace.test.ts b/packages/opencode/test/control-plane/workspace.test.ts index 1c8156ae65..6535428ce2 100644 --- a/packages/opencode/test/control-plane/workspace.test.ts +++ b/packages/opencode/test/control-plane/workspace.test.ts @@ -10,7 +10,6 @@ import { FetchHttpClient, HttpServer, HttpServerRequest, HttpServerResponse } fr import { eq } from "drizzle-orm" import { AppFileSystem } from "@opencode-ai/core/filesystem" import * as Log from "@opencode-ai/core/util/log" -import { Flag } from "@opencode-ai/core/flag/flag" import { GlobalBus, type GlobalEvent } from "@/bus/global" import { Database } from "@/storage/db" import { ProjectID } from "@/project/schema" @@ -42,7 +41,6 @@ import { RuntimeFlags } from "@/effect/runtime-flags" void Log.init({ print: false }) -const originalWorkspacesFlag = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES const originalEnv = { OPENCODE_AUTH_CONTENT: process.env.OPENCODE_AUTH_CONTENT, OPENCODE_EXPERIMENTAL_WORKSPACES: process.env.OPENCODE_EXPERIMENTAL_WORKSPACES, @@ -113,7 +111,6 @@ function restoreEnv() { beforeEach(() => { Database.close() - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true restoreEnv() process.env.OPENCODE_EXPERIMENTAL_WORKSPACES = "true" }) @@ -121,7 +118,6 @@ beforeEach(() => { afterEach(async () => { mock.restore() await disposeAllInstances() - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspacesFlag restoreEnv() await resetDatabase() }) diff --git a/packages/opencode/test/fixture/workspace.ts b/packages/opencode/test/fixture/workspace.ts new file mode 100644 index 0000000000..9c201d3982 --- /dev/null +++ b/packages/opencode/test/fixture/workspace.ts @@ -0,0 +1,28 @@ +import { FetchHttpClient } from "effect/unstable/http" +import { Layer } from "effect" +import { AppFileSystem } from "@opencode-ai/core/filesystem" +import { Auth } from "../../src/auth" +import { Workspace } from "../../src/control-plane/workspace" +import { RuntimeFlags } from "../../src/effect/runtime-flags" +import { InstanceBootstrap } from "../../src/project/bootstrap" +import { InstanceStore } from "../../src/project/instance-store" +import { Project } from "../../src/project/project" +import { Vcs } from "../../src/project/vcs" +import { Session } from "../../src/session/session" +import { SessionPrompt } from "../../src/session/prompt" +import { SyncEvent } from "../../src/sync" + +export const workspaceLayerWithRuntimeFlags = (overrides: Partial) => + Workspace.layer.pipe( + Layer.provide(Auth.defaultLayer), + Layer.provide(Session.defaultLayer), + Layer.provide(SyncEvent.defaultLayer), + Layer.provide(SessionPrompt.defaultLayer), + Layer.provide(Project.defaultLayer), + Layer.provide(Vcs.defaultLayer), + Layer.provide(FetchHttpClient.layer), + Layer.provide(AppFileSystem.defaultLayer), + Layer.provide(RuntimeFlags.layer(overrides)), + Layer.provide(InstanceStore.defaultLayer), + Layer.provide(InstanceBootstrap.defaultLayer), + ) diff --git a/packages/opencode/test/plugin/workspace-adapter.test.ts b/packages/opencode/test/plugin/workspace-adapter.test.ts index 31cdf45bff..41dbf53445 100644 --- a/packages/opencode/test/plugin/workspace-adapter.test.ts +++ b/packages/opencode/test/plugin/workspace-adapter.test.ts @@ -1,10 +1,9 @@ -import { afterAll, afterEach, describe, expect } from "bun:test" +import { afterEach, describe, expect } from "bun:test" import { Effect, Layer, Option } from "effect" import { FetchHttpClient } from "effect/unstable/http" import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner" import { AppFileSystem } from "@opencode-ai/core/filesystem" import { EffectFlock } from "@opencode-ai/core/util/effect-flock" -import { Flag } from "@opencode-ai/core/flag/flag" import path from "path" import { pathToFileURL } from "url" import { Account } from "../../src/account/account" @@ -62,18 +61,10 @@ const workspaceLayer = Workspace.layer.pipe( ) const it = testEffect(Layer.mergeAll(pluginLayer, workspaceLayer, CrossSpawnSpawner.defaultLayer)) -const experimental = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES - -Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true - afterEach(async () => { await disposeAllInstances() }) -afterAll(() => { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = experimental -}) - describe("plugin.workspace", () => { it.live("plugin can install a workspace adapter", () => provideTmpdirInstance((dir) => diff --git a/packages/opencode/test/server/httpapi-instance-context.test.ts b/packages/opencode/test/server/httpapi-instance-context.test.ts index 1b72f34775..24a989f7cf 100644 --- a/packages/opencode/test/server/httpapi-instance-context.test.ts +++ b/packages/opencode/test/server/httpapi-instance-context.test.ts @@ -1,5 +1,4 @@ import { NodeHttpServer, NodeServices } from "@effect/platform-node" -import { Flag } from "@opencode-ai/core/flag/flag" import { describe, expect } from "bun:test" import { Effect, Fiber, Layer } from "effect" import { HttpClient, HttpClientRequest, HttpRouter, HttpServerResponse } from "effect/unstable/http" @@ -11,10 +10,8 @@ import { WorkspaceID } from "../../src/control-plane/schema" import type { WorkspaceAdapter } from "../../src/control-plane/types" import { Workspace } from "../../src/control-plane/workspace" import { InstanceRef, WorkspaceRef } from "../../src/effect/instance-ref" -import { InstanceBootstrap } from "../../src/project/bootstrap" import { Instance } from "../../src/project/instance" import { InstanceLayer } from "../../src/project/instance-layer" -import { InstanceStore } from "../../src/project/instance-store" import { Project } from "../../src/project/project" import { disposeMiddleware, markInstanceForDisposal } from "../../src/server/routes/instance/httpapi/lifecycle" import { instanceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/instance-context" @@ -22,17 +19,15 @@ import { workspaceRouterMiddleware } from "../../src/server/routes/instance/http import { resetDatabase } from "../fixture/db" import { disposeAllInstances, tmpdirScoped } from "../fixture/fixture" import { withFixedWorkspaceID } from "../fixture/flag" +import { workspaceLayerWithRuntimeFlags } from "../fixture/workspace" import { waitGlobalBusEvent } from "./global-bus" import { testEffect } from "../lib/effect" const testStateLayer = Layer.effectDiscard( Effect.gen(function* () { - const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES yield* Effect.promise(() => resetDatabase()) - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true yield* Effect.addFinalizer(() => Effect.promise(async () => { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces await disposeAllInstances() await resetDatabase() }), @@ -40,10 +35,7 @@ const testStateLayer = Layer.effectDiscard( }), ) -const workspaceLayer = Workspace.defaultLayer.pipe( - Layer.provide(InstanceStore.defaultLayer), - Layer.provide(InstanceBootstrap.defaultLayer), -) +const workspaceLayer = workspaceLayerWithRuntimeFlags({ experimentalWorkspaces: true }) const it = testEffect( Layer.mergeAll( diff --git a/packages/opencode/test/server/httpapi-promptasync-context.test.ts b/packages/opencode/test/server/httpapi-promptasync-context.test.ts index a7a66ff4f6..84f3df5b8c 100644 --- a/packages/opencode/test/server/httpapi-promptasync-context.test.ts +++ b/packages/opencode/test/server/httpapi-promptasync-context.test.ts @@ -8,7 +8,6 @@ // Effect.provideService calls there are required, not defensive duplication. import { NodeHttpServer, NodeServices } from "@effect/platform-node" -import { Flag } from "@opencode-ai/core/flag/flag" import { describe, expect } from "bun:test" import { Deferred, Effect, Layer, Scope } from "effect" import * as Stream from "effect/Stream" @@ -19,24 +18,20 @@ import { registerAdapter } from "../../src/control-plane/adapters" import type { WorkspaceAdapter } from "../../src/control-plane/types" import { Workspace } from "../../src/control-plane/workspace" import { InstanceRef, WorkspaceRef } from "../../src/effect/instance-ref" -import { InstanceBootstrap } from "../../src/project/bootstrap" import { InstanceLayer } from "../../src/project/instance-layer" -import { InstanceStore } from "../../src/project/instance-store" import { Project } from "../../src/project/project" import { instanceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/instance-context" import { workspaceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/workspace-routing" import { resetDatabase } from "../fixture/db" import { disposeAllInstances, tmpdirScoped } from "../fixture/fixture" +import { workspaceLayerWithRuntimeFlags } from "../fixture/workspace" import { testEffect } from "../lib/effect" const testStateLayer = Layer.effectDiscard( Effect.gen(function* () { - const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES yield* Effect.promise(() => resetDatabase()) - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true yield* Effect.addFinalizer(() => Effect.promise(async () => { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces await disposeAllInstances() await resetDatabase() }), @@ -44,10 +39,7 @@ const testStateLayer = Layer.effectDiscard( }), ) -const workspaceLayer = Workspace.defaultLayer.pipe( - Layer.provide(InstanceStore.defaultLayer), - Layer.provide(InstanceBootstrap.defaultLayer), -) +const workspaceLayer = workspaceLayerWithRuntimeFlags({ experimentalWorkspaces: true }) const it = testEffect( Layer.mergeAll( diff --git a/packages/opencode/test/server/httpapi-workspace-routing.test.ts b/packages/opencode/test/server/httpapi-workspace-routing.test.ts index a62ca1db74..9d6dc8c3e3 100644 --- a/packages/opencode/test/server/httpapi-workspace-routing.test.ts +++ b/packages/opencode/test/server/httpapi-workspace-routing.test.ts @@ -1,5 +1,4 @@ import { NodeHttpServer, NodeServices } from "@effect/platform-node" -import { Flag } from "@opencode-ai/core/flag/flag" import { describe, expect } from "bun:test" import { Context, Effect, Layer, Queue, Ref } from "effect" import { @@ -20,8 +19,6 @@ import { WorkspaceID } from "../../src/control-plane/schema" import type { WorkspaceAdapter } from "../../src/control-plane/types" import { Workspace } from "../../src/control-plane/workspace" import { WorkspaceTable } from "../../src/control-plane/workspace.sql" -import { InstanceBootstrap } from "../../src/project/bootstrap" -import { InstanceStore } from "../../src/project/instance-store" import { Project } from "../../src/project/project" import { WorkspacePaths } from "../../src/server/routes/instance/httpapi/groups/workspace" import { @@ -31,27 +28,22 @@ import { import { HEADER as FenceHeader } from "../../src/server/shared/fence" import { Database } from "../../src/storage/db" import { resetDatabase } from "../fixture/db" +import { workspaceLayerWithRuntimeFlags } from "../fixture/workspace" import { tmpdirScoped } from "../fixture/fixture" import { testEffect } from "../lib/effect" const testStateLayer = Layer.effectDiscard( Effect.gen(function* () { - const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES yield* Effect.promise(() => resetDatabase()) - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true yield* Effect.addFinalizer(() => Effect.promise(async () => { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces await resetDatabase() }), ) }), ) -const workspaceLayer = Workspace.defaultLayer.pipe( - Layer.provide(InstanceStore.defaultLayer), - Layer.provide(InstanceBootstrap.defaultLayer), -) +const workspaceLayer = workspaceLayerWithRuntimeFlags({ experimentalWorkspaces: true }) const it = testEffect( Layer.mergeAll(