Skip to content

Commit 7e41dba

Browse files
committed
add vitest browser tests
1 parent 4dafa22 commit 7e41dba

File tree

10 files changed

+502
-117
lines changed

10 files changed

+502
-117
lines changed

examples/vite/package.json

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
"scripts": {
77
"start": "vite",
88
"build": "tsc && vite build",
9+
"test": "vitest",
910
"preview": "vite preview",
10-
"postinstall": "msw init"
11+
"postinstall": "msw init",
12+
"test:browser": "vitest --workspace=vitest.workspace.ts"
1113
},
1214
"dependencies": {
1315
"@tanstack/react-query-devtools": "^5.66.11",
@@ -20,10 +22,14 @@
2022
"@types/react": "^19.0.10",
2123
"@types/react-dom": "^19.0.4",
2224
"@vitejs/plugin-react": "^4.3.4",
25+
"@vitest/browser": "^3.0.7",
2326
"msw": "^2.7.3",
27+
"playwright": "^1.50.1",
2428
"sass": "^1.85.1",
2529
"typescript": "^5.8.2",
26-
"vite": "^6.2.0"
30+
"vite": "^6.2.0",
31+
"vitest": "^3.0.7",
32+
"vitest-browser-react": "^0.1.1"
2733
},
2834
"msw": {
2935
"workerDirectory": "public"

examples/vite/src/App.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import { setupWorker } from 'msw/browser';
22
import { useRef, useState } from 'react';
3-
import { CommentData, PostData, baseUrl, mockHandlers } from 'react-query-builder-example-mocks';
3+
import { CommentData, PostData, baseUrl, getMockHandlers } from 'react-query-builder-example-mocks';
44
import './App.css';
5+
import { QueryClientProvider } from '@tanstack/react-query';
6+
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
57
import { HttpQueryBuilder } from 'react-query-builder';
68
import { queryClient } from './client';
9+
import './index.css';
710

8-
await setupWorker(...mockHandlers).start({
11+
await setupWorker(...getMockHandlers()).start({
912
onUnhandledRequest: 'bypass',
1013
quiet: true,
1114
});
@@ -87,7 +90,7 @@ const deletePostMutation = builder.withMethod('delete').withPath('/posts/:id').w
8790
updater: 'delete-params-by-id',
8891
});
8992

90-
function App() {
93+
function AppCore() {
9194
const [enablePrefetch, setEnablePrefetch] = useState(false);
9295
const [postId, setPostId] = useState<number | null>(null);
9396

@@ -221,4 +224,11 @@ function PostPage({ postId, onBack }: { postId: number; onBack: () => void }) {
221224
);
222225
}
223226

224-
export default App;
227+
export function App() {
228+
return (
229+
<QueryClientProvider client={queryClient}>
230+
<AppCore />
231+
<ReactQueryDevtools initialIsOpen={false} />
232+
</QueryClientProvider>
233+
);
234+
}

examples/vite/src/main.tsx

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
import { createRoot } from 'react-dom/client';
2-
import App from './App';
3-
import './index.css';
4-
import { QueryClientProvider } from '@tanstack/react-query';
5-
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
6-
import { queryClient } from './client';
7-
8-
const app = (
9-
<QueryClientProvider client={queryClient}>
10-
<App />
11-
<ReactQueryDevtools initialIsOpen={false} />
12-
</QueryClientProvider>
13-
);
2+
import { App } from './App';
143

154
const root = createRoot(document.getElementById('root') as HTMLElement);
16-
root.render(app);
5+
root.render(<App />);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { baseUrl } from 'react-query-builder-example-mocks';
2+
import { expect, test } from 'vitest';
3+
import { render } from 'vitest-browser-react';
4+
import { App } from '../src/App';
5+
6+
beforeEach(async () => {
7+
await fetch(`${baseUrl}/reset`, { method: 'POST' });
8+
});
9+
10+
test('Renders the app', async () => {
11+
const { getByText } = render(<App />);
12+
await expect.element(getByText('Reload')).toBeInTheDocument();
13+
});
14+
15+
test('Loads posts', async () => {
16+
const { getByText } = render(<App />);
17+
await expect.element(getByText('Loading...')).toBeInTheDocument();
18+
await expect.element(getByText('0 - Exploring the Future of AI')).toBeInTheDocument();
19+
});
20+
21+
test('Loads next page when clicked', async () => {
22+
const { getByText } = render(<App />);
23+
const loadBtn = getByText('Load next page');
24+
await expect.element(loadBtn).toBeInTheDocument();
25+
26+
await loadBtn.click();
27+
await expect.element(getByText('6 - How to Start a Successful Blog')).toBeInTheDocument();
28+
await expect.element(getByText('10 - A Guide to Sustainable Living')).not.toBeInTheDocument();
29+
30+
await loadBtn.click();
31+
await expect.element(getByText('10 - A Guide to Sustainable Living')).toBeInTheDocument();
32+
33+
await loadBtn.click();
34+
await expect.element(getByText('Load next page')).not.toBeInTheDocument();
35+
});

examples/vite/tsconfig.json

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,5 @@
1818
"noFallthroughCasesInSwitch": true
1919
},
2020
"include": ["src", "**/*.d.ts"],
21-
"references": [
22-
{
23-
"path": "./tsconfig.node.json"
24-
}
25-
]
21+
"references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.test.json" }]
2622
}

examples/vite/tsconfig.test.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"extends": "./tsconfig.json",
3+
"compilerOptions": {
4+
"composite": true,
5+
"rootDir": ".",
6+
"noEmit": false,
7+
"allowImportingTsExtensions": false,
8+
"module": "ESNext",
9+
"moduleResolution": "bundler",
10+
"jsx": "react-jsxdev",
11+
"types": ["vitest/globals", "@vitest/browser/matchers", "@vitest/browser/providers/playwright"]
12+
},
13+
"include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts", "tests/**/*.tsx"],
14+
"exclude": ["node_modules", "artifacts", "examples", "website", "dist"]
15+
}

examples/vite/vitest.workspace.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { defineWorkspace } from 'vitest/config';
2+
3+
export default defineWorkspace([
4+
// If you want to keep running your existing tests in Node.js, uncomment the next line.
5+
// 'vite.config.ts',
6+
{
7+
extends: 'vite.config.ts',
8+
test: {
9+
globals: true,
10+
includeTaskLocation: true,
11+
browser: {
12+
enabled: true,
13+
provider: 'playwright',
14+
viewport: { width: 1024, height: 768 },
15+
// https://vitest.dev/guide/browser/playwright
16+
instances: [
17+
{
18+
browser: 'chromium',
19+
globals: true,
20+
includeTaskLocation: true,
21+
},
22+
],
23+
},
24+
},
25+
},
26+
]);

0 commit comments

Comments
 (0)