acp.test.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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", "--conditions=development", "src/index.ts", "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. proc.stdin.write(
  25. encoder.encode(
  26. JSON.stringify({
  27. jsonrpc: "2.0",
  28. id: 1,
  29. method: "initialize",
  30. params: { protocolVersion: 1 },
  31. }) + "\n",
  32. ),
  33. )
  34. await new Promise((resolve) => setTimeout(resolve, 500))
  35. expect(initResponse).toBeTruthy()
  36. expect(initResponse.result.protocolVersion).toBe(1)
  37. expect(initResponse.result.agentCapabilities).toBeTruthy()
  38. proc.kill()
  39. }, 10000)
  40. test("create session", async () => {
  41. const proc = spawn("bun", ["run", "--conditions=development", "src/index.ts", "acp"], {
  42. cwd: process.cwd(),
  43. stdio: ["pipe", "pipe", "pipe"],
  44. env: { ...process.env, OPENCODE: "1" },
  45. })
  46. const encoder = new TextEncoder()
  47. const decoder = new TextDecoder()
  48. let sessionResponse: any = null
  49. proc.stdout.on("data", (chunk: Buffer) => {
  50. const lines = decoder.decode(chunk).split("\n")
  51. for (const line of lines) {
  52. const trimmed = line.trim()
  53. if (!trimmed) continue
  54. try {
  55. const msg = JSON.parse(trimmed)
  56. if (msg.id === 2) sessionResponse = msg
  57. } catch (e) {}
  58. }
  59. })
  60. proc.stdin.write(
  61. encoder.encode(
  62. JSON.stringify({
  63. jsonrpc: "2.0",
  64. id: 1,
  65. method: "initialize",
  66. params: { protocolVersion: 1 },
  67. }) + "\n",
  68. ),
  69. )
  70. await new Promise((resolve) => setTimeout(resolve, 500))
  71. proc.stdin.write(
  72. encoder.encode(
  73. JSON.stringify({
  74. jsonrpc: "2.0",
  75. id: 2,
  76. method: "session/new",
  77. params: {
  78. cwd: process.cwd(),
  79. mcpServers: [],
  80. },
  81. }) + "\n",
  82. ),
  83. )
  84. await new Promise((resolve) => setTimeout(resolve, 1000))
  85. expect(sessionResponse).toBeTruthy()
  86. expect(sessionResponse.result.sessionId).toBeTruthy()
  87. proc.kill()
  88. }, 10000)
  89. })