35 lines
1.8 KiB
TypeScript
35 lines
1.8 KiB
TypeScript
// @vitest-environment jsdom
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import { mount, flushPromises } from '@vue/test-utils'
|
|
import ProfileAvatar from '@/components/hermes/profiles/ProfileAvatar.vue'
|
|
import { fetchProfileAvatar } from '@/api/hermes/profiles'
|
|
|
|
vi.mock('@/api/hermes/profiles', () => ({ fetchProfileAvatar: vi.fn() }))
|
|
|
|
describe('profile avatar loading', () => {
|
|
beforeEach(() => vi.clearAllMocks())
|
|
|
|
it('fetches an uploaded image only when displayed and ignores old profile responses', async () => {
|
|
let finish!: (data: any) => void
|
|
vi.mocked(fetchProfileAvatar).mockReturnValueOnce(new Promise(resolve => { finish = resolve }))
|
|
vi.mocked(fetchProfileAvatar).mockResolvedValueOnce({ type: 'image', dataUrl: 'data:image/png;base64,Yg==' })
|
|
const wrapper = mount(ProfileAvatar, { props: { name: 'a', avatar: { type: 'image', updatedAt: 1 } } })
|
|
expect(fetchProfileAvatar).toHaveBeenCalledWith('a')
|
|
await wrapper.setProps({ name: 'b', avatar: { type: 'image', updatedAt: 2 } })
|
|
await flushPromises()
|
|
expect(wrapper.find('img').attributes('src')).toBe('data:image/png;base64,Yg==')
|
|
finish({ type: 'image', dataUrl: 'data:image/png;base64,YQ==' })
|
|
await flushPromises()
|
|
expect(wrapper.find('img').attributes('src')).toBe('data:image/png;base64,Yg==')
|
|
wrapper.unmount()
|
|
})
|
|
|
|
it('does not fetch generated or already loaded avatars', async () => {
|
|
const wrapper = mount(ProfileAvatar, { props: { name: 'a', avatar: { type: 'generated', seed: 'a' } } })
|
|
await wrapper.setProps({ avatar: { type: 'image', dataUrl: 'data:image/png;base64,YQ==' } })
|
|
expect(fetchProfileAvatar).not.toHaveBeenCalled()
|
|
expect(wrapper.find('img').attributes('src')).toBe('data:image/png;base64,YQ==')
|
|
wrapper.unmount()
|
|
})
|
|
})
|