import { render, waitFor, cleanup } from '@testing-library/react'; import dayjs from 'dayjs'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { FileIcon } from '@availity/mui-icon'; import { SpacesLink } from './SpacesLink'; import { Spaces } from '../Spaces'; describe('SpacesLink', () => { afterEach(() => { vi.clearAllMocks(); cleanup(); }); it('renders link card from space', async () => { const space = { id: 'encoded1', configurationId: '1', type: 'APPLICATION', name: 'An application', description: 'This is an application', link: { url: '/path/to/url', text: 'the link', target: '_self', }, }; const queryClient = new QueryClient(); const { container } = render( ); expect(container.tagName).toBe('DIV'); const linkHeader = await waitFor(() => container.querySelector('#app-title-1')); expect(linkHeader?.attributes.getNamedItem('role')?.value).toBe('link'); expect(linkHeader?.attributes.getNamedItem('data-av-analytics-application-id')?.value).toBe('1'); expect(linkHeader?.attributes.getNamedItem('data-av-analytics-action')?.value).toBe('click'); expect(linkHeader?.attributes.getNamedItem('data-av-analytics-value')?.value).toBe('/path/to/url'); expect(linkHeader?.attributes.getNamedItem('data-av-analytics-label')?.value).toBe('An application'); expect(linkHeader?.textContent).toBe('An application'); const linkDescription = await waitFor(() => container.querySelector('#app-description-1')); expect(linkDescription?.textContent).toBe('This is an application'); }); it('renders link card from space with custom link tag', async () => { const space = { id: 'encoded2', configurationId: '2', type: 'APPLICATION', name: 'An application', description: 'This is an application', link: { url: '/path/to/url', text: 'the link', target: '_self', }, }; const queryClient = new QueryClient(); const { container } = render( ); const link2 = await waitFor(() => container.querySelector('#application-link-2')); expect(link2?.tagName).toBe('LI'); }); it('renders link card from space with no titleTag', async () => { const space = { id: 'encoded3', configurationId: '3', type: 'APPLICATION', name: 'An application', description: 'This is an application', link: { url: '/path/to/url', text: 'the link', target: '_self', }, }; const queryClient = new QueryClient(); const { container } = render( ); const link3_header = await waitFor(() => container.querySelector('#app-title-3')); expect(link3_header?.tagName).toBe('A'); }); it('renders link card from space with custom title class', async () => { const space = { id: 'encoded3', configurationId: '3', type: 'APPLICATION', name: 'An application', description: 'This is an application', link: { url: '/path/to/url', text: 'the link', target: '_self', }, }; const queryClient = new QueryClient(); const { container } = render( ); const link3_title = await waitFor(() => container.querySelector('#app-title-3')); expect(link3_title?.className).toContain('custom_class'); }); it('renders link card from new space with new badge', async () => { const space = { id: 'encoded7', configurationId: '7', type: 'NAVIGATION', name: 'A navigation', description: 'This is a navigation', link: { url: '/path/to/url', text: 'the link', target: '_self', }, isNew: true, }; const queryClient = new QueryClient(); const { container } = render( ); const link7_newBadge = await waitFor(() => container.querySelector('#app-new-badge-7')); expect(link7_newBadge?.className.includes('MuiChip-colorSecondary')).toBeTruthy(); expect(link7_newBadge?.textContent).toBe('New!'); }); it('renders link card from new space with date', async () => { const space = { id: 'encoded8', configurationId: '8', type: 'NAVIGATION', name: 'A navigation', description: 'This is a navigation', link: { url: '/path/to/url', text: 'the link', target: '_self', }, activeDate: dayjs('01/01/2022').format(), }; const queryClient = new QueryClient(); const { container } = render( ); const link8_date = await waitFor(() => container.querySelector('#app-date-badge-8')); expect(link8_date?.tagName).toBe('SPAN'); expect(link8_date?.className.includes('MuiTypography-caption')).toBeTruthy(); expect(link8_date?.textContent).toBe('01/01/2022'); }); it('renders link card from space with children', async () => { const space = { id: 'encoded9', configurationId: '9', type: 'NAVIGATION', name: 'A navigation', description: 'This is a navigation', link: { url: '/path/to/url', text: 'the link', target: '_self', }, }; const queryClient = new QueryClient(); const { container } = render( {space.name} ); const link9_child = await waitFor(() => container.querySelector('#space-link-child-1')); expect(link9_child?.tagName).toBe('SPAN'); expect(link9_child?.attributes.getNamedItem('role')?.value).toBe('link'); expect(link9_child?.attributes.getNamedItem('data-av-analytics-application-id')?.value).toBe('9'); expect(link9_child?.attributes.getNamedItem('data-av-analytics-action')?.value).toBe('click'); expect(link9_child?.attributes.getNamedItem('data-av-analytics-value')?.value).toBe('/path/to/url'); expect(link9_child?.attributes.getNamedItem('data-av-analytics-label')?.value).toBe('A navigation'); }); it('renders link card from space with children function', async () => { const space = { id: 'encoded10', configurationId: '10', type: 'NAVIGATION', name: 'A navigation', description: 'This is a navigation', link: { url: '/path/to/url', text: 'the link', target: '_self', }, }; const children = ({ name }: { name: string }) => {name}; const queryClient = new QueryClient(); const { container } = render( {children} ); const link10_child = await waitFor(() => container.querySelector('#space-link-child-2')); expect(link10_child?.tagName).toBe('SPAN'); expect(link10_child?.textContent).toBe('A navigation'); }); it('renders title with link role when url is provided', async () => { const space = { id: 'encoded11', configurationId: '11', type: 'APPLICATION', name: 'application with link', description: 'This is a application', link: { url: '/path/to/url', text: 'title', target: '_self', }, }; const queryClient = new QueryClient(); const { container } = render( ); const link11_title = await waitFor(() => container.querySelector('#app-title-11')); expect(link11_title?.getAttribute('role')).toBe('link'); }); it('renders title without link role when no url is provided', async () => { const space = { id: 'encoded12', configurationId: '12', type: 'APPLICATION', name: 'no link application', description: 'This is a application', link: { text: 'title', target: '_self', }, }; const queryClient = new QueryClient(); const { container } = render( ); const link12_title = await waitFor(() => container.querySelector('#app-title-12')); expect(link12_title?.getAttribute('role')).toBe('listitem'); }); it('renders title without link role when isGhosted', async () => { const space = { id: 'encoded13', configurationId: '13', type: 'APPLICATION', name: 'no link application', description: 'This is a application', link: { url: '/path/to/url', text: 'title', target: '_self', }, isGhosted: true, }; const queryClient = new QueryClient(); const { container } = render( ); const link13_title = await waitFor(() => container.querySelector('#app-title-13')); expect(link13_title?.getAttribute('role')).toBe('listitem'); }); it('renders title with link role when url is provided and isGhosted = false', async () => { const space = { id: 'encoded14', configurationId: '14', type: 'APPLICATION', name: 'application with link', description: 'This is a application', link: { url: '/path/to/url', text: 'title', target: '_self', }, isGhosted: false, }; const queryClient = new QueryClient(); const { container } = render( ); const link14_title = await waitFor(() => container.querySelector('#app-title-14')); expect(link14_title?.getAttribute('role')).toBe('link'); }); it('renders title with link role when url is provided and isGhosted is undefined', async () => { const space = { id: 'encoded14', configurationId: '14', type: 'APPLICATION', name: 'application with link', description: 'This is a application', link: { url: '/path/to/url', text: 'title', target: '_self', }, }; const queryClient = new QueryClient(); const { container } = render( ); const link14_title = await waitFor(() => container.querySelector('#app-title-14')); expect(link14_title?.getAttribute('role')).toBe('link'); }); it('renders link with icon for type file when icon is true', async () => { const space = { id: 'encoded14', configurationId: '14', type: 'FILE', url: '/path/to/url', name: 'file with link', metadataPairs: [{ name: 'icon', value: 'file-archive' }], description: 'This is a file', link: { url: '/path/to/url', text: 'title', target: '_self', }, }; const queryClient = new QueryClient(); const { container } = render( ); const link = await waitFor(() => container.getElementsByTagName('a')); expect(link[0]?.getAttribute('href')).toBe(space.url); const icon = await waitFor(() => container.getElementsByTagName('svg')[0]); const { container: testContainer } = render(); expect(icon).toStrictEqual(testContainer.getElementsByTagName('svg')[0]); }); });