Skip to content

Commit 1cfa6dd

Browse files
committed
test(ui): add component-level coverage for size categories and tooltips
- Add XXL sizeCategory filter integration test - Add S, M, L, XL badge rendering tests for SizeBadge - Add S and XXL tooltip text verification tests - Extract tooltip tests into nested describe with beforeEach/afterEach for robust timer lifecycle management
1 parent 5301681 commit 1cfa6dd

2 files changed

Lines changed: 75 additions & 14 deletions

File tree

tests/components/PullRequestsTab.test.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,18 @@ describe("PullRequestsTab", () => {
244244
expect(screen.queryByText("Large PR")).toBeNull();
245245
});
246246

247+
it("filters by sizeCategory 'XXL' tab filter", () => {
248+
const prs = [
249+
makePullRequest({ id: 1, title: "Huge PR", additions: 800, deletions: 500, repoFullName: "org/repo-a" }),
250+
makePullRequest({ id: 2, title: "Medium PR", additions: 30, deletions: 20, repoFullName: "org/repo-a" }),
251+
];
252+
viewStore.setTabFilter("pullRequests", "sizeCategory", "XXL");
253+
setAllExpanded("pullRequests", ["org/repo-a"], true);
254+
render(() => <PullRequestsTab pullRequests={prs} userLogin="" />);
255+
screen.getByText("Huge PR");
256+
expect(screen.queryByText("Medium PR")).toBeNull();
257+
});
258+
247259
it("groups PRs by repo with collapsible headers", () => {
248260
const prs = [
249261
makePullRequest({ id: 1, title: "PR in repo A", repoFullName: "org/repo-a" }),

tests/components/shared-badges.test.tsx

Lines changed: 63 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { describe, it, expect, vi } from "vitest";
1+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
22
import { render, screen, fireEvent } from "@solidjs/testing-library";
33
import RoleBadge from "../../src/app/components/shared/RoleBadge";
44
import ReviewBadge from "../../src/app/components/shared/ReviewBadge";
@@ -67,6 +67,26 @@ describe("SizeBadge", () => {
6767
screen.getByText("1 file");
6868
});
6969

70+
it("renders S badge for small-medium changes", () => {
71+
render(() => <SizeBadge additions={15} deletions={14} changedFiles={2} />);
72+
screen.getByText("S");
73+
});
74+
75+
it("renders M badge for medium changes", () => {
76+
render(() => <SizeBadge additions={15} deletions={15} changedFiles={3} />);
77+
screen.getByText("M");
78+
});
79+
80+
it("renders L badge for large changes", () => {
81+
render(() => <SizeBadge additions={200} deletions={100} changedFiles={10} />);
82+
screen.getByText("L");
83+
});
84+
85+
it("renders XL badge for extra-large changes", () => {
86+
render(() => <SizeBadge additions={400} deletions={200} changedFiles={20} />);
87+
screen.getByText("XL");
88+
});
89+
7090
it("renders XXL badge for large changes", () => {
7191
render(() => <SizeBadge additions={800} deletions={500} changedFiles={42} />);
7292
screen.getByText("XXL");
@@ -85,18 +105,47 @@ describe("SizeBadge", () => {
85105
screen.getByText("XS");
86106
});
87107

88-
it("shows tooltip with size description on hover", () => {
89-
vi.useFakeTimers();
90-
const { container } = render(() => (
91-
<SizeBadge additions={3} deletions={2} changedFiles={1} />
92-
));
93-
const trigger = container.querySelector("span.inline-flex");
94-
expect(trigger).not.toBeNull();
95-
fireEvent.pointerEnter(trigger!);
96-
vi.advanceTimersByTime(300);
97-
expect(document.body.textContent).toContain("XS: <10 lines changed");
98-
fireEvent.pointerLeave(trigger!);
99-
vi.advanceTimersByTime(500);
100-
vi.useRealTimers();
108+
describe("tooltips", () => {
109+
beforeEach(() => vi.useFakeTimers());
110+
afterEach(() => vi.useRealTimers());
111+
112+
it("shows tooltip with size description on hover", () => {
113+
const { container } = render(() => (
114+
<SizeBadge additions={3} deletions={2} changedFiles={1} />
115+
));
116+
const trigger = container.querySelector("span.inline-flex");
117+
expect(trigger).not.toBeNull();
118+
fireEvent.pointerEnter(trigger!);
119+
vi.advanceTimersByTime(300);
120+
expect(document.body.textContent).toContain("XS: <10 lines changed");
121+
fireEvent.pointerLeave(trigger!);
122+
vi.advanceTimersByTime(500);
123+
});
124+
125+
it("shows tooltip with S size description on hover", () => {
126+
const { container } = render(() => (
127+
<SizeBadge additions={10} deletions={5} changedFiles={2} />
128+
));
129+
const trigger = container.querySelector("span.inline-flex");
130+
expect(trigger).not.toBeNull();
131+
fireEvent.pointerEnter(trigger!);
132+
vi.advanceTimersByTime(300);
133+
expect(document.body.textContent).toContain("S: 10–29 lines changed");
134+
fireEvent.pointerLeave(trigger!);
135+
vi.advanceTimersByTime(500);
136+
});
137+
138+
it("shows tooltip with XXL size description on hover", () => {
139+
const { container } = render(() => (
140+
<SizeBadge additions={800} deletions={500} changedFiles={42} />
141+
));
142+
const trigger = container.querySelector("span.inline-flex");
143+
expect(trigger).not.toBeNull();
144+
fireEvent.pointerEnter(trigger!);
145+
vi.advanceTimersByTime(300);
146+
expect(document.body.textContent).toContain("XXL: 1000+ lines changed");
147+
fireEvent.pointerLeave(trigger!);
148+
vi.advanceTimersByTime(500);
149+
});
101150
});
102151
});

0 commit comments

Comments
 (0)