xref: /expo/docs/ui/components/Footer/Footer.test.tsx (revision dfd15ebd)
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