1import { render } from '@testing-library/react'; 2import { RouterContext } from 'next/dist/shared/lib/router-context'; 3import { NextRouter } from 'next/router'; 4import * as React from 'react'; 5 6import { Footer } from './Footer'; 7import { githubUrl } from './utils'; 8 9const withTestRouter = (tree: React.ReactElement, router: Partial<NextRouter> = {}) => ( 10 <RouterContext.Provider value={router as NextRouter}>{tree}</RouterContext.Provider> 11); 12 13describe('DocumentationFooter', () => { 14 test('displays default links', () => { 15 const router = { asPath: '/', pathname: '/example/' }; 16 const { container } = render(withTestRouter(<Footer title="test-title" />, router)); 17 18 expect(container).toHaveTextContent('Ask a question on the forums'); 19 expect(container).toHaveTextContent('Edit this page'); 20 }); 21 22 test('displays forums link with tag', () => { 23 const router = { asPath: '/sdk/', pathname: '' }; 24 const { container } = render(withTestRouter(<Footer title="test-title" />, router)); 25 26 expect(container).toHaveTextContent('Ask a question on the forums about test-title'); 27 }); 28 29 test('displays issues link', () => { 30 const router = { asPath: '/sdk/', pathname: '' }; 31 const { container } = render(withTestRouter(<Footer title="test-title" />, router)); 32 33 expect(container).toHaveTextContent('View open bug reports for test-title'); 34 }); 35 36 test('displays source code link', () => { 37 const router = { asPath: '/sdk/', pathname: '' }; 38 const { container } = render( 39 withTestRouter(<Footer title="test-title" sourceCodeUrl="/" />, router) 40 ); 41 42 expect(container).toHaveTextContent('View source code for test-title'); 43 }); 44}); 45 46describe('githubUrl', () => { 47 const EDIT_URL_PREFIX = 'https://github.com/expo/expo/edit/main/docs/pages'; 48 49 test('non-versioned page', () => { 50 expect(githubUrl('/guides')).toBe(EDIT_URL_PREFIX + '/guides.mdx'); 51 }); 52 53 test('nested non-versioned page', () => { 54 expect(githubUrl('/build/introduction')).toBe(EDIT_URL_PREFIX + '/build/introduction.mdx'); 55 }); 56 57 test('versioned index page', () => { 58 expect(githubUrl('/versions/v42.0.0')).toBe(EDIT_URL_PREFIX + '/versions/v42.0.0/index.mdx'); 59 }); 60 61 test('nested versioned page', () => { 62 expect(githubUrl('/versions/v42.0.0/sdk/av')).toBe( 63 EDIT_URL_PREFIX + '/versions/v42.0.0/sdk/av.mdx' 64 ); 65 }); 66 67 test('latest index page', () => { 68 expect(githubUrl('/versions/latest')).toBe(EDIT_URL_PREFIX + '/versions/unversioned/index.mdx'); 69 }); 70 71 test('nested latest page', () => { 72 expect(githubUrl('/versions/latest/sdk/av')).toBe( 73 EDIT_URL_PREFIX + '/versions/unversioned/sdk/av.mdx' 74 ); 75 }); 76 77 test('unversioned index page', () => { 78 expect(githubUrl('/versions/unversioned')).toBe( 79 EDIT_URL_PREFIX + '/versions/unversioned/index.mdx' 80 ); 81 }); 82 83 test('nested unversioned page', () => { 84 expect(githubUrl('/versions/unversioned/sdk/av')).toBe( 85 EDIT_URL_PREFIX + '/versions/unversioned/sdk/av.mdx' 86 ); 87 }); 88}); 89