Skip to content

Commit c19459e

Browse files
committed
test: fix sse tests
1 parent 388bfa9 commit c19459e

File tree

2 files changed

+106
-48
lines changed

2 files changed

+106
-48
lines changed

packages/openapi-ts/src/plugins/@hey-api/client-core/__tests__/serverSentEvents.test.ts

Lines changed: 100 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ function makeStream(chunks: string[]) {
1616
});
1717
}
1818

19+
function toRequest(input: RequestInfo, init?: RequestInit): Request {
20+
if (input instanceof Request) {
21+
const url = input.url.startsWith('http')
22+
? input.url
23+
: `http://localhost${input.url}`;
24+
return new Request(url, input);
25+
}
26+
const url = input.startsWith('http') ? input : `http://localhost${input}`;
27+
return new Request(url, init);
28+
}
29+
1930
describe('createSseClient', () => {
2031
let fetchMock: any;
2132

@@ -35,7 +46,10 @@ describe('createSseClient', () => {
3546
});
3647

3748
const onEvent = vi.fn();
38-
const { stream } = createSseClient({ onSseEvent: onEvent, url: '/sse' });
49+
const { stream } = createSseClient({
50+
onSseEvent: onEvent,
51+
url: 'http://localhost/sse',
52+
});
3953

4054
const result: any[] = [];
4155
for await (const ev of stream) result.push(ev);
@@ -55,7 +69,7 @@ describe('createSseClient', () => {
5569
ok: true,
5670
});
5771

58-
const { stream } = createSseClient({ url: '/sse' });
72+
const { stream } = createSseClient({ url: 'http://localhost/sse' });
5973
const result: any[] = [];
6074
for await (const ev of stream) result.push(ev);
6175

@@ -76,7 +90,7 @@ describe('createSseClient', () => {
7690
onSseError: onError,
7791
signal: controller.signal,
7892
sseDefaultRetryDelay: 0,
79-
url: '/sse',
93+
url: 'http://localhost/sse',
8094
});
8195

8296
const iter = stream[Symbol.asyncIterator]();
@@ -97,7 +111,10 @@ describe('createSseClient', () => {
97111
});
98112

99113
const onEvent = vi.fn();
100-
const { stream } = createSseClient({ onSseEvent: onEvent, url: '/sse' });
114+
const { stream } = createSseClient({
115+
onSseEvent: onEvent,
116+
url: 'http://localhost/sse',
117+
});
101118

102119
const iter = stream[Symbol.asyncIterator]();
103120
await iter.next();
@@ -117,7 +134,7 @@ describe('createSseClient', () => {
117134
ok: true,
118135
});
119136

120-
const { stream } = createSseClient({ url: '/sse' });
137+
const { stream } = createSseClient({ url: 'http://localhost/sse' });
121138
const result: any[] = [];
122139
for await (const ev of stream) result.push(ev);
123140
expect(result).toEqual([1, 2, 3]);
@@ -129,31 +146,39 @@ describe('createSseClient', () => {
129146
ok: true,
130147
});
131148

132-
const { stream } = createSseClient({ url: '/sse' });
149+
const { stream } = createSseClient({ url: 'http://localhost/sse' });
133150
const result: any[] = [];
134151
for await (const ev of stream) result.push(ev);
135152
expect(result).toEqual(['partial']);
136153
});
137154

138155
it('sets Last-Event-ID header on reconnect', async () => {
139-
let headersSeen: Headers | undefined;
140-
fetchMock.mockImplementation(async (_url: any, opts: any) => {
141-
headersSeen = opts?.headers.get('Last-Event-ID');
142-
return {
143-
body: makeStream(['data: a\n\n']),
144-
ok: true,
145-
};
146-
});
156+
let headersSeen: string | null | undefined;
157+
fetchMock.mockImplementation(
158+
async (input: RequestInfo, init?: RequestInit) => {
159+
const req = toRequest(input, init);
160+
headersSeen = req.headers.get('Last-Event-ID');
161+
return {
162+
body: makeStream(['data: a\n\n']),
163+
ok: true,
164+
};
165+
},
166+
);
147167

148168
const onEvent = vi.fn();
149-
const { stream } = createSseClient({ onSseEvent: onEvent, url: '/sse' });
169+
const { stream } = createSseClient({
170+
onSseEvent: onEvent,
171+
url: 'http://localhost/sse',
172+
});
150173

151174
const iter = stream[Symbol.asyncIterator]();
152175
await iter.next();
153176
await iter.return?.();
154177

155178
// simulate next fetch after reconnect
156-
await fetchMock('/sse', { headers: new Headers({ 'Last-Event-ID': '1' }) });
179+
await fetchMock('http://localhost/sse', {
180+
headers: new Headers({ 'Last-Event-ID': '1' }),
181+
});
157182
expect(headersSeen).toBe('1');
158183
});
159184

