command-palette.test.ts 2.7 KB

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