9f290d4381
Remove makeRuntime + async facade exports from TuiConfig, Installation, and SessionCompaction. Migrate production callers to AppRuntime.runPromise with yielded services, and route tests through dedicated mockable hooks where they previously spied on the facade.
86 lines
2.4 KiB
TypeScript
86 lines
2.4 KiB
TypeScript
import { expect, spyOn, test } from "bun:test"
|
|
import fs from "fs/promises"
|
|
import path from "path"
|
|
import { pathToFileURL } from "url"
|
|
import { tmpdir } from "../../fixture/fixture"
|
|
import { createTuiPluginApi } from "../../fixture/tui-plugin"
|
|
import { createTuiResolvedConfig } from "../../fixture/tui-runtime"
|
|
const { TuiPluginRuntime } = await import("../../../src/cli/cmd/tui/plugin/runtime")
|
|
|
|
test("installs plugin without loading it", async () => {
|
|
await using tmp = await tmpdir({
|
|
init: async (dir) => {
|
|
const file = path.join(dir, "install-plugin.ts")
|
|
const spec = pathToFileURL(file).href
|
|
const marker = path.join(dir, "install.txt")
|
|
|
|
await Bun.write(
|
|
path.join(dir, "package.json"),
|
|
JSON.stringify(
|
|
{
|
|
name: "demo-install-plugin",
|
|
type: "module",
|
|
exports: {
|
|
"./tui": {
|
|
import: "./install-plugin.ts",
|
|
config: { marker },
|
|
},
|
|
},
|
|
},
|
|
null,
|
|
2,
|
|
),
|
|
)
|
|
|
|
await Bun.write(
|
|
file,
|
|
`export default {
|
|
id: "demo.install",
|
|
tui: async (_api, options) => {
|
|
if (!options?.marker) return
|
|
await Bun.write(options.marker, "loaded")
|
|
},
|
|
}
|
|
`,
|
|
)
|
|
|
|
return { spec, marker }
|
|
},
|
|
})
|
|
|
|
process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json")
|
|
const config = createTuiResolvedConfig({
|
|
plugin: [],
|
|
})
|
|
const wait = spyOn(TuiPluginRuntime, "waitForDependencies").mockResolvedValue()
|
|
const cwd = spyOn(process, "cwd").mockImplementation(() => tmp.path)
|
|
const api = createTuiPluginApi({
|
|
state: {
|
|
path: {
|
|
state: path.join(tmp.path, "state.json"),
|
|
config: path.join(tmp.path, "tui.json"),
|
|
worktree: tmp.path,
|
|
directory: tmp.path,
|
|
},
|
|
},
|
|
})
|
|
|
|
try {
|
|
await TuiPluginRuntime.init({ api, config })
|
|
const out = await TuiPluginRuntime.installPlugin(tmp.extra.spec)
|
|
expect(out).toMatchObject({
|
|
ok: true,
|
|
tui: true,
|
|
})
|
|
|
|
await expect(fs.readFile(tmp.extra.marker, "utf8")).rejects.toThrow()
|
|
await expect(TuiPluginRuntime.addPlugin(tmp.extra.spec)).resolves.toBe(true)
|
|
await expect(fs.readFile(tmp.extra.marker, "utf8")).resolves.toBe("loaded")
|
|
} finally {
|
|
await TuiPluginRuntime.dispose()
|
|
cwd.mockRestore()
|
|
wait.mockRestore()
|
|
delete process.env.OPENCODE_PLUGIN_META_FILE
|
|
}
|
|
})
|