1- import { Buffer } from 'node:buffer'
21import { createHash } from 'node:crypto'
32import { beforeEach , describe , expect , it , vi } from 'vitest'
43
@@ -9,66 +8,36 @@ vi.mock('#server/utils/npm', () => ({
98const { getGravatarFromUsername } = await import ( '../../../../server/utils/gravatar' )
109const { fetchUserEmail } = await import ( '#server/utils/npm' )
1110
12- const mockFetch = vi . fn ( )
13-
1411describe ( 'gravatar utils' , ( ) => {
1512 beforeEach ( ( ) => {
1613 vi . clearAllMocks ( )
17- mockFetch . mockReset ( )
18- vi . stubGlobal ( 'fetch' , mockFetch )
1914 } )
2015
2116 it ( 'returns null when username is empty' , async ( ) => {
22- const url = await getGravatarFromUsername ( '' )
17+ const hash = await getGravatarFromUsername ( '' )
2318
24- expect ( url ) . toBeNull ( )
19+ expect ( hash ) . toBeNull ( )
2520 expect ( fetchUserEmail ) . not . toHaveBeenCalled ( )
2621 } )
2722
2823 it ( 'returns null when email is not available' , async ( ) => {
2924 vi . mocked ( fetchUserEmail ) . mockResolvedValue ( null )
3025
31- const url = await getGravatarFromUsername ( 'user' )
26+ const hash = await getGravatarFromUsername ( 'user' )
3227
33- expect ( url ) . toBeNull ( )
28+ expect ( hash ) . toBeNull ( )
3429 expect ( fetchUserEmail ) . toHaveBeenCalledOnce ( )
3530 } )
3631
37- it ( 'builds a gravatar data URL with a trimmed, lowercased email hash ' , async ( ) => {
32+ it ( 'returns md5 hash of trimmed, lowercased email' , async ( ) => {
3833 const email = ' Test@Example.com '
3934 const normalized = 'test@example.com'
40- const hash = createHash ( 'md5' ) . update ( normalized ) . digest ( 'hex' )
41- const imageBytes = new Uint8Array ( [ 1 , 2 , 3 ] )
42- const base64 = Buffer . from ( imageBytes ) . toString ( 'base64' )
43- vi . mocked ( fetchUserEmail ) . mockResolvedValue ( email )
44- mockFetch . mockResolvedValue ( {
45- ok : true ,
46- headers : { get : ( ) => 'image/png' } ,
47- arrayBuffer : vi . fn ( ) . mockResolvedValue ( imageBytes . buffer ) ,
48- } )
49-
50- const url = await getGravatarFromUsername ( 'user' )
51-
52- expect ( url ) . toBe ( `data:image/png;base64,${ base64 } ` )
53- expect ( mockFetch ) . toHaveBeenCalledWith ( `https://www.gravatar.com/avatar/${ hash } ?s=80&d=404` )
54- } )
55-
56- it ( 'supports custom size' , async ( ) => {
57- const email = 'user@example.com'
58- const hash = createHash ( 'md5' ) . update ( email ) . digest ( 'hex' )
59- const imageBytes = new Uint8Array ( [ 4 , 5 , 6 ] )
60- const base64 = Buffer . from ( imageBytes ) . toString ( 'base64' )
35+ const expectedHash = createHash ( 'md5' ) . update ( normalized ) . digest ( 'hex' )
6136 vi . mocked ( fetchUserEmail ) . mockResolvedValue ( email )
62- mockFetch . mockResolvedValue ( {
63- ok : true ,
64- headers : { get : ( ) => 'image/png' } ,
65- arrayBuffer : vi . fn ( ) . mockResolvedValue ( imageBytes . buffer ) ,
66- } )
6737
68- const url = await getGravatarFromUsername ( 'user' , 128 )
38+ const hash = await getGravatarFromUsername ( 'user' )
6939
70- expect ( url ) . toBe ( `data:image/png;base64,${ base64 } ` )
71- expect ( mockFetch ) . toHaveBeenCalledWith ( `https://www.gravatar.com/avatar/${ hash } ?s=128&d=404` )
40+ expect ( hash ) . toBe ( expectedHash )
7241 } )
7342
7443 it ( 'trims the username before lookup' , async ( ) => {
0 commit comments