main
js 90 lines 3 KB
Raw
1 /**
2 * Copyright (c) Meta Platforms, Inc. and 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 import {patchMessageChannel} from '../../../../scripts/jest/patchMessageChannel';
13
14 // Polyfills for test environment
15 global.ReadableStream =
16 require('web-streams-polyfill/ponyfill/es6').ReadableStream;
17 global.TextEncoder = require('util').TextEncoder;
18 global.TextDecoder = require('util').TextDecoder;
19
20 // let serverExports;
21 let assertConsoleErrorDev;
22 let turbopackServerMap;
23 let ReactServerDOMServer;
24 let ReactServerDOMClient;
25 let ReactServerScheduler;
26
27 describe('ReactFlightTurbopackDOMReply', () => {
28 beforeEach(() => {
29 jest.resetModules();
30
31 ReactServerScheduler = require('scheduler');
32 patchMessageChannel(ReactServerScheduler);
33
34 // Simulate the condition resolution
35 jest.mock('react', () => require('react/react.react-server'));
36 jest.mock('react-server-dom-turbopack/server', () =>
37 require('react-server-dom-turbopack/server.browser'),
38 );
39 const TurbopackMock = require('./utils/TurbopackMock');
40 // serverExports = TurbopackMock.serverExports;
41 turbopackServerMap = TurbopackMock.turbopackServerMap;
42 ReactServerDOMServer = require('react-server-dom-turbopack/server.browser');
43 jest.resetModules();
44 jest.mock('react-server-dom-turbopack/client', () =>
45 require('react-server-dom-turbopack/client.browser'),
46 );
47 ReactServerDOMClient = require('react-server-dom-turbopack/client');
48
49 const InternalTestUtils = require('internal-test-utils');
50 assertConsoleErrorDev = InternalTestUtils.assertConsoleErrorDev;
51 });
52
53 it('can encode a reply', async () => {
54 const body = await ReactServerDOMClient.encodeReply({some: 'object'});
55 const decoded = await ReactServerDOMServer.decodeReply(
56 body,
57 turbopackServerMap,
58 );
59
60 expect(decoded).toEqual({some: 'object'});
61 });
62
63 it('warns with a tailored message if eval is not available in dev', async () => {
64 // eslint-disable-next-line no-eval
65 const previousEval = globalThis.eval.bind(globalThis);
66 // eslint-disable-next-line no-eval
67 globalThis.eval = () => {
68 throw new Error('eval is disabled');
69 };
70
71 try {
72 const body = await ReactServerDOMClient.encodeReply({some: 'object'});
73 assertConsoleErrorDev([
74 'eval() is not supported in this environment. ' +
75 'If this page was served with a `Content-Security-Policy` header, ' +
76 'make sure that `unsafe-eval` is included. ' +
77 'React requires eval() in development mode for various debugging features ' +
78 'like reconstructing callstacks from a different environment.\n' +
79 'React will never use eval() in production mode',
80 ]);
81
82 await ReactServerDOMServer.decodeReply(body, turbopackServerMap);
83
84 assertConsoleErrorDev([]);
85 } finally {
86 // eslint-disable-next-line no-eval
87 globalThis.eval = previousEval;
88 }
89 });
90 });