Skip to content

Commit ac4c5c5

Browse files
committed
test: add background refresh mouse interactivity coverage
1 parent 714e4dc commit ac4c5c5

1 file changed

Lines changed: 87 additions & 0 deletions

File tree

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import { describe, it, expect, vi } from 'vitest';
2+
import { BackgroundRefresh } from './background-refresh';
3+
import * as githubLib from '../../lib/github';
4+
5+
describe('BackgroundRefresh - Mouse Interactivity & Click Handling', () => {
6+
it('prevents duplicate refresh triggers from rapid double-click interactions', () => {
7+
const refresh = BackgroundRefresh.getInstance();
8+
refresh.reset();
9+
10+
const mockGetData = vi
11+
.spyOn(githubLib, 'getFullDashboardData')
12+
.mockReturnValue(new Promise(() => {}) as Promise<never>);
13+
14+
refresh.triggerRefresh('double-click-user');
15+
refresh.triggerRefresh('double-click-user');
16+
17+
expect(mockGetData).toHaveBeenCalledTimes(1);
18+
19+
mockGetData.mockRestore();
20+
refresh.reset();
21+
});
22+
23+
it('computes tooltip coordinates for hover overlays correctly', () => {
24+
const hoverEvent = { clientX: 150, clientY: 250 };
25+
26+
const getTooltipPosition = (e: { clientX: number; clientY: number }) => ({
27+
top: e.clientY + 12,
28+
left: e.clientX + 12,
29+
});
30+
31+
const pos = getTooltipPosition(hoverEvent);
32+
33+
expect(pos.top).toBe(262);
34+
expect(pos.left).toBe(162);
35+
});
36+
37+
it('verifies click handlers invoke refresh exactly once', () => {
38+
const refresh = BackgroundRefresh.getInstance();
39+
refresh.reset();
40+
41+
const triggerSpy = vi.spyOn(refresh, 'triggerRefresh');
42+
43+
const handleClick = (username: string) => {
44+
refresh.triggerRefresh(username);
45+
};
46+
47+
handleClick('click-user');
48+
49+
expect(triggerSpy).toHaveBeenCalledTimes(1);
50+
expect(triggerSpy).toHaveBeenCalledWith('click-user');
51+
52+
triggerSpy.mockRestore();
53+
});
54+
55+
it('applies pointer cursor state while refresh job is active', () => {
56+
const refresh = BackgroundRefresh.getInstance();
57+
refresh.reset();
58+
59+
const mockGetData = vi
60+
.spyOn(githubLib, 'getFullDashboardData')
61+
.mockReturnValue(new Promise(() => {}) as Promise<never>);
62+
63+
refresh.triggerRefresh('hover-user');
64+
65+
expect(refresh.isJobActive('hover-user')).toBe(true);
66+
67+
mockGetData.mockRestore();
68+
refresh.reset();
69+
});
70+
71+
it('hides temporary overlay state after mouseleave refresh completion', async () => {
72+
const refresh = BackgroundRefresh.getInstance();
73+
refresh.reset();
74+
75+
vi.spyOn(githubLib, 'getFullDashboardData').mockResolvedValue(
76+
{} as Awaited<ReturnType<typeof githubLib.getFullDashboardData>>
77+
);
78+
79+
refresh.triggerRefresh('mouseleave-user');
80+
81+
await new Promise((resolve) => setTimeout(resolve, 10));
82+
83+
expect(refresh.isJobActive('mouseleave-user')).toBe(false);
84+
85+
vi.restoreAllMocks();
86+
});
87+
});

0 commit comments

Comments
 (0)