forked from
npmx.dev/npmx.dev
[READ-ONLY]
a fast, modern browser for the npm registry
1import { createHash } from 'node:crypto'
2import { beforeEach, describe, expect, it, vi } from 'vitest'
3
4vi.mock('#server/utils/npm', () => ({
5 fetchUserEmail: vi.fn(),
6}))
7
8const { getGravatarFromUsername } = await import('../../../../server/utils/gravatar')
9const { fetchUserEmail } = await import('#server/utils/npm')
10
11describe('gravatar utils', () => {
12 beforeEach(() => {
13 vi.clearAllMocks()
14 })
15
16 it('returns null when username is empty', async () => {
17 const hash = await getGravatarFromUsername('')
18
19 expect(hash).toBeNull()
20 expect(fetchUserEmail).not.toHaveBeenCalled()
21 })
22
23 it('returns null when email is not available', async () => {
24 vi.mocked(fetchUserEmail).mockResolvedValue(null)
25
26 const hash = await getGravatarFromUsername('user')
27
28 expect(hash).toBeNull()
29 expect(fetchUserEmail).toHaveBeenCalledOnce()
30 })
31
32 it('returns md5 hash of trimmed, lowercased email', async () => {
33 const email = ' Test@Example.com '
34 const normalized = 'test@example.com'
35 const expectedHash = createHash('md5').update(normalized).digest('hex')
36 vi.mocked(fetchUserEmail).mockResolvedValue(email)
37
38 const hash = await getGravatarFromUsername('user')
39
40 expect(hash).toBe(expectedHash)
41 })
42
43 it('trims the username before lookup', async () => {
44 vi.mocked(fetchUserEmail).mockResolvedValue('user@example.com')
45
46 await getGravatarFromUsername(' user ')
47
48 expect(fetchUserEmail).toHaveBeenCalledWith('user')
49 })
50})