/** * Copyright (c) Meta Platforms, Inc. and 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 * @jest-environment ./scripts/jest/ReactDOMServerIntegrationEnvironment */ 'use strict'; const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils'); const ReactFeatureFlags = require('shared/ReactFeatureFlags'); let React; let ReactDOM; let ReactDOMClient; let ReactDOMServer; function initModules() { // Reset warning cache. jest.resetModules(); React = require('react'); ReactDOM = require('react-dom'); ReactDOMClient = require('react-dom/client'); ReactDOMServer = require('react-dom/server'); // Make them available to the helpers. return { ReactDOMClient, ReactDOMServer, }; } const {resetModules, itRenders, clientCleanRender} = ReactDOMServerIntegrationUtils(initModules); describe('ReactDOMServerIntegration', () => { beforeEach(() => { resetModules(); }); describe('property to attribute mapping', function () { describe('string properties', function () { itRenders('simple numbers', async render => { const e = await render(
); expect(e.getAttribute('width')).toBe('30'); }); itRenders('simple strings', async render => { const e = await render(
); expect(e.getAttribute('width')).toBe('30'); }); itRenders('empty src on img', async render => { const e = await render( , ReactFeatureFlags.enableFilterEmptyStringAttributesDOM ? 1 : 0, ); expect(e.getAttribute('src')).toBe( ReactFeatureFlags.enableFilterEmptyStringAttributesDOM ? null : '', ); }); itRenders('empty href on anchor', async render => { const e = await render(); expect(e.getAttribute('href')).toBe(''); }); itRenders('empty href on other tags', async render => { const e = await render( // would be more sensible. // However, that results in a hydration warning as well. // Our test helpers do not support different error counts for initial // server render and hydration. // The number of errors on the server need to be equal to the number of // errors during hydration. // So we use a
instead.
, ReactFeatureFlags.enableFilterEmptyStringAttributesDOM ? 1 : 0, ); expect(e.getAttribute('href')).toBe( ReactFeatureFlags.enableFilterEmptyStringAttributesDOM ? null : '', ); }); itRenders('no string prop with true value', async render => { const e = await render(, 1); expect(e.hasAttribute('href')).toBe(false); }); itRenders('no string prop with false value', async render => { const e = await render(, 1); expect(e.hasAttribute('href')).toBe(false); }); itRenders('no string prop with null value', async render => { const e = await render(
); expect(e.hasAttribute('width')).toBe(false); }); itRenders('no string prop with function value', async render => { const e = await render(
, 1); expect(e.hasAttribute('width')).toBe(false); }); itRenders('no string prop with symbol value', async render => { const e = await render(
, 1); expect(e.hasAttribute('width')).toBe(false); }); }); describe('boolean properties', function () { itRenders('boolean prop with true value', async render => { const e = await render(