Skip to content

Commit f38c355

Browse files
authored
[Fiber] Make server rendering tests pass (#8372)
* Use the public ReactDOMServer in tests We need this because it runs the injection. * Let Fiber skip react data attributes and comments in SSR tests This markup is testing implementation details rather than behavior.
1 parent c7129ce commit f38c355

File tree

5 files changed

+63
-51
lines changed

5 files changed

+63
-51
lines changed

scripts/fiber/tests-failing.txt

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -108,24 +108,6 @@ src/renderers/dom/stack/client/__tests__/ReactRenderDocument-test.js
108108
* should throw on full document render w/ no markup
109109
* supports findDOMNode on full-page components
110110

111-
src/renderers/dom/stack/server/__tests__/ReactServerRendering-test.js
112-
* should generate simple markup
113-
* should generate simple markup for self-closing tags
114-
* should generate simple markup for attribute with `>` symbol
115-
* should generate comment markup for component returns null
116-
* should render composite components
117-
* should only execute certain lifecycle methods
118-
* should have the correct mounting behavior
119-
* should not put checksum and React ID on components
120-
* should not put checksum and React ID on text components
121-
* should only execute certain lifecycle methods
122-
* allows setState in componentWillMount without using DOM
123-
* renders components with different batching strategies
124-
* warns with a no-op when an async setState is triggered
125-
* warns with a no-op when an async replaceState is triggered
126-
* warns with a no-op when an async forceUpdate is triggered
127-
* should warn when children are mutated during render
128-
129111
src/renderers/shared/__tests__/ReactPerf-test.js
130112
* should count no-op update as waste
131113
* should count no-op update in child as waste
@@ -150,7 +132,6 @@ src/renderers/shared/stack/reconciler/__tests__/ReactComponentLifeCycle-test.js
150132
* should carry through each of the phases of setup
151133

152134
src/renderers/shared/stack/reconciler/__tests__/ReactCompositeComponent-test.js
153-
* should not thrash a server rendered layout with client side one
154135
* should warn about `forceUpdate` on unmounted components
155136
* should warn about `setState` on unmounted components
156137
* should warn about `setState` in render

scripts/fiber/tests-passing-except-dev.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ src/renderers/dom/stack/client/__tests__/ReactMountDestruction-test.js
6565
* should warn when unmounting a non-container root node
6666
* should warn when unmounting a non-container, non-root node
6767

68+
src/renderers/dom/stack/server/__tests__/ReactServerRendering-test.js
69+
* should have the correct mounting behavior
70+
6871
src/renderers/shared/hooks/__tests__/ReactComponentTreeHook-test.js
6972
* uses displayName or Unknown for classic components
7073
* uses displayName, name, or ReactComponent for modern components

scripts/fiber/tests-passing.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,8 +919,23 @@ src/renderers/dom/stack/client/__tests__/findDOMNode-test.js
919919
* findDOMNode should not throw an error when called within a component that is not mounted
920920

921921
src/renderers/dom/stack/server/__tests__/ReactServerRendering-test.js
922+
* should generate simple markup
923+
* should generate simple markup for self-closing tags
924+
* should generate simple markup for attribute with `>` symbol
925+
* should generate comment markup for component returns null
926+
* should render composite components
927+
* should only execute certain lifecycle methods
922928
* should throw with silly args
929+
* should not put checksum and React ID on components
930+
* should not put checksum and React ID on text components
931+
* should only execute certain lifecycle methods
923932
* should throw with silly args
933+
* allows setState in componentWillMount without using DOM
934+
* renders components with different batching strategies
935+
* warns with a no-op when an async setState is triggered
936+
* warns with a no-op when an async replaceState is triggered
937+
* warns with a no-op when an async forceUpdate is triggered
938+
* should warn when children are mutated during render
924939

925940
src/renderers/native/__tests__/ReactNativeAttributePayload-test.js
926941
* should work with simple example
@@ -1231,6 +1246,7 @@ src/renderers/shared/stack/reconciler/__tests__/ReactComponentLifeCycle-test.js
12311246
src/renderers/shared/stack/reconciler/__tests__/ReactCompositeComponent-test.js
12321247
* should support module pattern components
12331248
* should support rendering to different child types over time
1249+
* should not thrash a server rendered layout with client side one
12341250
* should react to state changes from callbacks
12351251
* should rewire refs when rendering to different child types
12361252
* should not cache old DOM nodes when switching constructors

src/renderers/dom/stack/server/__tests__/ReactServerRendering-test.js

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,28 @@
1414
var ExecutionEnvironment;
1515
var React;
1616
var ReactDOM;
17+
var ReactDOMFeatureFlags;
18+
var ReactDOMServer;
1719
var ReactMarkupChecksum;
1820
var ReactReconcileTransaction;
1921
var ReactTestUtils;
20-
var ReactServerRendering;
2122

2223
var ID_ATTRIBUTE_NAME;
2324
var ROOT_ATTRIBUTE_NAME;
2425

25-
describe('ReactServerRendering', () => {
26+
describe('ReactDOMServer', () => {
2627
beforeEach(() => {
2728
jest.resetModuleRegistry();
2829
React = require('React');
2930
ReactDOM = require('ReactDOM');
31+
ReactDOMFeatureFlags = require('ReactDOMFeatureFlags');
3032
ReactMarkupChecksum = require('ReactMarkupChecksum');
3133
ReactTestUtils = require('ReactTestUtils');
3234
ReactReconcileTransaction = require('ReactReconcileTransaction');
3335

3436
ExecutionEnvironment = require('ExecutionEnvironment');
3537
ExecutionEnvironment.canUseDOM = false;
36-
ReactServerRendering = require('ReactServerRendering');
38+
ReactDOMServer = require('ReactDOMServer');
3739

3840
var DOMProperty = require('DOMProperty');
3941
ID_ATTRIBUTE_NAME = DOMProperty.ID_ATTRIBUTE_NAME;
@@ -42,7 +44,7 @@ describe('ReactServerRendering', () => {
4244

4345
describe('renderToString', () => {
4446
it('should generate simple markup', () => {
45-
var response = ReactServerRendering.renderToString(
47+
var response = ReactDOMServer.renderToString(
4648
<span>hello world</span>
4749
);
4850
expect(response).toMatch(new RegExp(
@@ -53,7 +55,7 @@ describe('ReactServerRendering', () => {
5355
});
5456

5557
it('should generate simple markup for self-closing tags', () => {
56-
var response = ReactServerRendering.renderToString(
58+
var response = ReactDOMServer.renderToString(
5759
<img />
5860
);
5961
expect(response).toMatch(new RegExp(
@@ -64,7 +66,7 @@ describe('ReactServerRendering', () => {
6466
});
6567

6668
it('should generate simple markup for attribute with `>` symbol', () => {
67-
var response = ReactServerRendering.renderToString(
69+
var response = ReactDOMServer.renderToString(
6870
<img data-attr=">" />
6971
);
7072
expect(response).toMatch(new RegExp(
@@ -81,7 +83,7 @@ describe('ReactServerRendering', () => {
8183
}
8284
}
8385

84-
var response = ReactServerRendering.renderToString(<NullComponent />);
86+
var response = ReactDOMServer.renderToString(<NullComponent />);
8587
expect(response).toBe('<!-- react-empty: 1 -->');
8688
});
8789

@@ -100,7 +102,7 @@ describe('ReactServerRendering', () => {
100102
}
101103
}
102104

103-
var response = ReactServerRendering.renderToString(
105+
var response = ReactDOMServer.renderToString(
104106
<Parent />
105107
);
106108
expect(response).toMatch(new RegExp(
@@ -160,7 +162,7 @@ describe('ReactServerRendering', () => {
160162
}
161163
}
162164

163-
var response = ReactServerRendering.renderToString(
165+
var response = ReactDOMServer.renderToString(
164166
<TestComponent />
165167
);
166168

@@ -233,15 +235,25 @@ describe('ReactServerRendering', () => {
233235
expect(element.innerHTML).toEqual('');
234236

235237
ExecutionEnvironment.canUseDOM = false;
236-
lastMarkup = ReactServerRendering.renderToString(
238+
lastMarkup = ReactDOMServer.renderToString(
237239
<TestComponent name="x" />
238240
);
239241
ExecutionEnvironment.canUseDOM = true;
240242
element.innerHTML = lastMarkup;
241243

242244
var instance = ReactDOM.render(<TestComponent name="x" />, element);
243245
expect(mountCount).toEqual(3);
244-
expect(element.innerHTML).toBe(lastMarkup);
246+
247+
var expectedMarkup = lastMarkup;
248+
if (ReactDOMFeatureFlags.useFiber) {
249+
var reactMetaData = /\s+data-react[a-z-]+=\"[^\"]*\"/g;
250+
var reactComments = /<!-- \/?react-text(: \d+)? -->/g;
251+
expectedMarkup =
252+
expectedMarkup
253+
.replace(reactMetaData, '')
254+
.replace(reactComments, '');
255+
}
256+
expect(element.innerHTML).toBe(expectedMarkup);
245257

246258
// Ensure the events system works after mount into server markup
247259
expect(numClicks).toEqual(0);
@@ -269,8 +281,8 @@ describe('ReactServerRendering', () => {
269281

270282
it('should throw with silly args', () => {
271283
expect(
272-
ReactServerRendering.renderToString.bind(
273-
ReactServerRendering,
284+
ReactDOMServer.renderToString.bind(
285+
ReactDOMServer,
274286
'not a component'
275287
)
276288
).toThrowError(
@@ -293,7 +305,7 @@ describe('ReactServerRendering', () => {
293305
}
294306
}
295307

296-
var response = ReactServerRendering.renderToStaticMarkup(
308+
var response = ReactDOMServer.renderToStaticMarkup(
297309
<TestComponent />
298310
);
299311

@@ -307,7 +319,7 @@ describe('ReactServerRendering', () => {
307319
}
308320
}
309321

310-
var response = ReactServerRendering.renderToStaticMarkup(
322+
var response = ReactDOMServer.renderToStaticMarkup(
311323
<TestComponent />
312324
);
313325

@@ -359,7 +371,7 @@ describe('ReactServerRendering', () => {
359371
}
360372
}
361373

362-
var response = ReactServerRendering.renderToStaticMarkup(
374+
var response = ReactDOMServer.renderToStaticMarkup(
363375
<TestComponent />
364376
);
365377

@@ -378,8 +390,8 @@ describe('ReactServerRendering', () => {
378390

379391
it('should throw with silly args', () => {
380392
expect(
381-
ReactServerRendering.renderToStaticMarkup.bind(
382-
ReactServerRendering,
393+
ReactDOMServer.renderToStaticMarkup.bind(
394+
ReactDOMServer,
383395
'not a component'
384396
)
385397
).toThrowError(
@@ -402,7 +414,7 @@ describe('ReactServerRendering', () => {
402414
// We shouldn't ever be calling this on the server
403415
throw new Error('Browser reconcile transaction should not be used');
404416
};
405-
var markup = ReactServerRendering.renderToString(
417+
var markup = ReactDOMServer.renderToString(
406418
<Component />
407419
);
408420
expect(markup.indexOf('hello, world') >= 0).toBe(true);
@@ -411,7 +423,7 @@ describe('ReactServerRendering', () => {
411423
it('renders components with different batching strategies', () => {
412424
class StaticComponent extends React.Component {
413425
render() {
414-
const staticContent = ReactServerRendering.renderToStaticMarkup(
426+
const staticContent = ReactDOMServer.renderToStaticMarkup(
415427
<div>
416428
<img src="foo-bar.jpg" />
417429
</div>
@@ -431,8 +443,8 @@ describe('ReactServerRendering', () => {
431443
}
432444

433445
expect(
434-
ReactServerRendering.renderToString.bind(
435-
ReactServerRendering,
446+
ReactDOMServer.renderToString.bind(
447+
ReactDOMServer,
436448
<div>
437449
<StaticComponent />
438450
<Component />
@@ -456,15 +468,15 @@ describe('ReactServerRendering', () => {
456468
}
457469

458470
spyOn(console, 'error');
459-
ReactServerRendering.renderToString(<Foo />);
471+
ReactDOMServer.renderToString(<Foo />);
460472
jest.runOnlyPendingTimers();
461473
expectDev(console.error.calls.count()).toBe(1);
462474
expectDev(console.error.calls.mostRecent().args[0]).toBe(
463475
'Warning: setState(...): Can only update a mounting component.' +
464476
' This usually means you called setState() outside componentWillMount() on the server.' +
465477
' This is a no-op. Please check the code for the Foo component.'
466478
);
467-
var markup = ReactServerRendering.renderToStaticMarkup(<Foo />);
479+
var markup = ReactDOMServer.renderToStaticMarkup(<Foo />);
468480
expect(markup).toBe('<div>hello</div>');
469481
});
470482

@@ -482,15 +494,15 @@ describe('ReactServerRendering', () => {
482494
});
483495

484496
spyOn(console, 'error');
485-
ReactServerRendering.renderToString(<Bar />);
497+
ReactDOMServer.renderToString(<Bar />);
486498
jest.runOnlyPendingTimers();
487499
expectDev(console.error.calls.count()).toBe(1);
488500
expectDev(console.error.calls.mostRecent().args[0]).toBe(
489501
'Warning: replaceState(...): Can only update a mounting component. ' +
490502
'This usually means you called replaceState() outside componentWillMount() on the server. ' +
491503
'This is a no-op. Please check the code for the Bar component.'
492504
);
493-
var markup = ReactServerRendering.renderToStaticMarkup(<Bar />);
505+
var markup = ReactDOMServer.renderToStaticMarkup(<Bar />);
494506
expect(markup).toBe('<div>hello</div>');
495507
});
496508

@@ -509,15 +521,15 @@ describe('ReactServerRendering', () => {
509521
}
510522

511523
spyOn(console, 'error');
512-
ReactServerRendering.renderToString(<Baz />);
524+
ReactDOMServer.renderToString(<Baz />);
513525
jest.runOnlyPendingTimers();
514526
expectDev(console.error.calls.count()).toBe(1);
515527
expectDev(console.error.calls.mostRecent().args[0]).toBe(
516528
'Warning: forceUpdate(...): Can only update a mounting component. ' +
517529
'This usually means you called forceUpdate() outside componentWillMount() on the server. ' +
518530
'This is a no-op. Please check the code for the Baz component.'
519531
);
520-
var markup = ReactServerRendering.renderToStaticMarkup(<Baz />);
532+
var markup = ReactDOMServer.renderToStaticMarkup(<Baz />);
521533
expect(markup).toBe('<div></div>');
522534
});
523535

@@ -528,7 +540,7 @@ describe('ReactServerRendering', () => {
528540
return <div>{props.children}</div>;
529541
}
530542
expect(() => {
531-
ReactServerRendering.renderToStaticMarkup(
543+
ReactDOMServer.renderToStaticMarkup(
532544
<Wrapper>
533545
<span key={0}/>
534546
<span key={1}/>

src/renderers/shared/stack/reconciler/__tests__/ReactCompositeComponent-test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ var MorphingComponent;
1616
var React;
1717
var ReactDOM;
1818
var ReactDOMFeatureFlags;
19+
var ReactDOMServer;
1920
var ReactCurrentOwner;
2021
var ReactPropTypes;
21-
var ReactServerRendering;
2222
var ReactTestUtils;
2323

2424
describe('ReactCompositeComponent', () => {
@@ -28,10 +28,10 @@ describe('ReactCompositeComponent', () => {
2828
React = require('React');
2929
ReactDOM = require('ReactDOM');
3030
ReactDOMFeatureFlags = require('ReactDOMFeatureFlags');
31+
ReactDOMServer = require('ReactDOMServer');
3132
ReactCurrentOwner = require('ReactCurrentOwner');
3233
ReactPropTypes = require('ReactPropTypes');
3334
ReactTestUtils = require('ReactTestUtils');
34-
ReactServerRendering = require('ReactServerRendering');
3535

3636
MorphingComponent = class extends React.Component {
3737
state = {activated: false};
@@ -108,7 +108,7 @@ describe('ReactCompositeComponent', () => {
108108
}
109109
}
110110

111-
var markup = ReactServerRendering.renderToString(<Parent />);
111+
var markup = ReactDOMServer.renderToString(<Parent />);
112112
var container = document.createElement('div');
113113
container.innerHTML = markup;
114114

0 commit comments

Comments
 (0)