feat(client): ts-migration for layout index file, Intro Component and header test file (#43094)
This commit is contained in:
		@@ -1,6 +1,10 @@
 | 
				
			|||||||
import React from 'react';
 | 
					/* eslint-disable @typescript-eslint/no-unsafe-assignment */
 | 
				
			||||||
 | 
					/* eslint-disable @typescript-eslint/no-unsafe-member-access */
 | 
				
			||||||
 | 
					/* eslint-disable @typescript-eslint/no-unsafe-return */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import React, { Ref } from 'react';
 | 
				
			||||||
import { useTranslation } from 'react-i18next';
 | 
					import { useTranslation } from 'react-i18next';
 | 
				
			||||||
import { create } from 'react-test-renderer';
 | 
					import { create, ReactTestRendererJSON } from 'react-test-renderer';
 | 
				
			||||||
import ShallowRenderer from 'react-test-renderer/shallow';
 | 
					import ShallowRenderer from 'react-test-renderer/shallow';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import envData from '../../../../config/env.json';
 | 
					import envData from '../../../../config/env.json';
 | 
				
			||||||
@@ -15,8 +19,9 @@ jest.mock('../../analytics');
 | 
				
			|||||||
describe('<UniversalNav />', () => {
 | 
					describe('<UniversalNav />', () => {
 | 
				
			||||||
  const UniversalNavProps = {
 | 
					  const UniversalNavProps = {
 | 
				
			||||||
    displayMenu: false,
 | 
					    displayMenu: false,
 | 
				
			||||||
    menuButtonRef: {},
 | 
					    menuButtonRef: {} as Ref<HTMLButtonElement> | undefined,
 | 
				
			||||||
    searchBarRef: {},
 | 
					    searchBarRef: {},
 | 
				
			||||||
 | 
					    // eslint-disable-next-line @typescript-eslint/no-empty-function
 | 
				
			||||||
    toggleDisplayMenu: function () {},
 | 
					    toggleDisplayMenu: function () {},
 | 
				
			||||||
    pathName: '/',
 | 
					    pathName: '/',
 | 
				
			||||||
    fetchState: {
 | 
					    fetchState: {
 | 
				
			||||||
@@ -24,14 +29,15 @@ describe('<UniversalNav />', () => {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  it('renders to the DOM', () => {
 | 
					  it('renders to the DOM', () => {
 | 
				
			||||||
    const shallow = new ShallowRenderer();
 | 
					    const utils = ShallowRenderer.createRenderer();
 | 
				
			||||||
    shallow.render(<UniversalNav {...UniversalNavProps} />);
 | 
					    utils.render(<UniversalNav {...UniversalNavProps} />);
 | 
				
			||||||
    const view = shallow.getRenderOutput();
 | 
					    const view = utils.getRenderOutput();
 | 
				
			||||||
    expect(view).toBeTruthy();
 | 
					    expect(view).toBeTruthy();
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('<NavLinks />', () => {
 | 
					describe('<NavLinks />', () => {
 | 
				
			||||||
 | 
					  const { t } = useTranslation();
 | 
				
			||||||
  it('has expected navigation links when not signed in', () => {
 | 
					  it('has expected navigation links when not signed in', () => {
 | 
				
			||||||
    const landingPageProps = {
 | 
					    const landingPageProps = {
 | 
				
			||||||
      fetchState: {
 | 
					      fetchState: {
 | 
				
			||||||
@@ -45,12 +51,12 @@ describe('<NavLinks />', () => {
 | 
				
			|||||||
      i18n: {
 | 
					      i18n: {
 | 
				
			||||||
        language: 'en'
 | 
					        language: 'en'
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      toggleNightMode: theme => theme
 | 
					      toggleNightMode: (theme: string) => theme,
 | 
				
			||||||
 | 
					      t: t
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    const shallow = new ShallowRenderer();
 | 
					    const utils = ShallowRenderer.createRenderer();
 | 
				
			||||||
    shallow.render(<NavLinks {...landingPageProps} />);
 | 
					    utils.render(<NavLinks {...landingPageProps} />);
 | 
				
			||||||
    const view = shallow.getRenderOutput();
 | 
					    const view = utils.getRenderOutput();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    expect(
 | 
					    expect(
 | 
				
			||||||
      hasDonateNavItem(view) &&
 | 
					      hasDonateNavItem(view) &&
 | 
				
			||||||
        hasSignInNavItem(view) &&
 | 
					        hasSignInNavItem(view) &&
 | 
				
			||||||
@@ -74,12 +80,12 @@ describe('<NavLinks />', () => {
 | 
				
			|||||||
      i18n: {
 | 
					      i18n: {
 | 
				
			||||||
        language: 'en'
 | 
					        language: 'en'
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      t: useTranslation.t,
 | 
					      t: t,
 | 
				
			||||||
      toggleNightMode: theme => theme
 | 
					      toggleNightMode: (theme: string) => theme
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    const shallow = new ShallowRenderer();
 | 
					    const utils = ShallowRenderer.createRenderer();
 | 
				
			||||||
    shallow.render(<NavLinks {...landingPageProps} />);
 | 
					    utils.render(<NavLinks {...landingPageProps} />);
 | 
				
			||||||
    const view = shallow.getRenderOutput();
 | 
					    const view = utils.getRenderOutput();
 | 
				
			||||||
    expect(
 | 
					    expect(
 | 
				
			||||||
      hasDonateNavItem(view) &&
 | 
					      hasDonateNavItem(view) &&
 | 
				
			||||||
        hasCurriculumNavItem(view) &&
 | 
					        hasCurriculumNavItem(view) &&
 | 
				
			||||||
@@ -104,12 +110,12 @@ describe('<NavLinks />', () => {
 | 
				
			|||||||
      i18n: {
 | 
					      i18n: {
 | 
				
			||||||
        language: 'en'
 | 
					        language: 'en'
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      t: useTranslation.t,
 | 
					      t: t,
 | 
				
			||||||
      toggleNightMode: theme => theme
 | 
					      toggleNightMode: (theme: string) => theme
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    const shallow = new ShallowRenderer();
 | 
					    const utils = ShallowRenderer.createRenderer();
 | 
				
			||||||
    shallow.render(<NavLinks {...landingPageProps} />);
 | 
					    utils.render(<NavLinks {...landingPageProps} />);
 | 
				
			||||||
    const view = shallow.getRenderOutput();
 | 
					    const view = utils.getRenderOutput();
 | 
				
			||||||
    expect(
 | 
					    expect(
 | 
				
			||||||
      hasThanksForDonating(view) &&
 | 
					      hasThanksForDonating(view) &&
 | 
				
			||||||
        hasCurriculumNavItem(view) &&
 | 
					        hasCurriculumNavItem(view) &&
 | 
				
			||||||
@@ -192,39 +198,43 @@ describe('<AuthOrProfile />', () => {
 | 
				
			|||||||
  });
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const navigationLinks = (component, key) => {
 | 
					const navigationLinks = (component: JSX.Element, key: string) => {
 | 
				
			||||||
 | 
					  // eslint-disable-next-line @typescript-eslint/no-unsafe-call
 | 
				
			||||||
  const target = component.props.children.find(
 | 
					  const target = component.props.children.find(
 | 
				
			||||||
    child => child && child.key === key
 | 
					    (child: { key?: string }) => child && child.key === key
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
  return target.props;
 | 
					  return target.props;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					// eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
				
			||||||
 | 
					const profileNavItem = (component: any) => component.children[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const profileNavItem = component => component.children[0];
 | 
					const hasDonateNavItem = (component: JSX.Element) => {
 | 
				
			||||||
 | 
					 | 
				
			||||||
const hasDonateNavItem = component => {
 | 
					 | 
				
			||||||
  const { children, to } = navigationLinks(component, 'donate');
 | 
					  const { children, to } = navigationLinks(component, 'donate');
 | 
				
			||||||
  return children === 'buttons.donate' && to === '/donate';
 | 
					  return children === 'buttons.donate' && to === '/donate';
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hasThanksForDonating = component => {
 | 
					const hasThanksForDonating = (component: JSX.Element) => {
 | 
				
			||||||
  const { children } = navigationLinks(component, 'donate');
 | 
					  const { children } = navigationLinks(component, 'donate');
 | 
				
			||||||
  return children[0].props.children === 'donate.thanks';
 | 
					  return children ? children[0].props.children === 'donate.thanks' : null;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hasSignInNavItem = component => {
 | 
					const hasSignInNavItem = (component: JSX.Element) => {
 | 
				
			||||||
  const { children } = navigationLinks(component, 'signin');
 | 
					  const { children } = navigationLinks(component, 'signin');
 | 
				
			||||||
  return children === 'buttons.sign-in';
 | 
					  return children === 'buttons.sign-in';
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hasCurriculumNavItem = component => {
 | 
					const hasCurriculumNavItem = (component: JSX.Element) => {
 | 
				
			||||||
  const { children, to } = navigationLinks(component, 'learn');
 | 
					  const { children, to } = navigationLinks(component, 'learn');
 | 
				
			||||||
  return children === 'buttons.curriculum' && to === '/learn';
 | 
					  return children === 'buttons.curriculum' && to === '/learn';
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hasProfileAndSettingsNavItems = (component, username) => {
 | 
					const hasProfileAndSettingsNavItems = (
 | 
				
			||||||
 | 
					  component: JSX.Element,
 | 
				
			||||||
 | 
					  username: string
 | 
				
			||||||
 | 
					) => {
 | 
				
			||||||
  const fragment = navigationLinks(component, 'profile-settings');
 | 
					  const fragment = navigationLinks(component, 'profile-settings');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const profile = fragment.children[0].props;
 | 
					  const profile = fragment ? fragment.children[0].props : null;
 | 
				
			||||||
  const settings = fragment.children[1].props;
 | 
					  const settings = fragment.children[1].props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const hasProfile =
 | 
					  const hasProfile =
 | 
				
			||||||
@@ -235,7 +245,7 @@ const hasProfileAndSettingsNavItems = (component, username) => {
 | 
				
			|||||||
  return hasProfile && hasSettings;
 | 
					  return hasProfile && hasSettings;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hasForumNavItem = component => {
 | 
					const hasForumNavItem = (component: JSX.Element) => {
 | 
				
			||||||
  const { children, to } = navigationLinks(component, 'forum');
 | 
					  const { children, to } = navigationLinks(component, 'forum');
 | 
				
			||||||
  // TODO: test compiled TFunction value
 | 
					  // TODO: test compiled TFunction value
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
@@ -243,14 +253,14 @@ const hasForumNavItem = component => {
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hasNewsNavItem = component => {
 | 
					const hasNewsNavItem = (component: JSX.Element) => {
 | 
				
			||||||
  const { children, to } = navigationLinks(component, 'news');
 | 
					  const { children, to } = navigationLinks(component, 'news');
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    children[0].props.children === 'buttons.news' && to === 'links:nav.news'
 | 
					    children[0].props.children === 'buttons.news' && to === 'links:nav.news'
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hasRadioNavItem = component => {
 | 
					const hasRadioNavItem = (component: JSX.Element) => {
 | 
				
			||||||
  const { children, to } = navigationLinks(component, 'radio');
 | 
					  const { children, to } = navigationLinks(component, 'radio');
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    children[0].props.children === 'buttons.radio' &&
 | 
					    children[0].props.children === 'buttons.radio' &&
 | 
				
			||||||
@@ -258,7 +268,7 @@ const hasRadioNavItem = component => {
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const hasSignOutNavItem = component => {
 | 
					const hasSignOutNavItem = (component: JSX.Element) => {
 | 
				
			||||||
  const { children } = navigationLinks(component, 'signout-frag');
 | 
					  const { children } = navigationLinks(component, 'signout-frag');
 | 
				
			||||||
  const signOutProps = children[1].props;
 | 
					  const signOutProps = children[1].props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -273,7 +283,10 @@ const hasSignInButton = component =>
 | 
				
			|||||||
  component.props.children[1].props.children === 'buttons.sign-in';
 | 
					  component.props.children[1].props.children === 'buttons.sign-in';
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const avatarHasClass = (componentTree, classes) => {
 | 
					const avatarHasClass = (
 | 
				
			||||||
 | 
					  componentTree: ReactTestRendererJSON | ReactTestRendererJSON[] | null,
 | 
				
			||||||
 | 
					  classes: string
 | 
				
			||||||
 | 
					) => {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    profileNavItem(componentTree).props.className ===
 | 
					    profileNavItem(componentTree).props.className ===
 | 
				
			||||||
    'avatar-container ' + classes
 | 
					    'avatar-container ' + classes
 | 
				
			||||||
@@ -6,7 +6,7 @@ import { Link, Spacer } from '../../helpers';
 | 
				
			|||||||
import '../intro.css';
 | 
					import '../intro.css';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const { forumLocation } = envData;
 | 
					const { forumLocation } = envData;
 | 
				
			||||||
function IntroDescription() {
 | 
					function IntroDescription(): JSX.Element {
 | 
				
			||||||
  const { t } = useTranslation();
 | 
					  const { t } = useTranslation();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
		Reference in New Issue
	
	Block a user