Skip to content

Commit d1a186c

Browse files
authored
fix(e2e): Align middleware detection test cases for next@16 (#7047)
1 parent 3f72fa0 commit d1a186c

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

integration/tests/middleware-placement.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,36 @@
11
import { expect, test } from '@playwright/test';
2+
import path from 'path';
23

34
import type { Application } from '../models/application';
5+
import { stateFile } from '../models/stateFile';
46
import { appConfigs } from '../presets';
7+
import { fs } from '../scripts';
58
import { createTestUtils } from '../testUtils';
69

10+
function parseSemverMajor(range?: string): number | undefined {
11+
if (!range) {
12+
return undefined;
13+
}
14+
const match = String(range).match(/\d+/);
15+
return match ? Number.parseInt(match[0], 10) : undefined;
16+
}
17+
18+
async function detectNext(app: Application): Promise<{ isNext: boolean; version?: string }> {
19+
// app.appDir exists for normal Application; for long-running apps, read it from the state file by serverUrl
20+
const appDir =
21+
(app as any).appDir ||
22+
Object.values(stateFile.getLongRunningApps() || {}).find(a => a.serverUrl === app.serverUrl)?.appDir;
23+
24+
if (!appDir) {
25+
return { isNext: false };
26+
}
27+
28+
const pkg = await fs.readJSON(path.join(appDir, 'package.json'));
29+
const nextRange: string | undefined = pkg.dependencies?.next || pkg.devDependencies?.next;
30+
31+
return { isNext: Boolean(nextRange), version: nextRange };
32+
}
33+
734
const middlewareFileContents = `
835
import { clerkMiddleware } from '@clerk/nextjs/server';
936
export default clerkMiddleware();
@@ -61,6 +88,9 @@ test.describe('next start - invalid middleware at root on src/ @quickstart', ()
6188
page,
6289
context,
6390
}) => {
91+
const { version } = await detectNext(app);
92+
const major = parseSemverMajor(version) ?? 0;
93+
test.skip(major >= 16, 'Middleware detection is smarter in Next 16+.');
6494
const u = createTestUtils({ app, page, context });
6595
await u.page.goToAppHome();
6696

@@ -69,6 +99,15 @@ test.describe('next start - invalid middleware at root on src/ @quickstart', ()
6999
'Clerk: clerkMiddleware() was not run, your middleware file might be misplaced. Move your middleware file to ./src/middleware.ts. Currently located at ./middleware.ts',
70100
);
71101
});
102+
103+
test('Does not display misplaced middleware error on Next 16+', async ({ page, context }) => {
104+
const { version } = await detectNext(app);
105+
const major = parseSemverMajor(version) ?? 0;
106+
test.skip(major < 16, 'Only applicable on Next 16+');
107+
const u = createTestUtils({ app, page, context });
108+
await u.page.goToAppHome();
109+
expect(app.serveOutput).not.toContain('Clerk: clerkMiddleware() was not run');
110+
});
72111
});
73112

74113
test.describe('next start - invalid middleware inside app on src/ @quickstart', () => {

0 commit comments

Comments
 (0)