Files
freeCodeCamp/client/src/components/Header/Header.test.js

137 lines
4.0 KiB
JavaScript
Raw Normal View History

/* global expect */
import React from 'react';
import ShallowRenderer from 'react-test-renderer/shallow';
2020-09-03 14:21:16 +03:00
import renderer from 'react-test-renderer';
/* import { useTranslation } from 'react-i18next';
import { I18nextProvider } from 'react-i18next';
import i18n from '../../../i18n/configForTests';*/
2020-09-03 14:21:16 +03:00
import { UniversalNav } from './components/UniversalNav';
import { AuthOrProfile } from './components/NavLinks';
describe('<UniversalNav />', () => {
2020-09-03 14:21:16 +03:00
const UniversalNavProps = {
displayMenu: false,
menuButtonRef: {},
searchBarRef: {},
toggleDisplayMenu: function() {},
pathName: '/'
};
it('renders to the DOM', () => {
const shallow = new ShallowRenderer();
shallow.render(<UniversalNav {...UniversalNavProps} />);
const result = shallow.getRenderOutput();
expect(result).toBeTruthy();
});
});
2020-09-03 14:21:16 +03:00
describe('<NavLinks />', () => {
it('shows Curriculum and Sign In buttons when not signed in', () => {
2020-09-03 14:21:16 +03:00
const landingPageProps = {
pending: false
2020-09-03 14:21:16 +03:00
};
const shallow = new ShallowRenderer();
shallow.render(<AuthOrProfile {...landingPageProps} />);
const result = shallow.getRenderOutput();
expect(
hasForumNavItem(result) &&
hasCurriculumNavItem(result) &&
hasSignInButton(result)
2020-09-03 14:21:16 +03:00
).toBeTruthy();
});
it('has avatar with default border for default users', () => {
const defaultUserProps = {
user: {
username: 'test-user',
picture: 'https://freecodecamp.org/image.png'
},
pending: false
2020-09-03 14:21:16 +03:00
};
const componentTree = renderer
.create(<AuthOrProfile {...defaultUserProps} />)
.toJSON();
expect(avatarHasClass(componentTree, 'default-border')).toBeTruthy();
});
2020-09-03 14:21:16 +03:00
it('has avatar with gold border for donating users', () => {
const donatingUserProps = {
user: {
username: 'test-user',
picture: 'https://freecodecamp.org/image.png',
isDonating: true
},
pending: false
2020-09-03 14:21:16 +03:00
};
const componentTree = renderer
.create(<AuthOrProfile {...donatingUserProps} />)
.toJSON();
expect(avatarHasClass(componentTree, 'gold-border')).toBeTruthy();
});
it('has avatar with blue border for top contributors', () => {
2020-09-03 14:21:16 +03:00
const topContributorUserProps = {
user: {
username: 'test-user',
picture: 'https://freecodecamp.org/image.png',
yearsTopContributor: [2020]
},
pending: false
2020-09-03 14:21:16 +03:00
};
const componentTree = renderer
.create(<AuthOrProfile {...topContributorUserProps} />)
.toJSON();
expect(avatarHasClass(componentTree, 'blue-border')).toBeTruthy();
2020-09-03 14:21:16 +03:00
});
it('has avatar with purple border for donating top contributors', () => {
const topDonatingContributorUserProps = {
user: {
username: 'test-user',
picture: 'https://freecodecamp.org/image.png',
isDonating: true,
yearsTopContributor: [2020]
},
pending: false
2020-09-03 14:21:16 +03:00
};
const componentTree = renderer
.create(<AuthOrProfile {...topDonatingContributorUserProps} />)
.toJSON();
expect(avatarHasClass(componentTree, 'purple-border')).toBeTruthy();
});
});
const navigationLinks = (component, navItem) => {
return component.props.children[0].props.children[navItem].props.children
.props;
};
2020-09-03 14:21:16 +03:00
const profileNavItem = component => component[2].children[0];
const hasForumNavItem = component => {
const { children, to } = navigationLinks(component, 0);
return (
children === 'buttons.forum' && to === 'https://forum.freecodecamp.org'
);
2020-09-03 14:21:16 +03:00
};
const hasCurriculumNavItem = component => {
const { children, to } = navigationLinks(component, 1);
return children === 'buttons.curriculum' && to === '/learn';
2020-09-03 14:21:16 +03:00
};
const hasSignInButton = component =>
component.props.children[1].props.children === 'buttons.sign-in';
2020-09-03 14:21:16 +03:00
const avatarHasClass = (componentTree, classes) => {
// componentTree[1].children[0].children[1].props.className
2020-09-03 14:21:16 +03:00
return (
profileNavItem(componentTree).children[1].props.className ===
2020-09-03 14:21:16 +03:00
'avatar-container ' + classes
);
};