sync-fixture.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /** @jsxImportSource @opentui/solid */
  2. import { testRender } from "@opentui/solid"
  3. import { onMount } from "solid-js"
  4. import { ArgsProvider } from "../../../../src/context/args"
  5. import { KVProvider, useKV } from "../../../../src/context/kv"
  6. import { ProjectProvider, useProject } from "../../../../src/context/project"
  7. import { SDKProvider } from "../../../../src/context/sdk"
  8. import { SyncProvider, useSync } from "../../../../src/context/sync"
  9. import { PermissionProvider } from "../../../../src/context/permission"
  10. import { ExitProvider } from "../../../../src/context/exit"
  11. import { createEventSource, createFetch, type FetchHandler, directory } from "../../../fixture/tui-sdk"
  12. import { TestTuiContexts } from "../../../fixture/tui-environment"
  13. export { createEventSource, createFetch, directory, eventSource, json, worktree } from "../../../fixture/tui-sdk"
  14. export async function wait(fn: () => boolean, timeout = 2000) {
  15. const start = Date.now()
  16. while (!fn()) {
  17. if (Date.now() - start > timeout) throw new Error("timed out waiting for condition")
  18. await Bun.sleep(10)
  19. }
  20. }
  21. type Ctx = { kv: ReturnType<typeof useKV>; project: ReturnType<typeof useProject>; sync: ReturnType<typeof useSync> }
  22. export async function mount(override?: FetchHandler, state?: string) {
  23. const calls = createFetch(override)
  24. const events = createEventSource()
  25. let sync!: ReturnType<typeof useSync>
  26. let project!: ReturnType<typeof useProject>
  27. let kv!: ReturnType<typeof useKV>
  28. let done!: () => void
  29. const ready = new Promise<void>((resolve) => {
  30. done = resolve
  31. })
  32. function Probe() {
  33. const ctx: Ctx = { kv: useKV(), project: useProject(), sync: useSync() }
  34. onMount(() => {
  35. sync = ctx.sync
  36. project = ctx.project
  37. kv = ctx.kv
  38. done()
  39. })
  40. return <box />
  41. }
  42. const app = await testRender(() => (
  43. <TestTuiContexts paths={state ? { state } : undefined}>
  44. <ArgsProvider>
  45. <KVProvider>
  46. <SDKProvider url="http://test" directory={directory} fetch={calls.fetch} events={events.source}>
  47. <PermissionProvider>
  48. <ProjectProvider>
  49. <ExitProvider exit={() => {}}>
  50. <SyncProvider>
  51. <Probe />
  52. </SyncProvider>
  53. </ExitProvider>
  54. </ProjectProvider>
  55. </PermissionProvider>
  56. </SDKProvider>
  57. </KVProvider>
  58. </ArgsProvider>
  59. </TestTuiContexts>
  60. ))
  61. await ready
  62. await wait(() => sync.status === "complete")
  63. return { app, emit: events.emit, kv, project, sync, session: calls.session }
  64. }