Skip to content

Commit 8b8f20e

Browse files
hiebjastone123
andauthored
fix: cypress/react18 rerender (#23360)
Co-authored-by: astone123 <adams@cypress.io>
1 parent 8e4ebef commit 8b8f20e

10 files changed

+523
-94
lines changed

npm/react18/src/index.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ import type {
1111
UnmountArgs,
1212
} from '@cypress/react'
1313

14-
let root: any
14+
let root: ReactDOM.Root | null
1515

1616
const cleanup = () => {
1717
if (root) {
1818
root.unmount()
1919

20+
root = null
21+
2022
return true
2123
}
2224

@@ -27,7 +29,9 @@ export function mount (jsx: React.ReactNode, options: MountOptions = {}, rerende
2729
const internalOptions: InternalMountOptions = {
2830
reactDom: ReactDOM,
2931
render: (reactComponent: ReturnType<typeof React.createElement>, el: HTMLElement) => {
30-
root = ReactDOM.createRoot(el)
32+
if (!root) {
33+
root = ReactDOM.createRoot(el)
34+
}
3135

3236
return root.render(reactComponent)
3337
},

system-tests/__snapshots__/component_testing_spec.ts.js

+170-26
Large diffs are not rendered by default.

system-tests/__snapshots__/vite_dev_server_fresh_spec.ts.js

+132-27
Large diffs are not rendered by default.

system-tests/__snapshots__/webpack_dev_server_fresh_spec.ts.js

+175-35
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import React from 'react';
2+
3+
function StatefulComponent ({ foo }) {
4+
const [bar, setBar] = React.useState(0);
5+
return (
6+
<button
7+
onClick={() => {
8+
setBar(bar + 1);
9+
}}
10+
>
11+
{foo} {bar}
12+
</button>
13+
);
14+
};
15+
16+
describe('re-render', () => {
17+
it('maintains component state across re-renders', () => {
18+
cy.mount(<StatefulComponent foo="baz" />).then(({ rerender }) => {
19+
cy.get('button').should('have.text', 'baz 0');
20+
cy.get('button').click().should('have.text', 'baz 1');
21+
rerender(<StatefulComponent foo="baz" />)
22+
23+
// The button should still show 1 after re-render
24+
cy.get('button').should('have.text', 'baz 1');
25+
});
26+
});
27+
});
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
const {defineConfig} = require('vite')
22

33
module.exports = defineConfig({
4+
resolve: {
5+
alias: {
6+
'react': require.resolve('react'),
7+
'react-dom': require.resolve('react-dom'),
8+
},
9+
},
410
logLevel: 'silent'
511
})

system-tests/projects/react17/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"dependencies": {
33
"react": "17.0.2",
4-
"react-dom": " 17.0.2"
4+
"react-dom": "17.0.2"
55
},
66
"devDependencies": {
77
"@vitejs/plugin-react": "^1.3.2",

system-tests/projects/react17/yarn.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -2345,7 +2345,7 @@ randomfill@^1.0.3:
23452345
randombytes "^2.0.5"
23462346
safe-buffer "^5.1.0"
23472347

2348-
"react-dom@ 17.0.2":
2348+
react-dom@17.0.2:
23492349
version "17.0.2"
23502350
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
23512351
integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==

system-tests/test/component_testing_spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ describe(`React major versions with Vite`, function () {
7979
return systemTests.exec(this, {
8080
project: `react${majorVersion}`,
8181
configFile: 'cypress-vite.config.ts',
82-
spec: 'src/App.cy.jsx,src/Unmount.cy.jsx,src/UsingLegacyMount.cy.jsx',
82+
spec: 'src/App.cy.jsx,src/Unmount.cy.jsx,src/UsingLegacyMount.cy.jsx,src/Rerendering.cy.jsx',
8383
testingType: 'component',
8484
browser: 'chrome',
8585
snapshot: true,
@@ -97,7 +97,7 @@ describe(`React major versions with Webpack`, function () {
9797
return systemTests.exec(this, {
9898
project: `react${majorVersion}`,
9999
configFile: 'cypress-webpack.config.ts',
100-
spec: 'src/App.cy.jsx,src/Unmount.cy.jsx,src/UsingLegacyMount.cy.jsx',
100+
spec: 'src/App.cy.jsx,src/Unmount.cy.jsx,src/UsingLegacyMount.cy.jsx,src/Rerendering.cy.jsx',
101101
testingType: 'component',
102102
browser: 'chrome',
103103
snapshot: true,

system-tests/test/vite_dev_server_fresh_spec.ts

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ describe('@cypress/vite-dev-server', function () {
1818
browser: 'chrome',
1919
snapshot: true,
2020
expectedExitCode: 3,
21+
onStdout: (stdout) => {
22+
return stdout.replace(/http:\/\/localhost:\d+/g, 'http://localhost:xxxx')
23+
},
2124
})
2225
})
2326
}

0 commit comments

Comments
 (0)