55 lines
2.0 KiB
TypeScript
55 lines
2.0 KiB
TypeScript
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,
|
|
)
|