@@ -166,7 +191,7 @@ describe('createSseClient', () => {
166191
const controller = new AbortController();
167192
const { stream } = createSseClient({
168193
signal: controller.signal,
169-
url: '/sse',
194+
url: 'http://localhost/sse',
170195
});
171196

172197
const iter = stream[Symbol.asyncIterator]();
@@ -188,22 +213,28 @@ describe('createSseClient', () => {
188213
ok: true,
189214
});
190215

191-
const { stream } = createSseClient({ url: '/sse' });
216+
const { stream } = createSseClient({ url: 'http://localhost/sse' });
192217
const result: any[] = [];
193218
for await (const ev of stream) result.push(ev);
194219
expect(result).toEqual([{ foo: 1 }, 'bar', { baz: 2 }]);
195220
});
196221

197222
it('passes custom headers', async () => {
198-
let headersSeen: Headers | undefined;
199-
fetchMock.mockImplementation(async (_url: any, opts: any) => {
200-
headersSeen = opts.headers.get('X-Custom');
201-
return { body: makeStream([]), ok: true };
202-
});
223+
let headersSeen: string | null | undefined;
224+
fetchMock.mockImplementation(
225+
async (input: RequestInfo, init?: RequestInit) => {
226+
const req = toRequest(input, init);
227+
headersSeen = req.headers.get('X-Custom');
228+
return {
229+
body: makeStream([]),
230+
ok: true,
231+
};
232+
},
233+
);
203234

204235
const { stream } = createSseClient({
205236
headers: { 'X-Custom': 'abc' },
206-
url: '/sse',
237+
url: 'http://localhost/sse',
207238
});
208239

209240
const iter = stream[Symbol.asyncIterator]();
@@ -219,15 +250,15 @@ describe('createSseClient', () => {
219250
ok: true,
220251
});
221252

222-
const { stream } = createSseClient({ url: '/sse' });
253+
const { stream } = createSseClient({ url: 'http://localhost/sse' });
223254
const result: any[] = [];
224255
for await (const ev of stream) result.push(ev);
225256
expect(result).toEqual([{ foo: 'bar' }]);
226257
});
227258

