catalog.shared.test.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { afterEach, describe, expect, mock, spyOn, test } from "bun:test"
  2. import { OpenCode } from "@opencode-ai/client/promise"
  3. import { loadRunReferences, runProviders } from "../../src/mini/catalog.shared"
  4. import { catalogModel, catalogProvider } from "./fixture/catalog"
  5. afterEach(() => {
  6. mock.restore()
  7. })
  8. describe("run catalog shared", () => {
  9. test("loads visible project references from the current reference catalog", async () => {
  10. const client = OpenCode.make({ baseUrl: "https://opencode.test" })
  11. const list = spyOn(client.reference, "list").mockImplementation(
  12. () =>
  13. Promise.resolve({
  14. location: { directory: "/tmp", project: { id: "proj_1", directory: "/tmp" } },
  15. data: [
  16. {
  17. name: "effect",
  18. path: "/repos/effect",
  19. description: "Effect v4 sources",
  20. source: { type: "local", path: "/repos/effect" },
  21. },
  22. {
  23. name: "secret",
  24. path: "/repos/secret",
  25. hidden: true,
  26. source: { type: "local", path: "/repos/secret" },
  27. },
  28. ],
  29. }) as never,
  30. )
  31. const references = await loadRunReferences(client, { directory: "/tmp" })
  32. expect(list).toHaveBeenCalledWith({ location: { directory: "/tmp" } })
  33. expect(references).toMatchObject([{ name: "effect", path: "/repos/effect", description: "Effect v4 sources" }])
  34. })
  35. test("merges current providers and models into the footer catalog shape", () => {
  36. const providers = runProviders(
  37. [catalogProvider("openai", "OpenAI")],
  38. [
  39. catalogModel({
  40. id: "gpt-5",
  41. modelID: "openai",
  42. providerID: "openai",
  43. name: "Little Frank",
  44. variants: ["high"],
  45. }),
  46. ],
  47. )
  48. expect(providers).toEqual([
  49. {
  50. id: "openai",
  51. name: "OpenAI",
  52. models: {
  53. "gpt-5": {
  54. name: "Little Frank",
  55. cost: {
  56. input: 0,
  57. },
  58. limit: {
  59. context: 128_000,
  60. },
  61. status: "active",
  62. variants: {
  63. high: {},
  64. },
  65. },
  66. },
  67. },
  68. ])
  69. })
  70. })