Skip to content

Commit a78aa19

Browse files
committed
test: tests for waitFor
1 parent 23ab450 commit a78aa19

File tree

1 file changed

+105
-62
lines changed

1 file changed

+105
-62
lines changed

packages/fetch-mock/src/__tests__/FetchMock/response-negotiation.test.js

+105-62
Original file line numberDiff line numberDiff line change
@@ -42,79 +42,122 @@ describe('response negotiation', () => {
4242
expect(res.status).toEqual(200);
4343
expect(await res.text()).toEqual('test: http://a.com/');
4444
});
45-
46-
it('delay', async () => {
47-
fm.route('*', 200, { delay: 20 });
48-
const req = fm.fetchHandler('http://a.com/');
49-
let resolved = false;
50-
req.then(() => {
51-
resolved = true;
45+
describe('delay', () => {
46+
it('delay', async () => {
47+
fm.route('*', 200, { delay: 20 });
48+
const req = fm.fetchHandler('http://a.com/');
49+
let resolved = false;
50+
req.then(() => {
51+
resolved = true;
52+
});
53+
await new Promise((res) => setTimeout(res, 10));
54+
expect(resolved).toBe(false);
55+
await new Promise((res) => setTimeout(res, 11));
56+
expect(resolved).toBe(true);
57+
const res = await req;
58+
expect(res.status).toEqual(200);
5259
});
53-
await new Promise((res) => setTimeout(res, 10));
54-
expect(resolved).toBe(false);
55-
await new Promise((res) => setTimeout(res, 11));
56-
expect(resolved).toBe(true);
57-
const res = await req;
58-
expect(res.status).toEqual(200);
59-
});
6060

61-
it("delay a function response's execution", async () => {
62-
const startTimestamp = new Date().getTime();
63-
fm.route('http://a.com/', () => ({ timestamp: new Date().getTime() }), {
64-
delay: 20,
61+
it("delay a function response's execution", async () => {
62+
const startTimestamp = new Date().getTime();
63+
fm.route('http://a.com/', () => ({ timestamp: new Date().getTime() }), {
64+
delay: 20,
65+
});
66+
const req = fm.fetchHandler('http://a.com/');
67+
let resolved = false;
68+
req.then(() => {
69+
resolved = true;
70+
});
71+
await new Promise((res) => setTimeout(res, 10));
72+
expect(resolved).toBe(false);
73+
await new Promise((res) => setTimeout(res, 11));
74+
expect(resolved).toBe(true);
75+
const res = await req;
76+
expect(res.status).toEqual(200);
77+
const responseTimestamp = (await res.json()).timestamp;
78+
expect(responseTimestamp - startTimestamp).toBeGreaterThanOrEqual(20);
6579
});
66-
const req = fm.fetchHandler('http://a.com/');
67-
let resolved = false;
68-
req.then(() => {
69-
resolved = true;
80+
81+
it('pass values to delayed function', async () => {
82+
fm.route('*', ({ url }) => `delayed: ${url}`, {
83+
delay: 10,
84+
});
85+
const req = fm.fetchHandler('http://a.com/');
86+
await new Promise((res) => setTimeout(res, 11));
87+
const res = await req;
88+
expect(res.status).toEqual(200);
89+
expect(await res.text()).toEqual('delayed: http://a.com/');
7090
});
71-
await new Promise((res) => setTimeout(res, 10));
72-
expect(resolved).toBe(false);
73-
await new Promise((res) => setTimeout(res, 11));
74-
expect(resolved).toBe(true);
75-
const res = await req;
76-
expect(res.status).toEqual(200);
77-
const responseTimestamp = (await res.json()).timestamp;
78-
expect(responseTimestamp - startTimestamp).toBeGreaterThanOrEqual(20);
79-
});
8091

81-
it('pass values to delayed function', async () => {
82-
fm.route('*', ({ url }) => `delayed: ${url}`, {
83-
delay: 10,
92+
it('call delayed response multiple times, each with the same delay', async () => {
93+
fm.route('*', 200, { delay: 20 });
94+
const req1 = fm.fetchHandler('http://a.com/');
95+
let resolved = false;
96+
req1.then(() => {
97+
resolved = true;
98+
});
99+
await new Promise((res) => setTimeout(res, 10));
100+
expect(resolved).toBe(false);
101+
await new Promise((res) => setTimeout(res, 11));
102+
expect(resolved).toBe(true);
103+
const res1 = await req1;
104+
expect(res1.status).toEqual(200);
105+
const req2 = fm.fetchHandler('http://a.com/');
106+
resolved = false;
107+
req2.then(() => {
108+
resolved = true;
109+
});
110+
await new Promise((res) => setTimeout(res, 10));
111+
expect(resolved).toBe(false);
112+
await new Promise((res) => setTimeout(res, 11));
113+
expect(resolved).toBe(true);
114+
const res2 = await req2;
115+
expect(res2.status).toEqual(200);
84116
});
85-
const req = fm.fetchHandler('http://a.com/');
86-
await new Promise((res) => setTimeout(res, 11));
87-
const res = await req;
88-
expect(res.status).toEqual(200);
89-
expect(await res.text()).toEqual('delayed: http://a.com/');
90117
});
91118

92-
it('call delayed response multiple times, each with the same delay', async () => {
93-
fm.route('*', 200, { delay: 20 });
94-
const req1 = fm.fetchHandler('http://a.com/');
95-
let resolved = false;
96-
req1.then(() => {
97-
resolved = true;
119+
describe('waitFor', () => {
120+
it('Error informatively if route to wait for does not exist', () => {
121+
expect(() => fm.route('*', 200, { waitFor: 'huh' })).toThrow(
122+
'no way on your nelly',
123+
);
98124
});
99-
await new Promise((res) => setTimeout(res, 10));
100-
expect(resolved).toBe(false);
101-
await new Promise((res) => setTimeout(res, 11));
102-
expect(resolved).toBe(true);
103-
const res1 = await req1;
104-
expect(res1.status).toEqual(200);
105-
const req2 = fm.fetchHandler('http://a.com/');
106-
resolved = false;
107-
req2.then(() => {
108-
resolved = true;
125+
it('Not respond until waited for route responds', async () => {
126+
fm.route('http://a.com', 200, 'route-a').route('http://b.com', 200, {
127+
waitFor: 'route-a',
128+
});
129+
let lastRouteCalled;
130+
await Promise.all([
131+
fm.fetchHandler('http://b.com').then(() => (lastRouteCalled = 'b')),
132+
fm.fetchHandler('http://a.com').then(() => (lastRouteCalled = 'a')),
133+
]);
134+
expect(lastRouteCalled).toEqual('b');
135+
});
136+
it('Can have multiple waits on the same route', async () => {
137+
fm.route('http://a.com', 200, 'route-a')
138+
.route('http://b.com', 200, { waitFor: 'route-a' })
139+
.route('http://c.com', 200, { waitFor: 'route-a' });
140+
let routesCalled = [];
141+
await Promise.all([
142+
fm.fetchHandler('http://c.com').then(() => routesCalled.push('c')),
143+
fm.fetchHandler('http://b.com').then(() => routesCalled.push('b')),
144+
fm.fetchHandler('http://a.com').then(() => routesCalled.push('a')),
145+
]);
146+
expect(routesCalled).toEqual(['a', 'c', 'b']);
147+
});
148+
it('Can chain waits', async () => {
149+
fm.route('http://a.com', 200, 'route-a')
150+
.route('http://b.com', 200, { name: 'route-b', waitFor: 'route-a' })
151+
.route('http://c.com', 200, { waitFor: 'route-b' });
152+
let routesCalled = [];
153+
await Promise.all([
154+
fm.fetchHandler('http://c.com').then(() => routesCalled.push('c')),
155+
fm.fetchHandler('http://b.com').then(() => routesCalled.push('b')),
156+
fm.fetchHandler('http://a.com').then(() => routesCalled.push('a')),
157+
]);
158+
expect(routesCalled).toEqual(['a', 'b', 'c']);
109159
});
110-
await new Promise((res) => setTimeout(res, 10));
111-
expect(resolved).toBe(false);
112-
await new Promise((res) => setTimeout(res, 11));
113-
expect(resolved).toBe(true);
114-
const res2 = await req2;
115-
expect(res2.status).toEqual(200);
116160
});
117-
118161
it('Response', async () => {
119162
fm.route('http://a.com/', new Response('http://a.com/', { status: 200 }));
120163
const res = await fm.fetchHandler('http://a.com/');

0 commit comments

Comments
 (0)