228259
it('handles empty stream', async () => {
229260
fetchMock.mockResolvedValue({ body: makeStream([]), ok: true });
230-
const { stream } = createSseClient({ url: '/sse' });
261+
const { stream } = createSseClient({ url: 'http://localhost/sse' });
231262
const iter = stream[Symbol.asyncIterator]();
232263
const first = await iter.next();
233264
expect(first).toEqual({ done: true, value: undefined });
@@ -238,14 +269,17 @@ describe('createSseClient', () => {
238269
fetchMock.mockImplementation(async () => {
239270
attempt++;
240271
if (attempt < 2) throw new Error('fail');
241-
return { body: makeStream(['data: ok\n\n']), ok: true };
272+
return {
273+
body: makeStream(['data: ok\n\n']),
274+
ok: true,
275+
};
242276
});
243277

244278
const onError = vi.fn();
245279
const { stream } = createSseClient({
246280
onSseError: onError,
247281
sseDefaultRetryDelay: 0,
248-
url: '/sse',
282+
url: 'http://localhost/sse',
249283
});
250284

251285
const result: any[] = [];
@@ -262,7 +296,10 @@ describe('createSseClient', () => {
262296
});
263297

264298
const onEvent = vi.fn();
265-
const { stream } = createSseClient({ onSseEvent: onEvent, url: '/sse' });
299+
const { stream } = createSseClient({
300+
onSseEvent: onEvent,
301+
url: 'http://localhost/sse',
302+
});
266303
const iter = stream[Symbol.asyncIterator]();
267304
const ev = await iter.next();
268305
expect(ev.value).toBe('x');
@@ -276,7 +313,10 @@ describe('createSseClient', () => {
276313
});
277314

278315
const onEvent = vi.fn();
279-
const { stream } = createSseClient({ onSseEvent: onEvent, url: '/sse' });
316+
const { stream } = createSseClient({
317+
onSseEvent: onEvent,
318+
url: 'http://localhost/sse',
319+
});
280320
const iter = stream[Symbol.asyncIterator]();
281321
const ev = await iter.next();
282322
expect(ev.done).toBe(true);
@@ -299,7 +339,7 @@ describe('createSseClient', () => {
299339
const { stream } = createSseClient({
300340
onSseError: onError,
301341
onSseEvent: onEvent,
302-
url: '/sse',
342+
url: 'http://localhost/sse',
303343
});
304344
const iter = stream[Symbol.asyncIterator]();
305345
const ev = await iter.next();
@@ -316,7 +356,7 @@ describe('createSseClient', () => {
316356
const controller = new AbortController();
317357
const { stream } = createSseClient({
318358
signal: controller.signal,
319-
url: '/sse',
359+
url: 'http://localhost/sse',
320360
});
321361
const iter = stream[Symbol.asyncIterator]();
322362
await iter.next();
@@ -343,7 +383,7 @@ describe('createSseClient', () => {
343383
controller.abort();
344384
const { stream } = createSseClient({
345385
signal: controller.signal,
346-
url: '/sse',
386+
url: 'http://localhost/sse',
347387
});
348388
const iter = stream[Symbol.asyncIterator]();
349389
const ev = await iter.next();
@@ -352,12 +392,21 @@ describe('createSseClient', () => {
352392

353393
it('respects custom HTTP method', async () => {
354394
let methodSeen: string | undefined;
355-
fetchMock.mockImplementation(async (_url: any, opts: any) => {
356-
methodSeen = opts.method;
357-
return { body: makeStream(['data: ok\n\n']), ok: true };
358-
});
395+
fetchMock.mockImplementation(
396+
async (input: RequestInfo, init?: RequestInit) => {
397+
const req = toRequest(input, init);
398+
methodSeen = req.method;
399+
return {
400+
body: makeStream(['data: ok\n\n']),
401+
ok: true,
402+
};
403+
},
404+
);
359405

360-
const { stream } = createSseClient({ method: 'POST', url: '/sse' });
406+
const { stream } = createSseClient({
407+
method: 'POST',
408+
url: 'http://localhost/sse',
409+
});
361410
const iter = stream[Symbol.asyncIterator]();
362411
await iter.next();
363412
await iter.return?.();
@@ -374,7 +423,7 @@ describe('createSseClient', () => {
374423
const controller = new AbortController();
375424
const { stream } = createSseClient({
376425
signal: controller.signal,
377-
url: '/sse',
426+
url: 'http://localhost/sse',
378427
});
379428

380429
const iter = stream[Symbol.asyncIterator]();
@@ -397,7 +446,7 @@ describe('createSseClient', () => {
397446
onSseEvent: (ev) => {
398447
lastEventId = ev.id;
399448
},
400-
url: '/sse',
449+
url: 'http://localhost/sse',
401450
});
402451

403452
stream[Symbol.asyncIterator]();
@@ -422,7 +471,7 @@ describe('createSseClient', () => {
422471
onSseError: onError,
423472
sseDefaultRetryDelay: 0,
424473
sseMaxRetryAttempts: 2,
425-
url: '/sse',
474+
url: 'http://localhost/sse',
426475
});
427476

428477
const iter = stream[Symbol.asyncIterator]();
@@ -439,7 +488,10 @@ describe('createSseClient', () => {
439488
fetchMock.mockImplementation(() => {
440489
attempt++;
441490
if (attempt < 3) throw new Error('fail');
442-
return Promise.resolve({ body: makeStream(['data: ok\n\n']), ok: true });
491+
return Promise.resolve({
492+
body: makeStream(['data: ok\n\n']),
493+
ok: true,
494+
});
443495
});
444496

445497
const onError = vi.fn();
@@ -448,7 +500,7 @@ describe('createSseClient', () => {
448500
sseDefaultRetryDelay: 10,
449501
// Inject a fake sleep that resolves instantly
450502
sseSleepFn: async () => {},
451-
url: '/sse',
503+
url: 'http://localhost/sse',
452504
});
453505

454506
const iter = stream[Symbol.asyncIterator]();
@@ -471,7 +523,7 @@ describe('createSseClient', () => {
471523
const { stream } = createSseClient({
472524
onSseError: onError,
473525
sseMaxRetryAttempts: 0,
474-
url: '/sse',
526+
url: 'http://localhost/sse',
475527
});
476528

477529
const iter = stream[Symbol.asyncIterator]();
@@ -494,7 +546,7 @@ describe('createSseClient', () => {
494546

495547
const { stream } = createSseClient({
496548
responseValidator: validator,
497-
url: '/sse',
549+
url: 'http://localhost/sse',
498550
});
499551

500552
const result: any[] = [];
@@ -516,7 +568,7 @@ describe('createSseClient', () => {
516568

517569
const { stream } = createSseClient({
518570
responseTransformer: transformer,
519-
url: '/sse',
571+
url: 'http://localhost/sse',
520572
});
521573

522574
const result: any[] = [];
@@ -546,7 +598,7 @@ describe('createSseClient', () => {
546598
responseValidator: validator,
547599
sseDefaultRetryDelay: 0,
548600
sseMaxRetryAttempts: 1,
549-
url: '/sse',
601+
url: 'http://localhost/sse',
550602
});
551603

552604
const iter = stream[Symbol.asyncIterator]();
@@ -567,7 +619,7 @@ describe('createSseClient', () => {
567619
const { stream } = createSseClient({
568620
responseTransformer: transformer,
569621
responseValidator: validator,
570-
url: '/sse',
622+
url: 'http://localhost/sse',
571623
});
572624

573625
const result: any[] = [];

pnpm-workspace.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,11 @@ packages:
33
- examples/**/*
44
- packages/**/*
55

6+
onlyBuiltDependencies:
7+
- esbuild
8+
- lmdb
9+
- sharp
10+
- unrs-resolver
11+
612
patchedDependencies:
713
vitepress: patches/vitepress.patch

0 commit comments

Comments
 (0)