Skip to content

Commit b01120e

Browse files
authored
chore (provider-utils): update unified test server (#5434)
1 parent f7cd1ea commit b01120e

File tree

4 files changed

+1014
-1241
lines changed

4 files changed

+1014
-1241
lines changed

.changeset/tasty-cobras-reply.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@ai-sdk/provider-utils': patch
3+
---
4+
5+
chore (provider-utils): update unified test server

packages/ai/core/tool/mcp/mcp-sse-transport.test.ts

+35-65
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { createTestServer } from '@ai-sdk/provider-utils/test';
1+
import {
2+
createTestServer,
3+
TestResponseController,
4+
} from '@ai-sdk/provider-utils/test';
25
import { MCPClientError } from '../../../errors';
36
import { SseMCPTransport } from './mcp-sse-transport';
47

58
describe('SseMCPTransport', () => {
69
const server = createTestServer({
7-
'http://localhost:3000/sse': {
8-
response: undefined,
9-
},
10+
'http://localhost:3000/sse': {},
1011
'http://localhost:3000/messages': {
1112
response: {
1213
type: 'json-value',
@@ -19,17 +20,12 @@ describe('SseMCPTransport', () => {
1920
},
2021
});
2122

22-
beforeEach(() => {
23-
server.urls['http://localhost:3000/sse'].response = undefined;
24-
});
25-
2623
it('should establish connection and receive endpoint', async () => {
27-
const controller = new TransformStreamController();
28-
const stream = controller.readable;
24+
const controller = new TestResponseController();
2925

3026
server.urls['http://localhost:3000/sse'].response = {
31-
type: 'readable-stream',
32-
stream,
27+
type: 'controlled-stream',
28+
controller,
3329
headers: {
3430
'Content-Type': 'text/event-stream',
3531
},
@@ -40,7 +36,7 @@ describe('SseMCPTransport', () => {
4036
});
4137
const connectPromise = transport.start();
4238

43-
controller.enqueue(
39+
controller.write(
4440
'event: endpoint\ndata: http://localhost:3000/messages\n\n',
4541
);
4642

@@ -56,8 +52,7 @@ describe('SseMCPTransport', () => {
5652
});
5753

5854
it('should throw if server returns non-200 status', async () => {
59-
const controller = new TransformStreamController();
60-
const stream = controller.readable;
55+
const controller = new TestResponseController();
6156

6257
server.urls['http://localhost:3000/sse'].response = {
6358
type: 'error',
@@ -70,20 +65,19 @@ describe('SseMCPTransport', () => {
7065
});
7166
const connectPromise = transport.start();
7267

73-
controller.enqueue(
68+
controller.write(
7469
'event: endpoint\ndata: http://localhost:3000/messages\n\n',
7570
);
7671

7772
await expect(connectPromise).rejects.toThrow();
7873
});
7974

8075
it('should handle valid JSON-RPC messages', async () => {
81-
const controller = new TransformStreamController();
82-
const stream = controller.readable;
76+
const controller = new TestResponseController();
8377

8478
server.urls['http://localhost:3000/sse'].response = {
85-
type: 'readable-stream',
86-
stream,
79+
type: 'controlled-stream',
80+
controller,
8781
headers: {
8882
'Content-Type': 'text/event-stream',
8983
},
@@ -98,7 +92,7 @@ describe('SseMCPTransport', () => {
9892
});
9993

10094
const connectPromise = transport.start();
101-
controller.enqueue(
95+
controller.write(
10296
'event: endpoint\ndata: http://localhost:3000/messages\n\n',
10397
);
10498
await connectPromise;
@@ -110,7 +104,7 @@ describe('SseMCPTransport', () => {
110104
id: '1',
111105
};
112106

113-
controller.enqueue(
107+
controller.write(
114108
`event: message\ndata: ${JSON.stringify(testMessage)}\n\n`,
115109
);
116110

@@ -121,12 +115,11 @@ describe('SseMCPTransport', () => {
121115
});
122116

123117
it('should handle invalid JSON-RPC messages', async () => {
124-
const controller = new TransformStreamController();
125-
const stream = controller.readable;
118+
const controller = new TestResponseController();
126119

127120
server.urls['http://localhost:3000/sse'].response = {
128-
type: 'readable-stream',
129-
stream,
121+
type: 'controlled-stream',
122+
controller,
130123
headers: {
131124
'Content-Type': 'text/event-stream',
132125
},
@@ -141,7 +134,7 @@ describe('SseMCPTransport', () => {
141134
});
142135

143136
const connectPromise = transport.start();
144-
controller.enqueue(
137+
controller.write(
145138
'event: endpoint\ndata: http://localhost:3000/messages\n\n',
146139
);
147140
await connectPromise;
@@ -150,7 +143,7 @@ describe('SseMCPTransport', () => {
150143
foo: 'bar',
151144
};
152145

153-
controller.enqueue(
146+
controller.write(
154147
`event: message\ndata: ${JSON.stringify(invalidMessage)}\n\n`,
155148
);
156149

@@ -162,12 +155,11 @@ describe('SseMCPTransport', () => {
162155
});
163156

164157
it('should send messages as POST requests', async () => {
165-
const controller = new TransformStreamController();
166-
const stream = controller.readable;
158+
const controller = new TestResponseController();
167159

168160
server.urls['http://localhost:3000/sse'].response = {
169-
type: 'readable-stream',
170-
stream,
161+
type: 'controlled-stream',
162+
controller,
171163
headers: {
172164
'Content-Type': 'text/event-stream',
173165
},
@@ -178,7 +170,7 @@ describe('SseMCPTransport', () => {
178170
});
179171

180172
const connectPromise = transport.start();
181-
controller.enqueue(
173+
controller.write(
182174
'event: endpoint\ndata: http://localhost:3000/messages\n\n',
183175
);
184176
await connectPromise;
@@ -201,12 +193,11 @@ describe('SseMCPTransport', () => {
201193
});
202194

203195
it('should handle POST request errors', async () => {
204-
const controller = new TransformStreamController();
205-
const stream = controller.readable;
196+
const controller = new TestResponseController();
206197

207198
server.urls['http://localhost:3000/sse'].response = {
208-
type: 'readable-stream',
209-
stream,
199+
type: 'controlled-stream',
200+
controller,
210201
headers: {
211202
'Content-Type': 'text/event-stream',
212203
},
@@ -226,7 +217,7 @@ describe('SseMCPTransport', () => {
226217
});
227218

228219
const connectPromise = transport.start();
229-
controller.enqueue(
220+
controller.write(
230221
'event: endpoint\ndata: http://localhost:3000/messages\n\n',
231222
);
232223
await connectPromise;
@@ -266,12 +257,11 @@ describe('SseMCPTransport', () => {
266257
});
267258

268259
it('should send custom headers with all requests', async () => {
269-
const controller = new TransformStreamController();
270-
const stream = controller.readable;
260+
const controller = new TestResponseController();
271261

272262
server.urls['http://localhost:3000/sse'].response = {
273-
type: 'readable-stream',
274-
stream,
263+
type: 'controlled-stream',
264+
controller,
275265
headers: {
276266
'Content-Type': 'text/event-stream',
277267
},
@@ -288,9 +278,11 @@ describe('SseMCPTransport', () => {
288278
});
289279

290280
const connectPromise = transport.start();
291-
controller.enqueue(
281+
282+
controller.write(
292283
'event: endpoint\ndata: http://localhost:3000/messages\n\n',
293284
);
285+
294286
await connectPromise;
295287

296288
const message = {
@@ -317,25 +309,3 @@ describe('SseMCPTransport', () => {
317309
await transport.close();
318310
});
319311
});
320-
321-
class TransformStreamController {
322-
private readonly stream: TransformStream;
323-
private readonly writer: WritableStreamDefaultWriter;
324-
325-
constructor() {
326-
this.stream = new TransformStream();
327-
this.writer = this.stream.writable.getWriter();
328-
}
329-
330-
get readable(): ReadableStream {
331-
return this.stream.readable;
332-
}
333-
334-
async enqueue(chunk: string): Promise<void> {
335-
await this.writer.write(chunk);
336-
}
337-
338-
async close(): Promise<void> {
339-
await this.writer.close();
340-
}
341-
}

0 commit comments

Comments
 (0)