Files
2026-07-13 13:39:12 +08:00

120 lines
4.3 KiB
TypeScript

import { describe, it } from "node:test";
import assert from "node:assert/strict";
import {
loadRtkFilters,
matchRtkFilter,
runRtkFilterTests,
} from "../../open-sse/services/compression/index.ts";
const NEW_FILTERS = ["kubectl", "docker-build", "composer", "gh"] as const;
const MATCH_CASES: Array<[string, string, string]> = [
[
"kubectl",
"NAME READY STATUS RESTARTS AGE\nweb-2c4 0/1 CrashLoopBackOff 5 12m",
"kubectl get pods",
],
[
"docker-build",
"Step 1/2 : FROM node:20\nSuccessfully built abc123",
"docker build -t myapp .",
],
[
"composer",
"Package operations: 5 installs, 0 updates, 0 removals\nGenerating optimized autoload files",
"composer install",
],
[
"gh",
"Creating pull request for feat/foo into main in owner/repo\nhttps://github.com/owner/repo/pull/123",
"gh pr create",
],
];
describe("RTK new-filter catalog (kubectl, docker-build, composer, gh)", () => {
it("loads all 4 new filters from disk", () => {
const filters = loadRtkFilters({ refresh: true, customFiltersEnabled: false });
const ids = new Set(filters.map((f) => f.id));
for (const id of NEW_FILTERS) {
assert.ok(ids.has(id), `expected filter "${id}" to be loaded`);
}
});
it("matches each new filter from realistic command output", () => {
for (const [expectedId, output, command] of MATCH_CASES) {
const filter = matchRtkFilter(output, command, { customFiltersEnabled: false });
assert.equal(filter?.id, expectedId, `wrong filter matched for "${command}"`);
}
});
it("kubectl skips arbitrary-content commands (logs, exec, top)", () => {
const logOutput =
"2026-05-28T10:00:00 INFO request handled\n2026-05-28T10:00:01 INFO request handled";
for (const cmd of ["kubectl logs api-pod", "kubectl exec api-pod -- npm test", "kubectl top nodes"]) {
const filter = matchRtkFilter(logOutput, cmd, { customFiltersEnabled: false });
assert.notEqual(
filter?.id,
"kubectl",
`kubectl filter must not claim "${cmd}" (arbitrary content)`
);
}
});
it("kubectl skips structured -o json/yaml output to avoid corrupting it", () => {
const jsonOutput = '{\n "apiVersion": "v1",\n "items": []\n}';
for (const cmd of [
"kubectl get pods -o json",
"kubectl get pods -o yaml",
"kubectl get pods --output=json",
"kubectl get svc -o jsonpath='{.items[*].metadata.name}'",
]) {
const filter = matchRtkFilter(jsonOutput, cmd, { customFiltersEnabled: false });
assert.notEqual(
filter?.id,
"kubectl",
`kubectl filter must not claim structured output: "${cmd}"`
);
}
});
it("gh skips `gh api` and --json invocations (structured output)", () => {
const jsonOutput = '{\n "number": 1,\n "title": "feat: x"\n}';
for (const cmd of [
"gh api repos/owner/repo/pulls/1",
"gh api graphql -f query=...",
"gh pr list --json number,title",
"gh issue list --json number,title,author",
]) {
const filter = matchRtkFilter(jsonOutput, cmd, { customFiltersEnabled: false });
assert.notEqual(
filter?.id,
"gh",
`gh filter must not claim structured output: "${cmd}"`
);
}
});
it("docker-build matches both v2 (docker compose) and legacy (docker-compose) build", () => {
const output = "Step 1/2 : FROM node:20\nSuccessfully built abc123";
for (const cmd of ["docker build .", "docker compose build", "docker-compose build", "docker buildx build ."]) {
const filter = matchRtkFilter(output, cmd, { customFiltersEnabled: false });
assert.equal(filter?.id, "docker-build", `expected docker-build to match "${cmd}"`);
}
});
it("inline tests for new filters all pass", () => {
const result = runRtkFilterTests({ requireAll: false, customFiltersEnabled: false });
const newFilterOutcomes = result.outcomes.filter((o) =>
NEW_FILTERS.includes(o.filterId as (typeof NEW_FILTERS)[number])
);
assert.ok(newFilterOutcomes.length > 0, "expected inline tests from new filters to run");
const failed = newFilterOutcomes.filter((o) => !o.passed);
assert.deepEqual(
failed,
[],
`inline tests failed: ${failed.map((f) => `${f.filterId}/${f.testName}`).join(", ")}`
);
});
});