mirror of
https://github.com/zebrajr/react.git
synced 2025-12-06 12:20:20 +01:00
* Remove react/unstable_cache We're probably going to make it available via the dispatcher. Let's remove this for now. * Add readContext() to the dispatcher On the server, it will be per-request. On the client, there will be some way to shadow it. For now, I provide it on the server, and throw on the client. * Use readContext() from react-fetch This makes it work on the server (but not on the client until we implement it there.) Updated the test to use Server Components. Now it passes. * Fixture: Add fetch from a Server Component * readCache -> getCacheForType<T> * Add React.unstable_getCacheForType * Add a feature flag * Fix Flow * Add react-suspense-test-utils and port tests * Remove extra Map lookup * Unroll async/await because build system * Add some error coverage and retry * Add unstable_getCacheForType to Flight entry
122 lines
2.8 KiB
JavaScript
122 lines
2.8 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @emails react-core
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
describe('ReactFetchNode', () => {
|
|
let http;
|
|
let fetch;
|
|
let waitForSuspense;
|
|
let server;
|
|
let serverEndpoint;
|
|
let serverImpl;
|
|
|
|
beforeEach(done => {
|
|
jest.resetModules();
|
|
|
|
fetch = require('react-fetch').fetch;
|
|
http = require('http');
|
|
waitForSuspense = require('react-suspense-test-utils').waitForSuspense;
|
|
|
|
server = http.createServer((req, res) => {
|
|
serverImpl(req, res);
|
|
});
|
|
serverEndpoint = null;
|
|
server.listen(() => {
|
|
serverEndpoint = `http://localhost:${server.address().port}/`;
|
|
done();
|
|
});
|
|
});
|
|
|
|
afterEach(done => {
|
|
server.close(done);
|
|
server = null;
|
|
});
|
|
|
|
// @gate experimental
|
|
it('can fetch text from a server component', async () => {
|
|
serverImpl = (req, res) => {
|
|
res.write('mango');
|
|
res.end();
|
|
};
|
|
const text = await waitForSuspense(() => {
|
|
return fetch(serverEndpoint).text();
|
|
});
|
|
expect(text).toEqual('mango');
|
|
});
|
|
|
|
// @gate experimental
|
|
it('can fetch json from a server component', async () => {
|
|
serverImpl = (req, res) => {
|
|
res.write(JSON.stringify({name: 'Sema'}));
|
|
res.end();
|
|
};
|
|
const json = await waitForSuspense(() => {
|
|
return fetch(serverEndpoint).json();
|
|
});
|
|
expect(json).toEqual({name: 'Sema'});
|
|
});
|
|
|
|
// @gate experimental
|
|
it('provides response status', async () => {
|
|
serverImpl = (req, res) => {
|
|
res.write(JSON.stringify({name: 'Sema'}));
|
|
res.end();
|
|
};
|
|
const response = await waitForSuspense(() => {
|
|
return fetch(serverEndpoint);
|
|
});
|
|
expect(response).toMatchObject({
|
|
status: 200,
|
|
statusText: 'OK',
|
|
ok: true,
|
|
});
|
|
});
|
|
|
|
// @gate experimental
|
|
it('handles different paths', async () => {
|
|
serverImpl = (req, res) => {
|
|
switch (req.url) {
|
|
case '/banana':
|
|
res.write('banana');
|
|
break;
|
|
case '/mango':
|
|
res.write('mango');
|
|
break;
|
|
case '/orange':
|
|
res.write('orange');
|
|
break;
|
|
}
|
|
res.end();
|
|
};
|
|
const outputs = await waitForSuspense(() => {
|
|
return [
|
|
fetch(serverEndpoint + 'banana').text(),
|
|
fetch(serverEndpoint + 'mango').text(),
|
|
fetch(serverEndpoint + 'orange').text(),
|
|
];
|
|
});
|
|
expect(outputs).toMatchObject(['banana', 'mango', 'orange']);
|
|
});
|
|
|
|
// @gate experimental
|
|
it('can produce an error', async () => {
|
|
serverImpl = (req, res) => {};
|
|
|
|
expect.assertions(1);
|
|
try {
|
|
await waitForSuspense(() => {
|
|
return fetch('BOOM');
|
|
});
|
|
} catch (err) {
|
|
expect(err.message).toEqual('Invalid URL: BOOM');
|
|
}
|
|
});
|
|
});
|