import * as React from 'react'; import { shallow } from 'enzyme'; import ContactDatalistItem from '../ContactDatalistItem'; import DatalistItem from '../../datalist-item'; import Avatar from '../../avatar'; import { ContactType } from '../../../features/unified-share-modal/types'; describe('components/contact-datalist-item/ContactDatalistItem', () => { test('should render a DatalistItem with name and subtitle', () => { const wrapper = shallow(); expect(wrapper.find(DatalistItem).length).toBe(1); expect(wrapper.find('.contact-name').text()).toEqual('name'); expect(wrapper.find('.contact-sub-name').text()).toEqual('subtitle'); expect(wrapper.find(Avatar).length).toBe(0); }); test('should not render a subtitle when not provided', () => { const wrapper = shallow(); expect(wrapper.find('.contact-sub-name').length).toBe(0); expect(wrapper.find(Avatar).length).toBe(0); }); describe('avatars with or without image URLs', () => { test('should show avatar component when specified', () => { const wrapper = shallow(); expect(wrapper.find(Avatar).length).toBe(1); }); test('should do nothing when getPillImageUrl returns a rejected Promise', async () => { const wrapper = shallow( Promise.reject(new Error())} />, ); const instance = await wrapper.instance(); instance.componentDidMount?.(); wrapper.update(); expect(wrapper.find(Avatar).length).toBe(1); expect(wrapper.find(Avatar).props().avatarUrl).toBeUndefined(); }); test.each([ [(contact: ContactType) => `/test?id=${contact.id}`], [(contact: ContactType) => Promise.resolve(`/test?id=${contact.id}`)], ])('should use the avatar URL when the prop (and show avatar) are provided', async getContactAvatarUrl => { const wrapper = shallow( , ); expect(wrapper.find(Avatar).length).toBe(1); expect(wrapper.find(Avatar).props().avatarUrl).toBeUndefined(); const instance = await wrapper.instance(); instance.componentDidMount?.(); wrapper.update(); expect(wrapper.find(Avatar).length).toBe(1); expect(wrapper.find(Avatar).props().avatarUrl).toEqual('/test?id=123'); }); test('should not have the avatar URL when the id prop is missing', () => { const wrapper = shallow( `/test?id=${contact.id}`} />, ); expect(wrapper.find(Avatar).length).toBe(1); expect(wrapper.find(Avatar).props().avatarUrl).toBeUndefined(); }); test.each([['user'], [undefined], [null]])('should have avatar URL when the type prop is %s', type => { const contactID = '123'; const getContactAvatarUrlMock = jest .fn() .mockImplementation(() => Promise.resolve(`/test?id=${contactID}`)); const wrapper = shallow( , ); expect(wrapper.state('avatarUrl')).toBe(undefined); const instance = wrapper.instance(); if (instance.componentDidMount) { instance.componentDidMount(); } setImmediate(() => { wrapper.update(); expect(wrapper.find('LabelPillIcon').length).toBe(2); expect(wrapper.find('LabelPillIcon[avatarUrl]').length).toBe(1); expect(getContactAvatarUrlMock).toHaveBeenCalledWith({ id: contactID, type }); }); }); }); });