1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99/**
* OpenNext Compat: Middleware redirect, rewrite, and block behavior.
*
* Ported from:
* https://github.com/opennextjs/opennextjs-cloudflare/blob/main/examples/e2e/app-router/e2e/middleware.redirect.test.ts
* https://github.com/opennextjs/opennextjs-cloudflare/blob/main/examples/e2e/app-router/e2e/middleware.rewrite.test.ts
* Tests: ON-11 in TRACKING.md
*/
import { test, expect } from "@playwright/test";
const BASE = "http://localhost:4174";
test.describe("Middleware Redirect (OpenNext compat)", () => {
// Ref: opennextjs-cloudflare middleware.redirect.test.ts โ "Middleware Redirect"
test("navigating to /middleware-redirect lands on /about", async ({
page,
}) => {
await page.goto(`${BASE}/middleware-redirect`);
await page.waitForURL(/\/about$/);
const el = page.getByText("About", { exact: true });
await expect(el).toBeVisible();
});
// Ref: opennextjs-cloudflare middleware.redirect.test.ts โ cookie set on redirect
test("redirect sets a cookie", async ({ page, context }) => {
await page.goto(`${BASE}/middleware-redirect`);
await page.waitForURL(/\/about$/);
const cookies = await context.cookies();
const mwCookie = cookies.find(
(c) => c.name === "middleware-redirect",
);
expect(mwCookie?.value).toBe("success");
});
// Ref: opennextjs-cloudflare middleware.redirect.test.ts โ direct load also redirects
test("direct load of /middleware-redirect redirects", async ({
request,
}) => {
const res = await request.get(`${BASE}/middleware-redirect`, {
maxRedirects: 0,
});
// Should be a 307 redirect (Next.js default for temporary redirect)
expect([301, 302, 307, 308]).toContain(res.status());
expect(res.headers()["location"]).toMatch(/\/about$/);
});
});
test.describe("Middleware Rewrite (OpenNext compat)", () => {
// Ref: opennextjs-cloudflare middleware.rewrite.test.ts โ "Middleware Rewrite"
test("rewrite serves / content at /middleware-rewrite URL", async ({
page,
}) => {
await page.goto(`${BASE}/middleware-rewrite`);
// URL should stay as /middleware-rewrite (rewrite, not redirect)
expect(page.url()).toMatch(/\/middleware-rewrite$/);
// Content should be from / (home page)
const el = page.getByText("Welcome to App Router", { exact: true });
await expect(el).toBeVisible();
});
// Ref: opennextjs-cloudflare middleware.rewrite.test.ts โ "Middleware Rewrite Status Code"
test(
"rewrite with custom status code returns 403",
async ({ page }) => {
const statusPromise = new Promise<number>((resolve) => {
page.on("response", (response) => {
if (
new URL(response.url()).pathname === "/middleware-rewrite-status"
) {
resolve(response.status());
}
});
});
await page.goto(`${BASE}/middleware-rewrite-status`);
// Content should be from / (home page) despite 403 status
const el = page.getByText("Welcome to App Router", { exact: true });
await expect(el).toBeVisible();
expect(await statusPromise).toBe(403);
},
);
});
test.describe("Middleware Block (OpenNext compat)", () => {
test("blocked route returns 403", async ({ request }) => {
const res = await request.get(`${BASE}/middleware-blocked`);
expect(res.status()).toBe(403);
const body = await res.text();
expect(body).toContain("Blocked by middleware");
});
});