diff --git a/tests/components/ct-react/package.json b/tests/components/ct-react/package.json
index d7012b6af0..abaa43fbd8 100644
--- a/tests/components/ct-react/package.json
+++ b/tests/components/ct-react/package.json
@@ -3,11 +3,14 @@
"version": "0.1.0",
"private": true,
"dependencies": {
+ "react": "^17.0.2",
+ "react-dom": "^17.0.2",
+ "react-router-dom": "^6.4.2"
+ },
+ "devDependencies": {
"@types/node": "^16.11.26",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.13",
- "react": "^17.0.2",
- "react-dom": "^17.0.2",
"react-scripts": "5.0.0",
"typescript": "^4.6.2"
},
diff --git a/tests/components/ct-react/src/App.css b/tests/components/ct-react/src/App.css
deleted file mode 100644
index 74b5e05345..0000000000
--- a/tests/components/ct-react/src/App.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.App {
- text-align: center;
-}
-
-.App-logo {
- height: 40vmin;
- pointer-events: none;
-}
-
-@media (prefers-reduced-motion: no-preference) {
- .App-logo {
- animation: App-logo-spin infinite 20s linear;
- }
-}
-
-.App-header {
- background-color: #282c34;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: calc(10px + 2vmin);
- color: white;
-}
-
-.App-link {
- color: #61dafb;
-}
-
-@keyframes App-logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
diff --git a/tests/components/ct-react/src/App.tsx b/tests/components/ct-react/src/App.tsx
index fa51be8aaa..5f4afe2236 100644
--- a/tests/components/ct-react/src/App.tsx
+++ b/tests/components/ct-react/src/App.tsx
@@ -1,25 +1,20 @@
+import { Routes, Route, Link } from 'react-router-dom';
import logo from './assets/logo.svg';
-import './App.css';
+import LoginPage from './pages/LoginPage';
+import DashboardPage from './pages/DashboardPage';
-function App() {
- return (
-
- );
+export default function App() {
+ return <>
+
+
+ Login
+ Dashboard
+
+
+
+ } />
+ } />
+
+
+ >
}
-
-export default App;
diff --git a/tests/components/ct-react/src/index.js b/tests/components/ct-react/src/index.js
index 9705643d88..34f6873778 100644
--- a/tests/components/ct-react/src/index.js
+++ b/tests/components/ct-react/src/index.js
@@ -1,11 +1,12 @@
import React from 'react';
import ReactDOM from 'react-dom';
-import './App.css';
+import { BrowserRouter } from 'react-router-dom';
import App from './App';
+import './assets/index.css';
ReactDOM.render(
-
+
,
document.getElementById('root')
);
diff --git a/tests/components/ct-react/src/pages/DashboardPage.tsx b/tests/components/ct-react/src/pages/DashboardPage.tsx
new file mode 100644
index 0000000000..64307e87f3
--- /dev/null
+++ b/tests/components/ct-react/src/pages/DashboardPage.tsx
@@ -0,0 +1,3 @@
+export default function DashboardPage() {
+ return Dashboard
+}
diff --git a/tests/components/ct-react/src/pages/LoginPage.tsx b/tests/components/ct-react/src/pages/LoginPage.tsx
new file mode 100644
index 0000000000..96adc431ed
--- /dev/null
+++ b/tests/components/ct-react/src/pages/LoginPage.tsx
@@ -0,0 +1,3 @@
+export default function LoginPage() {
+ return Login
+}
diff --git a/tests/components/ct-react/src/tests.spec.tsx b/tests/components/ct-react/src/tests.spec.tsx
index b1722bedde..9d7c882269 100644
--- a/tests/components/ct-react/src/tests.spec.tsx
+++ b/tests/components/ct-react/src/tests.spec.tsx
@@ -1,5 +1,7 @@
import { test, expect } from '@playwright/experimental-ct-react';
const { serverFixtures } = require('../../../../tests/config/serverFixtures');
+import { BrowserRouter } from 'react-router-dom';
+import App from './App';
import Fetch from './components/Fetch';
import DelayedData from './components/DelayedData';
import Button from './components/Button';
@@ -148,6 +150,15 @@ test('get textContent of the empty fragment', async ({ mount }) => {
await expect(component).toHaveText('');
});
+test('navigate to a page by clicking a link', async ({ page, mount }) => {
+ const component = await mount();
+ await expect(component.getByRole('main')).toHaveText('Login');
+ await expect(page).toHaveURL('/');
+ await component.getByRole('link', { name: 'Dashboard' }).click();
+ await expect(component.getByRole('main')).toHaveText('Dashboard');
+ await expect(page).toHaveURL('/dashboard');
+});
+
const testWithServer = test.extend(serverFixtures);
testWithServer('components routing should go through context', async ({ mount, context, server }) => {
server.setRoute('/hello', (req: any, res: any) => {