acp.test.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { describe, expect, test } from "bun:test"
  2. import { spawn } from "child_process"
  3. describe("ACP Server", () => {
  4. test("initialize and shutdown", async () => {
  5. const proc = spawn("bun", ["run", "dev", "acp"], {
  6. cwd: process.cwd(),
  7. stdio: ["pipe", "pipe", "pipe"],
  8. env: { ...process.env, OPENCODE: "1" },
  9. })
  10. const encoder = new TextEncoder()
  11. const decoder = new TextDecoder()
  12. let initResponse: any = null
  13. proc.stdout.on("data", (chunk: Buffer) => {
  14. const lines = decoder.decode(chunk).split("\n")
  15. for (const line of lines) {
  16. const trimmed = line.trim()
  17. if (!trimmed) continue
  18. try {
  19. const msg = JSON.parse(trimmed)
  20. if (msg.id === 1) initResponse = msg
  21. } catch (e) {}
  22. }
  23. })
  24. // Wait for server to be ready
  25. await new Promise((resolve) => setTimeout(resolve, 500))
  26. proc.stdin.write(
  27. encoder.encode(
  28. JSON.stringify({
  29. jsonrpc: "2.0",
  30. id: 1,
  31. method: "initialize",
  32. params: { protocolVersion: 1 },
  33. }) + "\n",
  34. ),
  35. )
  36. await new Promise((resolve) => setTimeout(resolve, 500))
  37. expect(initResponse).toBeTruthy()
  38. expect(initResponse.result.protocolVersion).toBe(1)
  39. expect(initResponse.result.agentCapabilities).toBeTruthy()
  40. proc.kill()
  41. }, 10000)
  42. test("create session", async () => {
  43. const proc = spawn("bun", ["run", "dev", "acp"], {
  44. cwd: process.cwd(),
  45. stdio: ["pipe", "pipe", "pipe"],
  46. env: { ...process.env, OPENCODE: "1" },
  47. })
  48. const encoder = new TextEncoder()
  49. const decoder = new TextDecoder()
  50. let sessionResponse: any = null
  51. proc.stdout.on("data", (chunk: Buffer) => {
  52. const lines = decoder.decode(chunk).split("\n")
  53. for (const line of lines) {
  54. const trimmed = line.trim()
  55. if (!trimmed) continue
  56. try {
  57. const msg = JSON.parse(trimmed)
  58. if (msg.id === 2) sessionResponse = msg
  59. } catch (e) {}
  60. }
  61. })
  62. proc.stdin.write(
  63. encoder.encode(
  64. JSON.stringify({
  65. jsonrpc: "2.0",
  66. id: 1,
  67. method: "initialize",
  68. params: { protocolVersion: 1 },
  69. }) + "\n",
  70. ),
  71. )
  72. await new Promise((resolve) => setTimeout(resolve, 500))
  73. proc.stdin.write(
  74. encoder.encode(
  75. JSON.stringify({
  76. jsonrpc: "2.0",
  77. id: 2,
  78. method: "session/new",
  79. params: {
  80. cwd: process.cwd(),
  81. mcpServers: [],
  82. },
  83. }) + "\n",
  84. ),
  85. )
  86. await new Promise((resolve) => setTimeout(resolve, 1000))
  87. expect(sessionResponse).toBeTruthy()
  88. expect(sessionResponse.result.sessionId).toBeTruthy()
  89. proc.kill()
  90. }, 10000)
  91. })