1+ import { Buffer } from 'node:buffer'
12import { createHash } from 'node:crypto'
23import { beforeEach , describe , expect , it , vi } from 'vitest'
34
@@ -8,9 +9,13 @@ vi.mock('#server/utils/npm', () => ({
89const { getGravatarFromUsername } = await import ( '../../../../server/utils/gravatar' )
910const { fetchUserEmail } = await import ( '#server/utils/npm' )
1011
12+ const mockFetch = vi . fn ( )
13+
1114describe ( 'gravatar utils' , ( ) => {
1215 beforeEach ( ( ) => {
1316 vi . clearAllMocks ( )
17+ mockFetch . mockReset ( )
18+ vi . stubGlobal ( 'fetch' , mockFetch )
1419 } )
1520
1621 it ( 'returns null when username is empty' , async ( ) => {
@@ -29,25 +34,41 @@ describe('gravatar utils', () => {
2934 expect ( fetchUserEmail ) . toHaveBeenCalledOnce ( )
3035 } )
3136
32- it ( 'builds a gravatar URL with a trimmed, lowercased email hash' , async ( ) => {
37+ it ( 'builds a gravatar data URL with a trimmed, lowercased email hash' , async ( ) => {
3338 const email = ' Test@Example.com '
3439 const normalized = 'test@example.com'
3540 const hash = createHash ( 'md5' ) . update ( normalized ) . digest ( 'hex' )
41+ const imageBytes = new Uint8Array ( [ 1 , 2 , 3 ] )
42+ const base64 = Buffer . from ( imageBytes ) . toString ( 'base64' )
3643 vi . mocked ( fetchUserEmail ) . mockResolvedValue ( email )
44+ mockFetch . mockResolvedValue ( {
45+ ok : true ,
46+ headers : { get : ( ) => 'image/png' } ,
47+ arrayBuffer : vi . fn ( ) . mockResolvedValue ( imageBytes . buffer ) ,
48+ } )
3749
3850 const url = await getGravatarFromUsername ( 'user' )
3951
40- expect ( url ) . toBe ( `https://www.gravatar.com/avatar/${ hash } ?s=80&d=404` )
52+ expect ( url ) . toBe ( `data:image/png;base64,${ base64 } ` )
53+ expect ( mockFetch ) . toHaveBeenCalledWith ( `https://www.gravatar.com/avatar/${ hash } ?s=80&d=404` )
4154 } )
4255
4356 it ( 'supports custom size' , async ( ) => {
4457 const email = 'user@example.com'
4558 const hash = createHash ( 'md5' ) . update ( email ) . digest ( 'hex' )
59+ const imageBytes = new Uint8Array ( [ 4 , 5 , 6 ] )
60+ const base64 = Buffer . from ( imageBytes ) . toString ( 'base64' )
4661 vi . mocked ( fetchUserEmail ) . mockResolvedValue ( email )
62+ mockFetch . mockResolvedValue ( {
63+ ok : true ,
64+ headers : { get : ( ) => 'image/png' } ,
65+ arrayBuffer : vi . fn ( ) . mockResolvedValue ( imageBytes . buffer ) ,
66+ } )
4767
4868 const url = await getGravatarFromUsername ( 'user' , 128 )
4969
50- expect ( url ) . toBe ( `https://www.gravatar.com/avatar/${ hash } ?s=128&d=404` )
70+ expect ( url ) . toBe ( `data:image/png;base64,${ base64 } ` )
71+ expect ( mockFetch ) . toHaveBeenCalledWith ( `https://www.gravatar.com/avatar/${ hash } ?s=128&d=404` )
5172 } )
5273
5374 it ( 'trims the username before lookup' , async ( ) => {
0 commit comments