test(workspace): use runtime flags in workspace tests (#27612)
This commit is contained in:
@@ -10,7 +10,6 @@ import { FetchHttpClient, HttpServer, HttpServerRequest, HttpServerResponse } fr
|
|||||||
import { eq } from "drizzle-orm"
|
import { eq } from "drizzle-orm"
|
||||||
import { AppFileSystem } from "@opencode-ai/core/filesystem"
|
import { AppFileSystem } from "@opencode-ai/core/filesystem"
|
||||||
import * as Log from "@opencode-ai/core/util/log"
|
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 { GlobalBus, type GlobalEvent } from "@/bus/global"
|
||||||
import { Database } from "@/storage/db"
|
import { Database } from "@/storage/db"
|
||||||
import { ProjectID } from "@/project/schema"
|
import { ProjectID } from "@/project/schema"
|
||||||
@@ -42,7 +41,6 @@ import { RuntimeFlags } from "@/effect/runtime-flags"
|
|||||||
|
|
||||||
void Log.init({ print: false })
|
void Log.init({ print: false })
|
||||||
|
|
||||||
const originalWorkspacesFlag = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES
|
|
||||||
const originalEnv = {
|
const originalEnv = {
|
||||||
OPENCODE_AUTH_CONTENT: process.env.OPENCODE_AUTH_CONTENT,
|
OPENCODE_AUTH_CONTENT: process.env.OPENCODE_AUTH_CONTENT,
|
||||||
OPENCODE_EXPERIMENTAL_WORKSPACES: process.env.OPENCODE_EXPERIMENTAL_WORKSPACES,
|
OPENCODE_EXPERIMENTAL_WORKSPACES: process.env.OPENCODE_EXPERIMENTAL_WORKSPACES,
|
||||||
@@ -113,7 +111,6 @@ function restoreEnv() {
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
Database.close()
|
Database.close()
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true
|
|
||||||
restoreEnv()
|
restoreEnv()
|
||||||
process.env.OPENCODE_EXPERIMENTAL_WORKSPACES = "true"
|
process.env.OPENCODE_EXPERIMENTAL_WORKSPACES = "true"
|
||||||
})
|
})
|
||||||
@@ -121,7 +118,6 @@ beforeEach(() => {
|
|||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
mock.restore()
|
mock.restore()
|
||||||
await disposeAllInstances()
|
await disposeAllInstances()
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspacesFlag
|
|
||||||
restoreEnv()
|
restoreEnv()
|
||||||
await resetDatabase()
|
await resetDatabase()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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<RuntimeFlags.Info>) =>
|
||||||
|
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),
|
||||||
|
)
|
||||||
@@ -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 { Effect, Layer, Option } from "effect"
|
||||||
import { FetchHttpClient } from "effect/unstable/http"
|
import { FetchHttpClient } from "effect/unstable/http"
|
||||||
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
|
||||||
import { AppFileSystem } from "@opencode-ai/core/filesystem"
|
import { AppFileSystem } from "@opencode-ai/core/filesystem"
|
||||||
import { EffectFlock } from "@opencode-ai/core/util/effect-flock"
|
import { EffectFlock } from "@opencode-ai/core/util/effect-flock"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
||||||
import path from "path"
|
import path from "path"
|
||||||
import { pathToFileURL } from "url"
|
import { pathToFileURL } from "url"
|
||||||
import { Account } from "../../src/account/account"
|
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 it = testEffect(Layer.mergeAll(pluginLayer, workspaceLayer, CrossSpawnSpawner.defaultLayer))
|
||||||
|
|
||||||
const experimental = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES
|
|
||||||
|
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true
|
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
await disposeAllInstances()
|
await disposeAllInstances()
|
||||||
})
|
})
|
||||||
|
|
||||||
afterAll(() => {
|
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = experimental
|
|
||||||
})
|
|
||||||
|
|
||||||
describe("plugin.workspace", () => {
|
describe("plugin.workspace", () => {
|
||||||
it.live("plugin can install a workspace adapter", () =>
|
it.live("plugin can install a workspace adapter", () =>
|
||||||
provideTmpdirInstance((dir) =>
|
provideTmpdirInstance((dir) =>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { NodeHttpServer, NodeServices } from "@effect/platform-node"
|
import { NodeHttpServer, NodeServices } from "@effect/platform-node"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
||||||
import { describe, expect } from "bun:test"
|
import { describe, expect } from "bun:test"
|
||||||
import { Effect, Fiber, Layer } from "effect"
|
import { Effect, Fiber, Layer } from "effect"
|
||||||
import { HttpClient, HttpClientRequest, HttpRouter, HttpServerResponse } from "effect/unstable/http"
|
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 type { WorkspaceAdapter } from "../../src/control-plane/types"
|
||||||
import { Workspace } from "../../src/control-plane/workspace"
|
import { Workspace } from "../../src/control-plane/workspace"
|
||||||
import { InstanceRef, WorkspaceRef } from "../../src/effect/instance-ref"
|
import { InstanceRef, WorkspaceRef } from "../../src/effect/instance-ref"
|
||||||
import { InstanceBootstrap } from "../../src/project/bootstrap"
|
|
||||||
import { Instance } from "../../src/project/instance"
|
import { Instance } from "../../src/project/instance"
|
||||||
import { InstanceLayer } from "../../src/project/instance-layer"
|
import { InstanceLayer } from "../../src/project/instance-layer"
|
||||||
import { InstanceStore } from "../../src/project/instance-store"
|
|
||||||
import { Project } from "../../src/project/project"
|
import { Project } from "../../src/project/project"
|
||||||
import { disposeMiddleware, markInstanceForDisposal } from "../../src/server/routes/instance/httpapi/lifecycle"
|
import { disposeMiddleware, markInstanceForDisposal } from "../../src/server/routes/instance/httpapi/lifecycle"
|
||||||
import { instanceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/instance-context"
|
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 { resetDatabase } from "../fixture/db"
|
||||||
import { disposeAllInstances, tmpdirScoped } from "../fixture/fixture"
|
import { disposeAllInstances, tmpdirScoped } from "../fixture/fixture"
|
||||||
import { withFixedWorkspaceID } from "../fixture/flag"
|
import { withFixedWorkspaceID } from "../fixture/flag"
|
||||||
|
import { workspaceLayerWithRuntimeFlags } from "../fixture/workspace"
|
||||||
import { waitGlobalBusEvent } from "./global-bus"
|
import { waitGlobalBusEvent } from "./global-bus"
|
||||||
import { testEffect } from "../lib/effect"
|
import { testEffect } from "../lib/effect"
|
||||||
|
|
||||||
const testStateLayer = Layer.effectDiscard(
|
const testStateLayer = Layer.effectDiscard(
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES
|
|
||||||
yield* Effect.promise(() => resetDatabase())
|
yield* Effect.promise(() => resetDatabase())
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true
|
|
||||||
yield* Effect.addFinalizer(() =>
|
yield* Effect.addFinalizer(() =>
|
||||||
Effect.promise(async () => {
|
Effect.promise(async () => {
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces
|
|
||||||
await disposeAllInstances()
|
await disposeAllInstances()
|
||||||
await resetDatabase()
|
await resetDatabase()
|
||||||
}),
|
}),
|
||||||
@@ -40,10 +35,7 @@ const testStateLayer = Layer.effectDiscard(
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
const workspaceLayer = Workspace.defaultLayer.pipe(
|
const workspaceLayer = workspaceLayerWithRuntimeFlags({ experimentalWorkspaces: true })
|
||||||
Layer.provide(InstanceStore.defaultLayer),
|
|
||||||
Layer.provide(InstanceBootstrap.defaultLayer),
|
|
||||||
)
|
|
||||||
|
|
||||||
const it = testEffect(
|
const it = testEffect(
|
||||||
Layer.mergeAll(
|
Layer.mergeAll(
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
// Effect.provideService calls there are required, not defensive duplication.
|
// Effect.provideService calls there are required, not defensive duplication.
|
||||||
|
|
||||||
import { NodeHttpServer, NodeServices } from "@effect/platform-node"
|
import { NodeHttpServer, NodeServices } from "@effect/platform-node"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
||||||
import { describe, expect } from "bun:test"
|
import { describe, expect } from "bun:test"
|
||||||
import { Deferred, Effect, Layer, Scope } from "effect"
|
import { Deferred, Effect, Layer, Scope } from "effect"
|
||||||
import * as Stream from "effect/Stream"
|
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 type { WorkspaceAdapter } from "../../src/control-plane/types"
|
||||||
import { Workspace } from "../../src/control-plane/workspace"
|
import { Workspace } from "../../src/control-plane/workspace"
|
||||||
import { InstanceRef, WorkspaceRef } from "../../src/effect/instance-ref"
|
import { InstanceRef, WorkspaceRef } from "../../src/effect/instance-ref"
|
||||||
import { InstanceBootstrap } from "../../src/project/bootstrap"
|
|
||||||
import { InstanceLayer } from "../../src/project/instance-layer"
|
import { InstanceLayer } from "../../src/project/instance-layer"
|
||||||
import { InstanceStore } from "../../src/project/instance-store"
|
|
||||||
import { Project } from "../../src/project/project"
|
import { Project } from "../../src/project/project"
|
||||||
import { instanceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/instance-context"
|
import { instanceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/instance-context"
|
||||||
import { workspaceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/workspace-routing"
|
import { workspaceRouterMiddleware } from "../../src/server/routes/instance/httpapi/middleware/workspace-routing"
|
||||||
import { resetDatabase } from "../fixture/db"
|
import { resetDatabase } from "../fixture/db"
|
||||||
import { disposeAllInstances, tmpdirScoped } from "../fixture/fixture"
|
import { disposeAllInstances, tmpdirScoped } from "../fixture/fixture"
|
||||||
|
import { workspaceLayerWithRuntimeFlags } from "../fixture/workspace"
|
||||||
import { testEffect } from "../lib/effect"
|
import { testEffect } from "../lib/effect"
|
||||||
|
|
||||||
const testStateLayer = Layer.effectDiscard(
|
const testStateLayer = Layer.effectDiscard(
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES
|
|
||||||
yield* Effect.promise(() => resetDatabase())
|
yield* Effect.promise(() => resetDatabase())
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true
|
|
||||||
yield* Effect.addFinalizer(() =>
|
yield* Effect.addFinalizer(() =>
|
||||||
Effect.promise(async () => {
|
Effect.promise(async () => {
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces
|
|
||||||
await disposeAllInstances()
|
await disposeAllInstances()
|
||||||
await resetDatabase()
|
await resetDatabase()
|
||||||
}),
|
}),
|
||||||
@@ -44,10 +39,7 @@ const testStateLayer = Layer.effectDiscard(
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
const workspaceLayer = Workspace.defaultLayer.pipe(
|
const workspaceLayer = workspaceLayerWithRuntimeFlags({ experimentalWorkspaces: true })
|
||||||
Layer.provide(InstanceStore.defaultLayer),
|
|
||||||
Layer.provide(InstanceBootstrap.defaultLayer),
|
|
||||||
)
|
|
||||||
|
|
||||||
const it = testEffect(
|
const it = testEffect(
|
||||||
Layer.mergeAll(
|
Layer.mergeAll(
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { NodeHttpServer, NodeServices } from "@effect/platform-node"
|
import { NodeHttpServer, NodeServices } from "@effect/platform-node"
|
||||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
||||||
import { describe, expect } from "bun:test"
|
import { describe, expect } from "bun:test"
|
||||||
import { Context, Effect, Layer, Queue, Ref } from "effect"
|
import { Context, Effect, Layer, Queue, Ref } from "effect"
|
||||||
import {
|
import {
|
||||||
@@ -20,8 +19,6 @@ import { WorkspaceID } from "../../src/control-plane/schema"
|
|||||||
import type { WorkspaceAdapter } from "../../src/control-plane/types"
|
import type { WorkspaceAdapter } from "../../src/control-plane/types"
|
||||||
import { Workspace } from "../../src/control-plane/workspace"
|
import { Workspace } from "../../src/control-plane/workspace"
|
||||||
import { WorkspaceTable } from "../../src/control-plane/workspace.sql"
|
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 { Project } from "../../src/project/project"
|
||||||
import { WorkspacePaths } from "../../src/server/routes/instance/httpapi/groups/workspace"
|
import { WorkspacePaths } from "../../src/server/routes/instance/httpapi/groups/workspace"
|
||||||
import {
|
import {
|
||||||
@@ -31,27 +28,22 @@ import {
|
|||||||
import { HEADER as FenceHeader } from "../../src/server/shared/fence"
|
import { HEADER as FenceHeader } from "../../src/server/shared/fence"
|
||||||
import { Database } from "../../src/storage/db"
|
import { Database } from "../../src/storage/db"
|
||||||
import { resetDatabase } from "../fixture/db"
|
import { resetDatabase } from "../fixture/db"
|
||||||
|
import { workspaceLayerWithRuntimeFlags } from "../fixture/workspace"
|
||||||
import { tmpdirScoped } from "../fixture/fixture"
|
import { tmpdirScoped } from "../fixture/fixture"
|
||||||
import { testEffect } from "../lib/effect"
|
import { testEffect } from "../lib/effect"
|
||||||
|
|
||||||
const testStateLayer = Layer.effectDiscard(
|
const testStateLayer = Layer.effectDiscard(
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES
|
|
||||||
yield* Effect.promise(() => resetDatabase())
|
yield* Effect.promise(() => resetDatabase())
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true
|
|
||||||
yield* Effect.addFinalizer(() =>
|
yield* Effect.addFinalizer(() =>
|
||||||
Effect.promise(async () => {
|
Effect.promise(async () => {
|
||||||
Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces
|
|
||||||
await resetDatabase()
|
await resetDatabase()
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
const workspaceLayer = Workspace.defaultLayer.pipe(
|
const workspaceLayer = workspaceLayerWithRuntimeFlags({ experimentalWorkspaces: true })
|
||||||
Layer.provide(InstanceStore.defaultLayer),
|
|
||||||
Layer.provide(InstanceBootstrap.defaultLayer),
|
|
||||||
)
|
|
||||||
|
|
||||||
const it = testEffect(
|
const it = testEffect(
|
||||||
Layer.mergeAll(
|
Layer.mergeAll(
|
||||||
|
|||||||
Reference in New Issue
Block a user