| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import fs from "node:fs"
- import os from "node:os"
- import path from "node:path"
- import { expect, test } from "bun:test"
- import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
- import { makeFiles } from "@opencode-ai/core/environment"
- import { Workspace } from "@opencode-ai/core/workspace"
- import { WorkspaceDriver } from "@opencode-ai/core/workspace/driver"
- import { Effect, Layer } from "effect"
- import { TestClock } from "effect/testing"
- import { modalWorkspaceDriver, provider } from "../src/workspace/modal-workspace"
- const enabled =
- !!process.env.OPENCODE_TEST_MODAL &&
- ((!!process.env.MODAL_TOKEN_ID && !!process.env.MODAL_TOKEN_SECRET) ||
- fs.existsSync(path.join(os.homedir(), ".modal.toml")))
- const testLayer = Layer.provideMerge(
- AppNodeBuilder.build(Workspace.configured({ idleThreshold: "1 minute", pollInterval: "1 minute" }), [
- [
- WorkspaceDriver.node,
- WorkspaceDriver.registryNode({ [provider]: modalWorkspaceDriver({ app: "opencode-workspace-tests" }) }),
- ],
- ]),
- TestClock.layer(),
- )
- const modalTest = enabled ? test : test.skip
- modalTest(
- "wakes a workspace from its filesystem snapshot",
- () =>
- Effect.runPromise(
- Effect.gen(function* () {
- const workspace = yield* Workspace.Service
- yield* Effect.acquireUseRelease(
- workspace.create(provider),
- (created) =>
- Effect.gen(function* () {
- const environment = yield* workspace.connect(created.id)
- const files = makeFiles(environment)
- const file = `/tmp/opencode-workspace-${crypto.randomUUID()}.txt`
- yield* files.write(file, new TextEncoder().encode("survived snapshot"))
- yield* TestClock.adjust("2 minutes")
- const restored = yield* files.read(file)
- expect(new TextDecoder().decode(restored.bytes)).toBe("survived snapshot")
- }),
- (created) => workspace.destroy(created.id).pipe(Effect.ignore),
- )
- }).pipe(Effect.scoped, Effect.provide(testLayer)),
- ),
- 180_000,
- )
|