command-palette.test.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { describe, expect, test } from "bun:test"
  2. import type { GlobalSession, Project } from "@opencode-ai/sdk/v2/client"
  3. import { createRoot } from "solid-js"
  4. import { createServerSessionEntries } from "@/components/command-palette"
  5. import type { LocalProject } from "@/context/layout"
  6. import { ServerConnection } from "@/context/server"
  7. import { getProjectAvatarSource } from "@/pages/layout/helpers"
  8. const stored: Project = {
  9. id: "project-1",
  10. name: "Palette project",
  11. worktree: "/workspace/project",
  12. sandboxes: [],
  13. time: { created: 1, updated: 1 },
  14. }
  15. const session: GlobalSession = {
  16. id: "session-1",
  17. slug: "session-1",
  18. projectID: stored.id,
  19. directory: stored.worktree,
  20. title: "Palette session",
  21. version: "1",
  22. time: { created: 1, updated: 2 },
  23. project: { id: stored.id, name: stored.name, worktree: stored.worktree },
  24. }
  25. describe("command palette sessions", () => {
  26. test("uses the home project avatar and cancels superseded searches", async () => {
  27. const server = ServerConnection.Key.make("selected-server")
  28. const opened: LocalProject = {
  29. ...stored,
  30. icon: { override: "home-project-avatar" },
  31. expanded: true,
  32. }
  33. const searches: string[] = []
  34. const result = await new Promise<Awaited<ReturnType<ReturnType<typeof createServerSessionEntries>>>>(
  35. (resolve, reject) => {
  36. createRoot((dispose) => {
  37. const search = createServerSessionEntries({
  38. server,
  39. opened: () => [opened],
  40. stored: () => [{ ...stored, icon: { url: "stored-project-avatar" } }],
  41. load: async (text) => {
  42. searches.push(text)
  43. return {
  44. data: [session, { ...session, id: "archived-session", time: { ...session.time, archived: 3 } }],
  45. }
  46. },
  47. untitled: () => "Untitled",
  48. category: () => "Sessions",
  49. })
  50. const first = search("palette")
  51. const second = search("palette session")
  52. Promise.all([first, second])
  53. .then(([cancelled, entries]) => {
  54. expect(cancelled).toEqual([])
  55. resolve(entries)
  56. })
  57. .catch(reject)
  58. .finally(dispose)
  59. })
  60. },
  61. )
  62. expect(searches).toEqual(["palette session"])
  63. expect(result).toHaveLength(1)
  64. expect(getProjectAvatarSource(result[0]?.project?.id, result[0]?.project?.icon)).toBe("home-project-avatar")
  65. expect(result[0]).toMatchObject({
  66. server,
  67. sessionID: session.id,
  68. description: stored.name,
  69. project: { id: stored.id, icon: opened.icon },
  70. })
  71. })
  72. })