Skip to content

Commit 4bc79c6

Browse files
dodok8codex
andcommitted
Refactor lookup test exclusion rules
Consolidate lookup-test-only exclusions into a single pattern-based rule table so framework-wide and combination-specific bans follow the same matching logic. This keeps the supported-option checks unchanged while making the temporary lookup exclusions easier to maintain. Add regression tests for lookup case parsing and wildcard-based filtering. Co-Authored-By: OpenAI Codex <noreply@openai.com>
1 parent b79f18e commit 4bc79c6

2 files changed

Lines changed: 94 additions & 21 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { assertEquals } from "@std/assert";
2+
import { join } from "node:path";
3+
import { test } from "node:test";
4+
import {
5+
filterLookupDirs,
6+
getBannedLookupFrameworks,
7+
matchesLookupCasePattern,
8+
parseLookupCase,
9+
} from "./test/lookup.ts";
10+
11+
test("parseLookupCase() parses the last four path segments", () => {
12+
assertEquals(
13+
parseLookupCase(join("/tmp", "cases", "hono", "deno", "denokv", "redis")),
14+
["hono", "deno", "denokv", "redis"],
15+
);
16+
});
17+
18+
test("matchesLookupCasePattern() supports wildcards", () => {
19+
assertEquals(
20+
matchesLookupCasePattern(
21+
["solidstart", "deno", "*", "*"],
22+
["solidstart", "deno", "postgres", "redis"],
23+
),
24+
true,
25+
);
26+
assertEquals(
27+
matchesLookupCasePattern(
28+
["solidstart", "deno", "*", "*"],
29+
["solidstart", "npm", "postgres", "redis"],
30+
),
31+
false,
32+
);
33+
});
34+
35+
test("filterLookupDirs() excludes banned lookup cases only", () => {
36+
const dirs = [
37+
join("/tmp", "cases", "next", "pnpm", "postgres", "redis"),
38+
join("/tmp", "cases", "solidstart", "deno", "postgres", "redis"),
39+
join("/tmp", "cases", "solidstart", "npm", "postgres", "redis"),
40+
join("/tmp", "cases", "hono", "deno", "denokv", "denokv"),
41+
];
42+
43+
assertEquals(
44+
filterLookupDirs(dirs),
45+
[
46+
join("/tmp", "cases", "solidstart", "npm", "postgres", "redis"),
47+
join("/tmp", "cases", "hono", "deno", "denokv", "denokv"),
48+
],
49+
);
50+
});
51+
52+
test("getBannedLookupFrameworks() returns framework-wide bans", () => {
53+
assertEquals(getBannedLookupFrameworks(), ["next"]);
54+
});

packages/init/src/test/lookup.ts

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,16 @@ import webFrameworks from "../webframeworks/mod.ts";
1919
const HANDLE = "john";
2020
const STARTUP_TIMEOUT = 30000; // 30 seconds
2121
const CWD = process.cwd();
22-
const BANNED_WFS: WebFramework[] = ["next"];
23-
const BANNED_COMBOS: [WebFramework, PackageManager][] = [
24-
["solidstart", "deno"],
22+
type LookupCase = [WebFramework, PackageManager, KvStore, MessageQueue];
23+
type LookupCasePattern = [
24+
WebFramework | "*",
25+
PackageManager | "*",
26+
KvStore | "*",
27+
MessageQueue | "*",
28+
];
29+
const BANNED_LOOKUP_CASES: LookupCasePattern[] = [
30+
["next", "*", "*", "*"],
31+
["solidstart", "deno", "*", "*"],
2532
];
2633

2734
/**
@@ -37,7 +44,7 @@ export default async function runServerAndLookupUser(
3744
printErrorMessage`\nNo directories to lookup test.`;
3845
return;
3946
}
40-
const filtered = filterWebFrameworks(valid);
47+
const filtered = filterLookupDirs(valid);
4148

4249
printMessage`\nLookup Test start for ${String(filtered.length)} app(s)!`;
4350

@@ -52,38 +59,50 @@ export default async function runServerAndLookupUser(
5259
Failed: ${String(failCount)}\n\n`;
5360
}
5461

55-
function filterWebFrameworks(
62+
export function parseLookupCase(dir: string): LookupCase {
63+
return dir.split(sep).slice(-4) as LookupCase;
64+
}
65+
66+
export function matchesLookupCasePattern(
67+
pattern: LookupCasePattern,
68+
target: LookupCase,
69+
): boolean {
70+
return pattern.every((value, index) =>
71+
value === "*" || value === target[index]
72+
);
73+
}
74+
75+
export function getBannedLookupFrameworks(): WebFramework[] {
76+
return BANNED_LOOKUP_CASES
77+
.filter(([, pm, kv, mq]) => pm === "*" && kv === "*" && mq === "*")
78+
.map(([wf]) => wf as WebFramework);
79+
}
80+
81+
export function filterLookupDirs(
5682
dirs: string[],
5783
): string[] {
5884
const wfs = new Set<WebFramework>(
59-
dirs.map((dir) => dir.split(sep).slice(-4, -3)[0] as WebFramework),
85+
dirs.map((dir) => parseLookupCase(dir)[0]),
6086
);
61-
const hasBanned = BANNED_WFS.filter((wf) => wfs.has(wf));
87+
const hasBanned = getBannedLookupFrameworks().filter((wf) => wfs.has(wf));
6288
if (!isEmpty(hasBanned)) {
6389
const bannedLabels = hasBanned.map((wf) => webFrameworks[wf]["label"]);
6490
printErrorMessage`\n${
6591
values(bannedLabels)
6692
} is not supported in lookup test yet.`;
6793
}
68-
return dirs.filter((dir) => {
69-
const [wf, pm] = dir.split(sep).slice(-4, -2) as [
70-
WebFramework,
71-
PackageManager,
72-
];
73-
if (BANNED_WFS.includes(wf)) return false;
74-
if (BANNED_COMBOS.some(([bwf, bpm]) => bwf === wf && bpm === pm)) {
75-
return false;
76-
}
77-
return true;
78-
});
94+
return dirs.filter((dir) =>
95+
!BANNED_LOOKUP_CASES.some((pattern) =>
96+
matchesLookupCasePattern(pattern, parseLookupCase(dir))
97+
)
98+
);
7999
}
80100

81101
/**
82102
* Run the dev server and test with lookup command.
83103
*/
84104
async function testApp(dir: string): Promise<boolean> {
85-
const [wf, pm, kv, mq] = dir.split(sep).slice(-4) as //
86-
[WebFramework, PackageManager, KvStore, MessageQueue];
105+
const [wf, pm, kv, mq] = parseLookupCase(dir);
87106

88107
printMessage` Testing ${values([wf, pm, kv, mq])}...`;
89108

@@ -98,7 +117,7 @@ async function testApp(dir: string): Promise<boolean> {
98117
}!`;
99118
if (!result) {
100119
printMessage` Check out these files for more details:
101-
${join(dir, "out.txt")} and
120+
${join(dir, "out.txt")} and
102121
${join(dir, "err.txt")}\n`;
103122
}
104123
printMessage`\n`;

0 commit comments

Comments
 (0)