Skip to content

Commit 0b8547a

Browse files
committed
Add test for the actual AsyncLocalStorage behavior
1 parent 0f29a5b commit 0b8547a

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @emails react-core
8+
*/
9+
10+
'use strict';
11+
12+
// Polyfills for test environment
13+
global.ReadableStream =
14+
require('web-streams-polyfill/ponyfill/es6').ReadableStream;
15+
global.TextEncoder = require('util').TextEncoder;
16+
global.TextDecoder = require('util').TextDecoder;
17+
global.Headers = require('node-fetch').Headers;
18+
global.Request = require('node-fetch').Request;
19+
global.Response = require('node-fetch').Response;
20+
// Patch for Edge environments for global scope
21+
global.AsyncLocalStorage = require('async_hooks').AsyncLocalStorage;
22+
23+
let fetchCount = 0;
24+
async function fetchMock(resource, options) {
25+
fetchCount++;
26+
const request = new Request(resource, options);
27+
return new Response(
28+
request.method +
29+
' ' +
30+
request.url +
31+
' ' +
32+
JSON.stringify(Array.from(request.headers.entries())),
33+
);
34+
}
35+
36+
let React;
37+
let ReactServerDOMServer;
38+
let ReactServerDOMClient;
39+
let use;
40+
let cache;
41+
42+
describe('ReactFetch', () => {
43+
beforeEach(() => {
44+
jest.resetModules();
45+
fetchCount = 0;
46+
global.fetch = fetchMock;
47+
48+
if (gate(flags => !flags.www)) {
49+
jest.mock('react', () => require('react/react.shared-subset'));
50+
}
51+
52+
React = require('react');
53+
ReactServerDOMServer = require('react-server-dom-webpack/server.edge');
54+
ReactServerDOMClient = require('react-server-dom-webpack/client');
55+
use = React.use;
56+
cache = React.cache;
57+
});
58+
59+
async function render(Component) {
60+
const stream = ReactServerDOMServer.renderToReadableStream(<Component />);
61+
return ReactServerDOMClient.createFromReadableStream(stream);
62+
}
63+
64+
// @gate enableFetchInstrumentation && enableCache
65+
it('can dedupe fetches separately in interleaved renders', async () => {
66+
async function getData() {
67+
const r1 = await fetch('hi');
68+
const t1 = await r1.text();
69+
const r2 = await fetch('hi');
70+
const t2 = await r2.text();
71+
return t1 + ' ' + t2;
72+
}
73+
function Component() {
74+
return use(getData());
75+
}
76+
const render1 = render(Component);
77+
const render2 = render(Component);
78+
expect(await render1).toMatchInlineSnapshot(`"GET hi [] GET hi []"`);
79+
expect(await render2).toMatchInlineSnapshot(`"GET hi [] GET hi []"`);
80+
expect(fetchCount).toBe(2);
81+
});
82+
});

0 commit comments

Comments
 (0)