Skip to content

Commit 2ee1ee7

Browse files
authored
chore: use modern APIs in tests (#397)
1 parent c7fd533 commit 2ee1ee7

File tree

6 files changed

+85
-24
lines changed

6 files changed

+85
-24
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "none",
3+
"comment": "chore: use modern APIs in tests",
4+
"packageName": "@griffel/react",
5+
"email": "olfedias@microsoft.com",
6+
"dependentChangeType": "none"
7+
}

packages/react/jest.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ export default {
55
transform: {
66
'^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/react/babel'] }],
77
},
8+
globals: {
9+
IS_REACT_ACT_ENVIRONMENT: true,
10+
},
811
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
912
coverageDirectory: '../../coverage/packages/react',
1013
};

packages/react/src/createDOMRenderer.test.tsx

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { createDOMRenderer, mergeClasses } from '@griffel/core';
22
import * as React from 'react';
3-
import { hydrate } from 'react-dom';
3+
import { hydrateRoot } from 'react-dom/client';
44
import { renderToStaticMarkup } from 'react-dom/server';
5+
import { act } from 'react-dom/test-utils';
56

67
import { makeStyles } from './makeStyles';
78
import { makeResetStyles } from './makeResetStyles';
@@ -52,6 +53,17 @@ describe('createDOMRenderer', () => {
5253
);
5354
const stylesHTML = renderToStaticMarkup(<>{renderToStyleElements(serverRenderer)}</>);
5455

56+
// Ensure that all styles are inserted into the cache
57+
expect(serverRenderer.insertionCache).toMatchInlineSnapshot(`
58+
Object {
59+
".f1p9cr64{animation-name:f1kgwxhb;}": "d",
60+
".fe3e8s9{color:red;}": "d",
61+
".rp2atum:hover{color:blue;}": "r",
62+
".rp2atum{color:red;}": "r",
63+
"@keyframes f1kgwxhb{from{height:10px;}to{height:20px;}}": "k",
64+
"@media screen and (max-width: 992px){.fnao3vb:hover{color:blue;}}": "m",
65+
}
66+
`);
5567
// There is no DOM on a server, style nodes should not be present
5668
expect(document.querySelector('style')).toBe(null);
5769

@@ -61,6 +73,7 @@ describe('createDOMRenderer', () => {
6173
//
6274

6375
const container = document.createElement('div');
76+
6477
document.body.appendChild(container);
6578

6679
container.innerHTML = componentHTML;
@@ -73,13 +86,15 @@ describe('createDOMRenderer', () => {
7386
jest.spyOn(styleEl.sheet!, 'insertRule'),
7487
);
7588

76-
hydrate(
77-
// "RendererProvider" is not required there, we need it only for Jest spies
78-
<RendererProvider renderer={clientRenderer}>
79-
<ExampleComponent />
80-
</RendererProvider>,
81-
container,
82-
);
89+
act(() => {
90+
hydrateRoot(
91+
container,
92+
// "RendererProvider" is not required there, we need it only for Jest spies
93+
<RendererProvider renderer={clientRenderer}>
94+
<ExampleComponent />
95+
</RendererProvider>,
96+
);
97+
});
8398

8499
const styleElementsAfterHydration = document.querySelectorAll<HTMLStyleElement>('style');
85100

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import * as React from 'react';
2+
import { createRoot } from 'react-dom/client';
3+
import { act } from 'react-dom/test-utils';
4+
5+
import { makeResetStyles } from './makeResetStyles';
6+
7+
describe('makeResetStyles', () => {
8+
it('works outside of React components', () => {
9+
expect(() => makeResetStyles({ root: { color: 'red' } })).not.toThrow();
10+
});
11+
12+
it('throws inside React components', () => {
13+
// eslint-disable-next-line @typescript-eslint/no-empty-function
14+
jest.spyOn(console, 'error').mockImplementation(() => {});
15+
16+
const Example: React.FC = () => {
17+
makeResetStyles({ color: 'red' });
18+
return null;
19+
};
20+
const root = createRoot(document.createElement('div'));
21+
22+
expect(() => act(() => root.render(<Example />))).toThrow(/All makeResetStyles\(\) calls should be top level/);
23+
24+
// Should not throw outside React components after rendering
25+
expect(() => makeResetStyles({ color: 'red' })).not.toThrow();
26+
});
27+
});

packages/react/src/makeStyles.test.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as React from 'react';
2-
import * as ReactDOM from 'react-dom';
2+
import { createRoot } from 'react-dom/client';
3+
import { act } from 'react-dom/test-utils';
34

45
import { makeStyles } from './makeStyles';
56

@@ -16,9 +17,9 @@ describe('makeStyles', () => {
1617
makeStyles({ root: { color: 'red' } });
1718
return null;
1819
};
19-
const container = document.createElement('div');
20+
const root = createRoot(document.createElement('div'));
2021

21-
expect(() => ReactDOM.render(<Example />, container)).toThrow(/All makeStyles\(\) calls should be top level/);
22+
expect(() => act(() => root.render(<Example />))).toThrow(/All makeStyles\(\) calls should be top level/);
2223

2324
// Should not throw outside React components after rendering
2425
expect(() => makeStyles({ root: { color: 'red' } })).not.toThrow();

packages/react/src/renderToStyleElements.test.tsx

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { createDOMRenderer, GriffelRenderer } from '@griffel/core';
22
import * as prettier from 'prettier';
33
import * as React from 'react';
4-
import * as ReactDOM from 'react-dom/server';
4+
import { createRoot } from 'react-dom/client';
5+
import { renderToStaticMarkup } from 'react-dom/server';
6+
import { act } from 'react-dom/test-utils';
57

68
import { makeStyles } from './makeStyles';
79
import { makeResetStyles } from './makeResetStyles';
@@ -43,14 +45,17 @@ describe('renderToStyleElements (DOM)', () => {
4345

4446
return <div className={classes.root} />;
4547
};
48+
const root = createRoot(document.createElement('div'));
4649

47-
ReactDOM.renderToStaticMarkup(
48-
<RendererProvider renderer={renderer}>
49-
<ExampleComponent />
50-
</RendererProvider>,
51-
);
50+
act(() => {
51+
root.render(
52+
<RendererProvider renderer={renderer}>
53+
<ExampleComponent />
54+
</RendererProvider>,
55+
);
56+
});
5257

53-
expect(ReactDOM.renderToStaticMarkup(<>{renderToStyleElements(renderer)}</>)).toMatchInlineSnapshot(`
58+
expect(renderToStaticMarkup(<>{renderToStyleElements(renderer)}</>)).toMatchInlineSnapshot(`
5459
<style data-make-styles-bucket="d" data-make-styles-rehydration="true">
5560
.fe3e8s9 {
5661
color: red;
@@ -71,14 +76,17 @@ describe('renderToStyleElements (DOM)', () => {
7176
const ExampleComponent: React.FC = () => {
7277
return <div className={useClassName()} />;
7378
};
79+
const root = createRoot(document.createElement('div'));
7480

75-
ReactDOM.renderToStaticMarkup(
76-
<RendererProvider renderer={renderer}>
77-
<ExampleComponent />
78-
</RendererProvider>,
79-
);
81+
act(() => {
82+
root.render(
83+
<RendererProvider renderer={renderer}>
84+
<ExampleComponent />
85+
</RendererProvider>,
86+
);
87+
});
8088

81-
expect(ReactDOM.renderToStaticMarkup(<>{renderToStyleElements(renderer)}</>)).toMatchInlineSnapshot(`
89+
expect(renderToStaticMarkup(<>{renderToStyleElements(renderer)}</>)).toMatchInlineSnapshot(`
8290
<style data-make-styles-bucket="r" data-make-styles-rehydration="true">
8391
.r1tsu58y {
8492
color: red;

0 commit comments

Comments
 (0)