Skip to content

Commit 5dd64a9

Browse files
authored
Add tests for SSR server (#2730)
* wip * Update playwright-chromium.yml * Update ssr.ts * Update Page1.svelte * Update ssr.spec.ts * Fix code style
1 parent 458207f commit 5dd64a9

File tree

23 files changed

+441
-22
lines changed

23 files changed

+441
-22
lines changed

.github/workflows/playwright-chromium.yml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,45 @@ jobs:
4242
with:
4343
name: playwright-failure-screenshots-${{ matrix.adapter }}-chromium
4444
path: test-results
45+
46+
test-chromium-ssr:
47+
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
48+
name: Chromium SSR (${{ matrix.adapter }})
49+
timeout-minutes: 15
50+
runs-on: ubuntu-24.04
51+
strategy:
52+
matrix:
53+
adapter: ['vue', 'react', 'svelte']
54+
steps:
55+
- name: Checkout
56+
uses: actions/checkout@v4
57+
58+
- name: Install pnpm
59+
uses: pnpm/action-setup@v3
60+
with:
61+
version: 10
62+
63+
- name: Setup Node.js
64+
uses: actions/setup-node@v4
65+
with:
66+
node-version: 22.14
67+
cache: pnpm
68+
69+
- name: Install dependencies
70+
run: pnpm install
71+
72+
- name: Build Inertia
73+
run: pnpm -r --filter ./packages/core --filter ./packages/${{ matrix.adapter }}* build
74+
75+
- name: Install Playwright Browsers
76+
run: pnpm playwright install chromium
77+
78+
- name: Run Playwright SSR Tests
79+
run: pnpm test:ssr:${{ matrix.adapter }} --project=chromium
80+
81+
- name: Upload failure screenshots
82+
if: failure()
83+
uses: actions/upload-artifact@v4
84+
with:
85+
name: playwright-failure-screenshots-${{ matrix.adapter }}-chromium-ssr
86+
path: test-results

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
"test:react": "PACKAGE=react node playwright.js",
2626
"test:svelte": "PACKAGE=svelte node playwright.js",
2727
"test:vue": "PACKAGE=vue3 node playwright.js",
28+
"test:ssr:react": "PACKAGE=react SSR=true npx playwright test",
29+
"test:ssr:svelte": "PACKAGE=svelte SSR=true npx playwright test",
30+
"test:ssr:vue": "PACKAGE=vue3 SSR=true npx playwright test",
2831
"playground:react": "cd playgrounds/react && ./init.sh && composer run dev",
2932
"playground:svelte4": "cd playgrounds/svelte4 && ./init.sh && composer run dev",
3033
"playground:svelte5": "cd playgrounds/svelte5 && ./init.sh && composer run dev",
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Link } from '@inertiajs/react'
2+
3+
export default ({ user, items, count }: { user: { name: string; email: string }; items: string[]; count: number }) => (
4+
<div>
5+
<h1 data-testid="ssr-title">SSR Page 1</h1>
6+
7+
<div data-testid="user-info">
8+
<p data-testid="user-name">Name: {user.name}</p>
9+
<p data-testid="user-email">Email: {user.email}</p>
10+
</div>
11+
12+
<ul data-testid="items-list">
13+
{items.map((item) => (
14+
<li key={item} data-testid="item">
15+
{item}
16+
</li>
17+
))}
18+
</ul>
19+
20+
<p data-testid="count">Count: {count}</p>
21+
22+
<Link href="/ssr/page2" data-testid="navigate-link">
23+
Navigate to another page
24+
</Link>
25+
</div>
26+
)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Link } from '@inertiajs/react'
2+
3+
export default ({ navigatedTo }: { navigatedTo: boolean }) => (
4+
<div>
5+
<h1 data-testid="ssr-title">SSR Page 2</h1>
6+
<p data-testid="navigated-status">Navigated: {String(navigatedTo)}</p>
7+
8+
<Link href="/ssr/page1" data-testid="back-link">
9+
Go back
10+
</Link>
11+
</div>
12+
)

packages/react/test-app/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"type": "module",
33
"scripts": {
44
"build": "vite build .",
5+
"build:ssr": "vite build --ssr ssr.tsx --outDir dist",
56
"dev": "nodemon --watch . --watch ../../core/dist --watch ../../react/dist --ext js,tsx,html,json --ignore dist/ --exec 'vite build .'",
67
"lint": "eslint .",
78
"type-check": "tsc --noEmit"

packages/react/test-app/ssr.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { createInertiaApp, type ResolvedComponent } from '@inertiajs/react'
2+
import createServer from '@inertiajs/react/server'
3+
import ReactDOMServer from 'react-dom/server'
4+
5+
createServer((page) =>
6+
createInertiaApp({
7+
page,
8+
render: ReactDOMServer.renderToString,
9+
resolve: (name) => {
10+
const pages = import.meta.glob<ResolvedComponent>('./Pages/SSR/**/*.tsx', { eager: true })
11+
return pages[`./Pages/${name}.tsx`]
12+
},
13+
setup: ({ App, props }) => <App {...props} />,
14+
}),
15+
)

packages/react/test-app/vite.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import react from '@vitejs/plugin-react'
22
import { defineConfig } from 'vite'
33

4+
const isSSR = process.argv.includes('--ssr')
5+
46
export default defineConfig({
57
build: {
68
minify: false,
9+
emptyOutDir: !isSSR,
710
},
811
resolve: {
912
alias: {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<script lang="ts">
2+
import { inertia } from '@inertiajs/svelte'
3+
4+
export let user: { name: string; email: string }
5+
export let items: string[]
6+
export let count: number
7+
</script>
8+
9+
<div>
10+
<h1 data-testid="ssr-title">SSR Page 1</h1>
11+
12+
<div data-testid="user-info">
13+
<p data-testid="user-name">Name: {user.name}</p>
14+
<p data-testid="user-email">Email: {user.email}</p>
15+
</div>
16+
17+
<ul data-testid="items-list">
18+
{#each items as item (item)}
19+
<li data-testid="item">{item}</li>
20+
{/each}
21+
</ul>
22+
23+
<p data-testid="count">Count: {count}</p>
24+
25+
<a href="/ssr/page2" use:inertia data-testid="navigate-link">Navigate to another page</a>
26+
</div>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script lang="ts">
2+
import { inertia } from '@inertiajs/svelte'
3+
4+
export let navigatedTo: boolean
5+
</script>
6+
7+
<div>
8+
<h1 data-testid="ssr-title">SSR Page 2</h1>
9+
<p data-testid="navigated-status">Navigated: {navigatedTo}</p>
10+
11+
<a href="/ssr/page1" use:inertia data-testid="back-link">Go back</a>
12+
</div>

packages/svelte/test-app/app.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ createInertiaApp({
1919
return pages[`./Pages/${name}.svelte`]
2020
},
2121
setup({ el, App, props }) {
22-
new App({ target: el!, props })
22+
const hydrate = el?.hasAttribute('data-server-rendered')
23+
new App({ target: el!, props, hydrate })
2324
},
2425
...(withAppDefaults && {
2526
defaults: {

0 commit comments

Comments
 (0)