|
| 1 | +import { A2AServerRegistry, type ServerProviderDeps, TriggerRegistry } from "@voltagent/core"; |
| 2 | +import type { Logger } from "@voltagent/internal"; |
1 | 3 | import * as serverCore from "@voltagent/server-core"; |
2 | 4 | import { beforeEach, describe, expect, it, vi } from "vitest"; |
3 | 5 | import { OpenAPIHono } from "../zod-openapi-compat"; |
@@ -26,45 +28,136 @@ vi.mock("@voltagent/a2a-server", async () => { |
26 | 28 | }; |
27 | 29 | }); |
28 | 30 |
|
29 | | -describe("A2A Routes", () => { |
30 | | - let app: OpenAPIHono; |
31 | | - const mockDeps = { |
32 | | - a2a: { |
33 | | - registry: { |
34 | | - list: vi.fn().mockReturnValue([{ id: "server1" }]), |
| 31 | +function createMockA2ARegistry() { |
| 32 | + const registry = new A2AServerRegistry(); |
| 33 | + registry.register( |
| 34 | + { |
| 35 | + getMetadata() { |
| 36 | + return { |
| 37 | + id: "server1", |
| 38 | + name: "server1", |
| 39 | + version: "1.0.0", |
| 40 | + }; |
| 41 | + }, |
| 42 | + }, |
| 43 | + { |
| 44 | + agentRegistry: { |
| 45 | + getAgent() { |
| 46 | + return undefined; |
| 47 | + }, |
| 48 | + getAllAgents() { |
| 49 | + return []; |
| 50 | + }, |
| 51 | + }, |
| 52 | + }, |
| 53 | + ); |
| 54 | + return registry; |
| 55 | +} |
| 56 | + |
| 57 | +function createMockDeps(): ServerProviderDeps { |
| 58 | + return { |
| 59 | + agentRegistry: { |
| 60 | + getAgent() { |
| 61 | + return undefined; |
| 62 | + }, |
| 63 | + getAllAgents() { |
| 64 | + return []; |
| 65 | + }, |
| 66 | + getAgentCount() { |
| 67 | + return 0; |
| 68 | + }, |
| 69 | + removeAgent() { |
| 70 | + return false; |
| 71 | + }, |
| 72 | + registerAgent() {}, |
| 73 | + getGlobalVoltOpsClient() { |
| 74 | + return undefined; |
| 75 | + }, |
| 76 | + getGlobalLogger() { |
| 77 | + return undefined; |
35 | 78 | }, |
36 | 79 | }, |
37 | | - } as any; |
38 | | - const mockLogger = { |
| 80 | + workflowRegistry: { |
| 81 | + getWorkflow() { |
| 82 | + return undefined; |
| 83 | + }, |
| 84 | + getWorkflowsForApi() { |
| 85 | + return []; |
| 86 | + }, |
| 87 | + getWorkflowDetailForApi() { |
| 88 | + return undefined; |
| 89 | + }, |
| 90 | + getWorkflowCount() { |
| 91 | + return 0; |
| 92 | + }, |
| 93 | + getAllWorkflowIds() { |
| 94 | + return []; |
| 95 | + }, |
| 96 | + on() {}, |
| 97 | + off() {}, |
| 98 | + activeExecutions: new Map(), |
| 99 | + async resumeSuspendedWorkflow() { |
| 100 | + return undefined; |
| 101 | + }, |
| 102 | + }, |
| 103 | + triggerRegistry: new TriggerRegistry(), |
| 104 | + a2a: { |
| 105 | + registry: createMockA2ARegistry(), |
| 106 | + }, |
| 107 | + }; |
| 108 | +} |
| 109 | + |
| 110 | +function createMockLogger(): Logger { |
| 111 | + const logger: Logger = { |
39 | 112 | trace: vi.fn(), |
40 | 113 | debug: vi.fn(), |
41 | 114 | info: vi.fn(), |
42 | 115 | warn: vi.fn(), |
43 | 116 | error: vi.fn(), |
44 | | - } as any; |
| 117 | + fatal: vi.fn(), |
| 118 | + child: vi.fn(() => logger), |
| 119 | + }; |
| 120 | + |
| 121 | + return logger; |
| 122 | +} |
| 123 | + |
| 124 | +describe("A2A Routes", () => { |
| 125 | + let app: InstanceType<typeof OpenAPIHono>; |
| 126 | + let mockDeps: ServerProviderDeps; |
| 127 | + let mockLogger: Logger; |
45 | 128 |
|
46 | 129 | beforeEach(() => { |
47 | 130 | app = new OpenAPIHono(); |
48 | | - registerA2ARoutes(app as any, mockDeps, mockLogger); |
| 131 | + mockDeps = createMockDeps(); |
| 132 | + mockLogger = createMockLogger(); |
| 133 | + registerA2ARoutes(app, mockDeps, mockLogger); |
49 | 134 | vi.clearAllMocks(); |
50 | 135 | }); |
51 | 136 |
|
52 | 137 | it("passes the request URL when resolving the agent card", async () => { |
53 | | - vi.mocked(serverCore.resolveAgentCard).mockReturnValue({ |
| 138 | + const card = { |
54 | 139 | name: "agent", |
55 | 140 | description: "desc", |
56 | | - } as any); |
| 141 | + url: "https://agents.example/a2a/server1", |
| 142 | + version: "1.0.0", |
| 143 | + capabilities: { |
| 144 | + streaming: true, |
| 145 | + pushNotifications: false, |
| 146 | + stateTransitionHistory: false, |
| 147 | + }, |
| 148 | + defaultInputModes: ["text"], |
| 149 | + defaultOutputModes: ["text"], |
| 150 | + skills: [], |
| 151 | + }; |
| 152 | + vi.mocked(serverCore.resolveAgentCard).mockReturnValue(card); |
57 | 153 |
|
58 | 154 | const requestUrl = "http://agents.example/.well-known/server1/agent-card.json"; |
59 | 155 | const response = await app.request(requestUrl); |
60 | 156 |
|
61 | 157 | expect(response.status).toBe(200); |
62 | | - expect(await response.json()).toEqual({ |
63 | | - name: "agent", |
64 | | - description: "desc", |
65 | | - }); |
| 158 | + expect(await response.json()).toEqual(card); |
66 | 159 | expect(serverCore.resolveAgentCard).toHaveBeenCalledWith( |
67 | | - mockDeps.a2a.registry, |
| 160 | + mockDeps.a2a?.registry, |
68 | 161 | "server1", |
69 | 162 | "server1", |
70 | 163 | { requestUrl }, |
|
0 commit comments