[READ-ONLY] a fast, modern browser for the npm registry
at main 50 lines 1.5 kB view raw
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})