Repository navigation
Expand file tree
/
Copy pathvalidate-user.test.ts
More file actions
64 lines (46 loc) · 2.04 KB
/
Copy pathvalidate-user.test.ts
File metadata and controls
64 lines (46 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { gitHubUserValidator } from './validate-user';
import { fetchUserProfile } from '../../lib/github';
vi.mock('../../lib/github', () => ({
fetchUserProfile: vi.fn(),
}));
describe('GitHubUserValidator', () => {
beforeEach(() => {
gitHubUserValidator.reset();
vi.clearAllMocks();
});
it('returns true for an existing GitHub user', async () => {
vi.mocked(fetchUserProfile).mockResolvedValue({} as never);
const result = await gitHubUserValidator.validateUser('octocat');
expect(result).toBe(true);
expect(fetchUserProfile).toHaveBeenCalledTimes(1);
});
it('returns false when GitHub reports user not found', async () => {
vi.mocked(fetchUserProfile).mockRejectedValue(new Error('User not found'));
const result = await gitHubUserValidator.validateUser('missing-user');
expect(result).toBe(false);
expect(fetchUserProfile).toHaveBeenCalledTimes(1);
});
it('caches successful validation results', async () => {
vi.mocked(fetchUserProfile).mockResolvedValue({} as never);
await gitHubUserValidator.validateUser('octocat');
await gitHubUserValidator.validateUser('octocat');
expect(fetchUserProfile).toHaveBeenCalledTimes(1);
});
it('caches negative validation results', async () => {
vi.mocked(fetchUserProfile).mockRejectedValue(new Error('User not found'));
await gitHubUserValidator.validateUser('ghost-user');
await gitHubUserValidator.validateUser('ghost-user');
expect(fetchUserProfile).toHaveBeenCalledTimes(1);
});
it('rethrows temporary GitHub API errors without caching', async () => {
vi.mocked(fetchUserProfile).mockRejectedValue(new Error('GitHub API rate limit exceeded'));
await expect(gitHubUserValidator.validateUser('octocat')).rejects.toThrow(
'GitHub API rate limit exceeded'
);
await expect(gitHubUserValidator.validateUser('octocat')).rejects.toThrow(
'GitHub API rate limit exceeded'
);
expect(fetchUserProfile).toHaveBeenCalledTimes(2);
});
});