mirror of
https://github.com/anomalyco/opencode.git
synced 2026-11-02 09:40:42 +00:00
48 lines
1.6 KiB
TypeScript
48 lines
1.6 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { createRoot } from "solid-js"
|
|
import type { Bridge, BridgeMessage, Installed } from "@opencode/plugin/gui/host"
|
|
import { createInstalled } from "../src/runtime/plugin/installed"
|
|
|
|
test("a list main pushes while the initial list is pending wins over the older reply", async () => {
|
|
const listeners = new Set<(message: BridgeMessage) => void>()
|
|
const reply = Promise.withResolvers<readonly Installed[]>()
|
|
|
|
const bridge: Bridge = {
|
|
packaged: false,
|
|
call: () => Promise.reject(new Error("no calls in this test")),
|
|
subscribe: async () => ({ available: false }),
|
|
on: (listener) => {
|
|
listeners.add(listener)
|
|
|
|
return () => {
|
|
listeners.delete(listener)
|
|
}
|
|
},
|
|
embed: () => {},
|
|
capture: async () => undefined,
|
|
runMenubarItem: () => {},
|
|
configure: () => {},
|
|
pluginGuis: async () => ({ plugins: [], reserved: [] }),
|
|
manager: {
|
|
list: () => reply.promise,
|
|
enable: async () => {},
|
|
disable: async () => {},
|
|
reload: async () => {},
|
|
},
|
|
}
|
|
|
|
const plugin = { id: "fixture", builtin: false }
|
|
const root = createRoot((dispose) => ({ installed: createInstalled(bridge), dispose }))
|
|
// Another window disabled the plugin before this window's initial list arrived.
|
|
listeners.forEach((listener) => listener({ type: "installed", list: [{ ...plugin, enabled: false }] }))
|
|
reply.resolve([{ ...plugin, enabled: true }])
|
|
await Bun.sleep(0)
|
|
expect({
|
|
known: root.installed.enableState() !== undefined,
|
|
enabled: root.installed.list().map((item) => item.enabled),
|
|
}).toEqual({
|
|
known: true,
|
|
enabled: [false],
|
|
})
|
|
root.dispose()
|
|
})
|