Skip to content

Commit a39c6f2

Browse files
committed
fix
1 parent a1e6db0 commit a39c6f2

File tree

3 files changed

+150
-0
lines changed

3 files changed

+150
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { describe, expect, it } from "vitest";
2+
import { colorizeByScore } from "../src/utils/colorize-by-score.js";
3+
4+
describe("colorizeByScore", () => {
5+
it("returns a string for high scores", () => {
6+
const result = colorizeByScore("Great", 90);
7+
expect(typeof result).toBe("string");
8+
expect(result).toContain("Great");
9+
});
10+
11+
it("returns a string for medium scores", () => {
12+
const result = colorizeByScore("OK", 60);
13+
expect(typeof result).toBe("string");
14+
expect(result).toContain("OK");
15+
});
16+
17+
it("returns a string for low scores", () => {
18+
const result = colorizeByScore("Critical", 30);
19+
expect(typeof result).toBe("string");
20+
expect(result).toContain("Critical");
21+
});
22+
23+
it("does not throw at good threshold boundary (75)", () => {
24+
expect(() => colorizeByScore("text", 75)).not.toThrow();
25+
expect(() => colorizeByScore("text", 74)).not.toThrow();
26+
expect(colorizeByScore("text", 75)).toContain("text");
27+
expect(colorizeByScore("text", 74)).toContain("text");
28+
});
29+
30+
it("does not throw at ok threshold boundary (50)", () => {
31+
expect(() => colorizeByScore("text", 50)).not.toThrow();
32+
expect(() => colorizeByScore("text", 49)).not.toThrow();
33+
expect(colorizeByScore("text", 50)).toContain("text");
34+
expect(colorizeByScore("text", 49)).toContain("text");
35+
});
36+
37+
it("handles score of zero", () => {
38+
const result = colorizeByScore("zero", 0);
39+
expect(result).toContain("zero");
40+
});
41+
42+
it("handles perfect score", () => {
43+
const result = colorizeByScore("perfect", 100);
44+
expect(result).toContain("perfect");
45+
});
46+
});
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { describe, expect, it } from "vitest";
2+
import type { Diagnostic, ReactDoctorConfig } from "../src/types.js";
3+
import { combineDiagnostics, computeJsxIncludePaths } from "../src/utils/combine-diagnostics.js";
4+
5+
const createDiagnostic = (overrides: Partial<Diagnostic> = {}): Diagnostic => ({
6+
filePath: "src/app.tsx",
7+
plugin: "react-doctor",
8+
rule: "test-rule",
9+
severity: "warning",
10+
message: "test message",
11+
help: "test help",
12+
line: 1,
13+
column: 1,
14+
category: "Test",
15+
...overrides,
16+
});
17+
18+
describe("computeJsxIncludePaths", () => {
19+
it("returns undefined for empty include paths", () => {
20+
expect(computeJsxIncludePaths([])).toBeUndefined();
21+
});
22+
23+
it("filters to only JSX/TSX files", () => {
24+
const paths = ["src/app.tsx", "src/utils.ts", "src/Button.jsx", "src/config.js"];
25+
const result = computeJsxIncludePaths(paths);
26+
expect(result).toEqual(["src/app.tsx", "src/Button.jsx"]);
27+
});
28+
29+
it("returns empty array when no JSX/TSX files exist", () => {
30+
const paths = ["src/utils.ts", "src/config.js"];
31+
const result = computeJsxIncludePaths(paths);
32+
expect(result).toEqual([]);
33+
});
34+
});
35+
36+
describe("combineDiagnostics", () => {
37+
it("merges lint and dead code diagnostics", () => {
38+
const lintDiagnostics = [createDiagnostic({ rule: "lint-rule" })];
39+
const deadCodeDiagnostics = [createDiagnostic({ rule: "dead-code-rule" })];
40+
41+
const result = combineDiagnostics(lintDiagnostics, deadCodeDiagnostics, "/tmp", true, null);
42+
expect(result).toHaveLength(2);
43+
expect(result[0].rule).toBe("lint-rule");
44+
expect(result[1].rule).toBe("dead-code-rule");
45+
});
46+
47+
it("returns empty array when both inputs are empty in diff mode", () => {
48+
const result = combineDiagnostics([], [], "/tmp", true, null);
49+
expect(result).toEqual([]);
50+
});
51+
52+
it("applies config filtering when userConfig is provided", () => {
53+
const diagnostics = [
54+
createDiagnostic({ plugin: "react", rule: "no-danger" }),
55+
createDiagnostic({ plugin: "react-doctor", rule: "no-giant-component" }),
56+
];
57+
const config: ReactDoctorConfig = {
58+
ignore: { rules: ["react/no-danger"] },
59+
};
60+
61+
const result = combineDiagnostics(diagnostics, [], "/tmp", true, config);
62+
expect(result).toHaveLength(1);
63+
expect(result[0].rule).toBe("no-giant-component");
64+
});
65+
66+
it("skips config filtering when userConfig is null", () => {
67+
const diagnostics = [createDiagnostic(), createDiagnostic()];
68+
const result = combineDiagnostics(diagnostics, [], "/tmp", true, null);
69+
expect(result).toHaveLength(2);
70+
});
71+
});
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import path from "node:path";
2+
import { describe, expect, it } from "vitest";
3+
import { findMonorepoRoot, isMonorepoRoot } from "../src/utils/find-monorepo-root.js";
4+
5+
const FIXTURES_DIRECTORY = path.resolve(import.meta.dirname, "fixtures");
6+
7+
describe("isMonorepoRoot", () => {
8+
it("returns true for a directory with pnpm-workspace.yaml or workspaces", () => {
9+
const nestedWorkspaces = path.join(FIXTURES_DIRECTORY, "nested-workspaces");
10+
expect(isMonorepoRoot(nestedWorkspaces)).toBe(true);
11+
});
12+
13+
it("returns false for a non-monorepo project", () => {
14+
const basicReact = path.join(FIXTURES_DIRECTORY, "basic-react");
15+
expect(isMonorepoRoot(basicReact)).toBe(false);
16+
});
17+
18+
it("returns false for a nonexistent directory", () => {
19+
expect(isMonorepoRoot("/nonexistent/path")).toBe(false);
20+
});
21+
});
22+
23+
describe("findMonorepoRoot", () => {
24+
it("returns null when no monorepo root exists above directory", () => {
25+
expect(findMonorepoRoot("/tmp")).toBeNull();
26+
});
27+
28+
it("finds monorepo root from a nested workspace package", () => {
29+
const nestedPackage = path.join(FIXTURES_DIRECTORY, "nested-workspaces", "packages", "ui");
30+
const monorepoRoot = findMonorepoRoot(nestedPackage);
31+
expect(monorepoRoot).toBe(path.join(FIXTURES_DIRECTORY, "nested-workspaces"));
32+
});
33+
});

0 commit comments

Comments
 (0)