Skip to content

Commit 55a0475

Browse files
committed
feat: add dummy server scripts and update test commands for prerendering
1 parent cc2a009 commit 55a0475

File tree

5 files changed

+46
-34
lines changed

5 files changed

+46
-34
lines changed

e2e/react-start/basic-prerendering/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
"dev:e2e": "vite dev",
99
"build": "vite build && tsc --noEmit",
1010
"start": "pnpx srvx --prod -s ../client dist/server/server.js",
11-
"test:e2e:ssrMode": "rm -rf port*.txt; playwright test --project=chromium --ui",
12-
"test:e2e": "pnpm run test:e2e:ssrMode"
11+
"test:e2e:ssrMode": "playwright test --project=chromium",
12+
"test:e2e:dummyServer": "node start-dummy-server.mjs &",
13+
"test:e2e:stopDummyServer": "node stop-dummy-server.mjs",
14+
"test:e2e": "rm -rf port*.txt; pnpm run test:e2e:ssrMode"
1315
},
1416
"dependencies": {
1517
"@tanstack/react-router": "workspace:^",

e2e/react-start/basic-prerendering/playwright.config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ const PORT = await getTestServerPort(
1010
)
1111
const EXTERNAL_PORT = await getDummyServerPort(packageJson.name)
1212
const baseURL = `http://localhost:${PORT}`
13-
const ssrModeCommand = `pnpm build && pnpm start`
13+
14+
const ssrModeCommand = `pnpm test:e2e:dummyServer && pnpm build && pnpm test:e2e:stopDummyServer && pnpm start`
1415

1516
/**
1617
* See https://playwright.dev/docs/test-configuration.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/usr/bin/env node
2+
3+
import { e2eStartDummyServer } from '@tanstack/router-e2e-utils'
4+
import packageJson from './package.json' with { type: 'json' }
5+
6+
console.log('Starting dummy server...')
7+
await e2eStartDummyServer(packageJson.name)
8+
console.log('Dummy server started successfully!')
9+
10+
// Keep the process running non-interactively
11+
process.stdin.pause()
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env node
2+
3+
import { e2eStopDummyServer } from '@tanstack/router-e2e-utils'
4+
import packageJson from './package.json' with { type: 'json' }
5+
6+
console.log('Stopping dummy server...')
7+
await e2eStopDummyServer(packageJson.name)
8+
console.log('Dummy server stopped successfully!')
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { existsSync } from 'node:fs'
1+
import { existsSync, readFileSync } from 'node:fs'
22
import { join } from 'node:path'
33
import { expect } from '@playwright/test'
44
import { test } from '@tanstack/router-e2e-utils'
@@ -8,10 +8,10 @@ test.describe('Prerender Static Path Discovery', () => {
88
test('should automatically discover and prerender static routes', () => {
99
// Check that static routes were automatically discovered and prerendered
1010
const distDir = join(process.cwd(), 'dist', 'client')
11-
11+
1212
// These static routes should be automatically discovered and prerendered
1313
expect(existsSync(join(distDir, 'index.html'))).toBe(true) // / (index)
14-
expect(existsSync(join(distDir, 'posts.html',))).toBe(true) // /posts
14+
expect(existsSync(join(distDir, 'posts.html'))).toBe(true) // /posts
1515
expect(existsSync(join(distDir, 'users.html'))).toBe(true) // /users
1616
expect(existsSync(join(distDir, 'deferred.html'))).toBe(true) // /deferred
1717
expect(existsSync(join(distDir, 'scripts.html'))).toBe(true) // /scripts
@@ -20,42 +20,32 @@ test.describe('Prerender Static Path Discovery', () => {
2020

2121
// Pathless layouts should NOT be prerendered (they start with _)
2222
expect(existsSync(join(distDir, '_layout', 'index.html'))).toBe(false) // /_layout
23-
23+
2424
// API routes should NOT be prerendered
25-
expect(existsSync(join(distDir, 'api', 'users', 'index.html'))).toBe(false) // /api/users
25+
26+
expect(existsSync(join(distDir, 'api', 'users', 'index.html'))).toBe(
27+
false,
28+
) // /api/users
2629
})
2730
})
2831

29-
test.describe('Static Route Prerendering Verification', () => {
30-
test('should serve prerendered home page with server-side content', async ({ page }) => {
31-
await page.goto('/')
32-
33-
// Verify the page loads and contains expected content
34-
await expect(page.locator('h3')).toContainText('Welcome Home!!!')
35-
36-
// Check that it was server-side rendered (no hydration flicker)
37-
const html = await page.content()
38-
expect(html).toContain('Welcome Home!!!') // Content should be in initial HTML
39-
expect(html).toContain('Hello from a custom component!') // Component content should be in initial HTML
40-
})
32+
test.describe('Static Files Verification', () => {
33+
test('should contain prerendered content in posts.html', async () => {
34+
const distDir = join(process.cwd(), 'dist', 'client')
35+
expect(existsSync(join(distDir, 'posts.html'))).toBe(true) // /posts
4136

42-
test('should serve prerendered posts index page', async ({ page }) => {
43-
await page.goto('/posts')
44-
// domContentLoaded event
45-
await page.waitForLoadState('domcontentloaded')
46-
// Check for server-side rendered content
47-
const html = await page.content()
48-
await page.pause();
37+
// "Select a post." should be in the prerendered HTML
38+
const html = readFileSync(join(distDir, 'posts.html'), 'utf-8')
4939
expect(html).toContain('Select a post.') // Content should be in initial HTML
5040
})
5141

52-
test('should serve prerendered users index page', async ({ page }) => {
53-
await page.goto('/users')
54-
55-
// Check for server-side rendered content
56-
const html = await page.content()
57-
await page.pause();
42+
test('should contain prerendered content in users.html', async () => {
43+
const distDir = join(process.cwd(), 'dist', 'client')
44+
expect(existsSync(join(distDir, 'users.html'))).toBe(true) // /users
45+
46+
// "Select a user." should be in the prerendered HTML
47+
const html = readFileSync(join(distDir, 'users.html'), 'utf-8')
5848
expect(html).toContain('Select a user.') // Content should be in initial HTML
5949
})
6050
})
61-
})
51+
})

0 commit comments

Comments
 (0)