From 5423c3630590ca428e3da215744ccd4c490fa9f9 Mon Sep 17 00:00:00 2001 From: Ben Warzeski Date: Fri, 1 Oct 2021 15:07:50 -0400 Subject: [PATCH] header unit tests --- .../CourseHeader/AnonymousUserMenu.jsx | 42 ++++++----- .../AnonymousUserMenu.messages.js | 31 -------- .../CourseHeader/AnonymousUserMenu.test.jsx | 27 +++++++ .../AuthenticatedUserDropdown.jsx | 53 -------------- .../AuthenticatedUserDropdown.messages.js | 53 -------------- .../AuthenticatedUserDropdown/UserAvatar.jsx | 27 +++++++ .../UserAvatar.test.jsx | 32 +++++++++ .../AuthenticatedUserDropdown/UserMenu.jsx | 40 +++++++++++ .../UserMenu.test.jsx | 37 ++++++++++ .../__snapshots__/UserAvatar.test.jsx.snap | 31 ++++++++ .../__snapshots__/index.test.jsx.snap | 20 ++++++ .../AuthenticatedUserDropdown/index.jsx | 38 ++++++++++ .../AuthenticatedUserDropdown/index.test.jsx | 27 +++++++ src/containers/CourseHeader/CourseLabel.jsx | 32 +++++++++ .../CourseHeader/CourseLabel.test.jsx | 18 +++++ src/containers/CourseHeader/Header.jsx | 70 +++++-------------- src/containers/CourseHeader/Header.test.jsx | 57 ++++++++------- src/containers/CourseHeader/LinkedLogo.jsx | 17 +++++ .../CourseHeader/LinkedLogo.test.jsx | 20 ++++++ .../AnonymousUserMenu.test.jsx.snap | 19 +++++ .../__snapshots__/CourseLabel.test.jsx.snap | 25 +++++++ .../__snapshots__/Header.test.jsx.snap | 51 ++++++++++++++ .../__snapshots__/LinkedLogo.test.jsx.snap | 14 ++++ src/containers/CourseHeader/messages.js | 10 +++ 24 files changed, 559 insertions(+), 232 deletions(-) delete mode 100644 src/containers/CourseHeader/AnonymousUserMenu.messages.js create mode 100644 src/containers/CourseHeader/AnonymousUserMenu.test.jsx delete mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown.jsx delete mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown.messages.js create mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown/UserAvatar.jsx create mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown/UserAvatar.test.jsx create mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.jsx create mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.test.jsx create mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/UserAvatar.test.jsx.snap create mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/index.test.jsx.snap create mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown/index.jsx create mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown/index.test.jsx create mode 100644 src/containers/CourseHeader/CourseLabel.jsx create mode 100644 src/containers/CourseHeader/CourseLabel.test.jsx create mode 100644 src/containers/CourseHeader/LinkedLogo.jsx create mode 100644 src/containers/CourseHeader/LinkedLogo.test.jsx create mode 100644 src/containers/CourseHeader/__snapshots__/AnonymousUserMenu.test.jsx.snap create mode 100644 src/containers/CourseHeader/__snapshots__/CourseLabel.test.jsx.snap create mode 100644 src/containers/CourseHeader/__snapshots__/Header.test.jsx.snap create mode 100644 src/containers/CourseHeader/__snapshots__/LinkedLogo.test.jsx.snap diff --git a/src/containers/CourseHeader/AnonymousUserMenu.jsx b/src/containers/CourseHeader/AnonymousUserMenu.jsx index 72156cd..df5da10 100644 --- a/src/containers/CourseHeader/AnonymousUserMenu.jsx +++ b/src/containers/CourseHeader/AnonymousUserMenu.jsx @@ -7,25 +7,29 @@ import { Button } from '@edx/paragon'; import message from './AnonymousUserMenu.messages'; -function AnonymousUserMenu({ intl }) { - return ( -
- - -
- ); -} +export const getRegisterUrl = () => { + const { LMS_BASE_URL } = getConfig(); + const locationHref = encodeURIComponent(global.location.href); + return `${LMS_BASE_URL}/register?next=${locationHref}`; +}; + +export const AnonymousUserMenu = ({ intl }) => ( +
+ + +
+); AnonymousUserMenu.propTypes = { intl: intlShape.isRequired, diff --git a/src/containers/CourseHeader/AnonymousUserMenu.messages.js b/src/containers/CourseHeader/AnonymousUserMenu.messages.js deleted file mode 100644 index ad435a0..0000000 --- a/src/containers/CourseHeader/AnonymousUserMenu.messages.js +++ /dev/null @@ -1,31 +0,0 @@ -import { defineMessages } from '@edx/frontend-platform/i18n'; - -const messages = defineMessages({ - close: { - id: 'general.altText.close', - defaultMessage: 'Close', - description: 'Text used as an aria-label to describe closing or dismissing a component', - }, - registerLowercase: { - id: 'learning.logistration.register', // ID left for historical purposes - defaultMessage: 'register', - description: 'Text in a link, prompting the user to create an account. Used in "learning.logistration.alert"', - }, - registerSentenceCase: { - id: 'general.register.sentenceCase', - defaultMessage: 'Register', - description: 'Text in a button, prompting the user to register.', - }, - signInLowercase: { - id: 'learning.logistration.login', // ID left for historical purposes - defaultMessage: 'sign in', - description: 'Text in a link, prompting the user to log in. Used in "learning.logistration.alert"', - }, - signInSentenceCase: { - id: 'general.signIn.sentenceCase', - defaultMessage: 'Sign in', - description: 'Text in a button, prompting the user to log in.', - }, -}); - -export default messages; diff --git a/src/containers/CourseHeader/AnonymousUserMenu.test.jsx b/src/containers/CourseHeader/AnonymousUserMenu.test.jsx new file mode 100644 index 0000000..7a564a6 --- /dev/null +++ b/src/containers/CourseHeader/AnonymousUserMenu.test.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import { AnonymousUserMenu } from './AnonymousUserMenu'; + +jest.mock('@edx/frontend-platform', () => ({ + getConfig: () => ({ + LMS_BASE_URL: '', + }), +})); +jest.mock('@edx/frontend-platform/auth', () => ({ + getLoginRedirectUrl: (url) => `redirect:${url}`, +})); +jest.mock('@edx/paragon', () => ({ + Button: () => 'Button', +})); + +describe('Header AnonymousUserMenu component', () => { + const props = { + intl: { formatMessage: (msg) => msg.defaultMessage }, + }; + test('snapshot', () => { + expect( + shallow(), + ).toMatchSnapshot(); + }); +}); diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown.jsx b/src/containers/CourseHeader/AuthenticatedUserDropdown.jsx deleted file mode 100644 index c9b1704..0000000 --- a/src/containers/CourseHeader/AuthenticatedUserDropdown.jsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faUserCircle } from '@fortawesome/free-solid-svg-icons'; - -import { getConfig } from '@edx/frontend-platform'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; -import { Dropdown } from '@edx/paragon'; - -import messages from './messages'; - -function AuthenticatedUserDropdown({ intl, username }) { - let dashboardMenuItem = ( - - {intl.formatMessage(messages.dashboard)} - - ); - return ( - <> - {intl.formatMessage(messages.help)} - - - - - {username} - - - - {dashboardMenuItem} - - {intl.formatMessage(messages.profile)} - - - {intl.formatMessage(messages.account)} - - - {intl.formatMessage(messages.signOut)} - - - - - ); -} - -AuthenticatedUserDropdown.propTypes = { - intl: intlShape.isRequired, - username: PropTypes.string.isRequired, -}; - -AuthenticatedUserDropdown.defaultProps = {}; - -export default injectIntl(AuthenticatedUserDropdown); diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown.messages.js b/src/containers/CourseHeader/AuthenticatedUserDropdown.messages.js deleted file mode 100644 index c9b1704..0000000 --- a/src/containers/CourseHeader/AuthenticatedUserDropdown.messages.js +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faUserCircle } from '@fortawesome/free-solid-svg-icons'; - -import { getConfig } from '@edx/frontend-platform'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; -import { Dropdown } from '@edx/paragon'; - -import messages from './messages'; - -function AuthenticatedUserDropdown({ intl, username }) { - let dashboardMenuItem = ( - - {intl.formatMessage(messages.dashboard)} - - ); - return ( - <> - {intl.formatMessage(messages.help)} - - - - - {username} - - - - {dashboardMenuItem} - - {intl.formatMessage(messages.profile)} - - - {intl.formatMessage(messages.account)} - - - {intl.formatMessage(messages.signOut)} - - - - - ); -} - -AuthenticatedUserDropdown.propTypes = { - intl: intlShape.isRequired, - username: PropTypes.string.isRequired, -}; - -AuthenticatedUserDropdown.defaultProps = {}; - -export default injectIntl(AuthenticatedUserDropdown); diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/UserAvatar.jsx b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserAvatar.jsx new file mode 100644 index 0000000..47eb320 --- /dev/null +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserAvatar.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faUserCircle } from '@fortawesome/free-solid-svg-icons'; + +import { Dropdown } from '@edx/paragon'; + +export const UserAvatar = ({ username }) => ( + + + + {username} + + +); +UserAvatar.propTypes = { + username: PropTypes.string.isRequired, +}; + +UserAvatar.defaultProps = {}; + +export default UserAvatar; diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/UserAvatar.test.jsx b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserAvatar.test.jsx new file mode 100644 index 0000000..a28a655 --- /dev/null +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserAvatar.test.jsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import UserAvatar from './UserAvatar'; + +jest.mock('@edx/frontend-platform', () => ({ + getConfig: () => ({ + LMS_BASE_URL: '', + LOGOUT_URL: '', + SUPPORT_URL: '', + }), +})); +jest.mock('@edx/paragon', () => ({ + Dropdown: { + Toggle: () => 'Dropdown.Toggle', + Item: () => 'Dropdown.Item', + }, +})); +jest.mock('@fortawesome/react-fontawesome', () => ({ + FontAwesomeIcon: () => 'FontAwesomeIcon', +})); + +describe('Header AuthenticatedUserDropdown UserAvatar component', () => { + const props = { + username: 'test-username', + }; + test('snapshot', () => { + expect( + shallow(), + ).toMatchSnapshot(); + }); +}); diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.jsx b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.jsx new file mode 100644 index 0000000..2c28c3a --- /dev/null +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.jsx @@ -0,0 +1,40 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { getConfig } from '@edx/frontend-platform'; +import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { Dropdown } from '@edx/paragon'; + +import messages from '../messages'; + +export class UserMenu extends React.Component { + menuItem(href, message) { + return ( + + {this.props.intl.formatMessage(message)} + + ); + } + + render() { + const { username } = this.props; + const { LMS_BASE_URL, LOGOUT_URL } = getConfig(); + return ( + + {this.menuItem(`${LMS_BASE_URL}/dashboard`, messages.dashboard)} + {this.menuItem(`${LMS_BASE_URL}/u/${username}`, messages.profile)} + {this.menuItem(`${LMS_BASE_URL}/account/settings`, messages.account)} + {this.menuItem(LOGOUT_URL, messages.signOut)} + + ); + } +} + +UserMenu.propTypes = { + intl: intlShape.isRequired, + username: PropTypes.string.isRequired, +}; + +UserMenu.defaultProps = {}; + +export default injectIntl(UserMenu); diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.test.jsx b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.test.jsx new file mode 100644 index 0000000..7b00a28 --- /dev/null +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.test.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import { AuthenticatedUserDropdown } from './AuthenticatedUserDropdown'; + +jest.mock('@edx/frontend-platform', () => ({ + getConfig: () => ({ + LMS_BASE_URL: '', + LOGOUT_URL: '', + SUPPORT_URL: '', + }), +})); +jest.mock('@edx/paragon', () => { + const Dropdown = () => 'Dropdown'; + Dropdown.Toggle = () => 'Dropdown.Toggle'; + Dropdown.Menu = () => 'Dropdown.Menu'; + Dropdown.Item = () => 'Dropdown.Item'; + return { Dropdown }; +}); +jest.mock('@fortawesome/react-fontawesome', () => ({ + FontAwesomeIcon: () => 'FontAwesomeIcon', +})); +jest.mock('@fortawesome/free-solid-svg-icons', () => ({ + faUserCircle: 'fa-user-circle-icon', +})); + +describe('Header AuthenticatedUserDropdown component', () => { + const props = { + intl: { formatMessage: (msg) => msg.defaultMessage }, + username: 'test-username', + }; + test('snapshot', () => { + expect( + shallow(), + ).toMatchSnapshot(); + }); +}); diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/UserAvatar.test.jsx.snap b/src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/UserAvatar.test.jsx.snap new file mode 100644 index 0000000..9737821 --- /dev/null +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/UserAvatar.test.jsx.snap @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Header AuthenticatedUserDropdown UserAvatar component snapshot 1`] = ` + + + + test-username + + +`; diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/index.test.jsx.snap b/src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/index.test.jsx.snap new file mode 100644 index 0000000..769a582 --- /dev/null +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/index.test.jsx.snap @@ -0,0 +1,20 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Header AuthenticatedUserDropdown component snapshot 1`] = ` + + + Help + + + + + + +`; diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/index.jsx b/src/containers/CourseHeader/AuthenticatedUserDropdown/index.jsx new file mode 100644 index 0000000..f74bcb3 --- /dev/null +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/index.jsx @@ -0,0 +1,38 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faUserCircle } from '@fortawesome/free-solid-svg-icons'; + +import { getConfig } from '@edx/frontend-platform'; +import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { Dropdown } from '@edx/paragon'; + +import UserMenu from './UserMenu'; +import UserAvatar from './UserAvatar'; + +import messages from '../messages'; + +export const AuthenticatedUserDropdown = ({ + intl, + username, +}) => ( + <> + + {intl.formatMessage(messages.help)} + + + + + + +); + +AuthenticatedUserDropdown.propTypes = { + intl: intlShape.isRequired, + username: PropTypes.string.isRequired, +}; + +AuthenticatedUserDropdown.defaultProps = {}; + +export default injectIntl(AuthenticatedUserDropdown); diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/index.test.jsx b/src/containers/CourseHeader/AuthenticatedUserDropdown/index.test.jsx new file mode 100644 index 0000000..5e1dc71 --- /dev/null +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/index.test.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import { AuthenticatedUserDropdown } from '.'; + +jest.mock('@edx/frontend-platform', () => ({ + getConfig: () => ({ + SUPPORT_URL: '', + }), +})); +jest.mock('@edx/paragon', () => ({ + Dropdown: () => 'Dropdown', +})); +jest.mock('./UserAvatar', () => 'UserAvatar'); +jest.mock('./UserMenu', () => 'UserMenu'); + +describe('Header AuthenticatedUserDropdown component', () => { + const props = { + intl: { formatMessage: (msg) => msg.defaultMessage }, + username: 'test-username', + }; + test('snapshot', () => { + expect( + shallow(), + ).toMatchSnapshot(); + }); +}); diff --git a/src/containers/CourseHeader/CourseLabel.jsx b/src/containers/CourseHeader/CourseLabel.jsx new file mode 100644 index 0000000..e946a72 --- /dev/null +++ b/src/containers/CourseHeader/CourseLabel.jsx @@ -0,0 +1,32 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +export const CourseLabel = ({ + courseOrg, + courseNumber, + courseTitle, +}) => ( +
+ + {courseOrg} {courseNumber} + + + {courseTitle} + +
+); +CourseLabel.propTypes = { + courseOrg: PropTypes.string, + courseNumber: PropTypes.string, + courseTitle: PropTypes.string, +}; +CourseLabel.defaultProps = { + courseOrg: null, + courseNumber: null, + courseTitle: null, +}; + +export default CourseLabel; diff --git a/src/containers/CourseHeader/CourseLabel.test.jsx b/src/containers/CourseHeader/CourseLabel.test.jsx new file mode 100644 index 0000000..1c774cb --- /dev/null +++ b/src/containers/CourseHeader/CourseLabel.test.jsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import CourseLabel from './CourseLabel'; + +const courseData = { + courseOrg: 'course-org', + courseNumber: 'course-number', + courseTitle: 'course-title', +}; + +describe('Header CourseLabel component', () => { + test('snapshot', () => { + expect( + shallow(), + ).toMatchSnapshot(); + }); +}); diff --git a/src/containers/CourseHeader/Header.jsx b/src/containers/CourseHeader/Header.jsx index 7dac9b7..afcc76f 100644 --- a/src/containers/CourseHeader/Header.jsx +++ b/src/containers/CourseHeader/Header.jsx @@ -1,81 +1,47 @@ import React, { useContext } from 'react'; import PropTypes from 'prop-types'; -import { getConfig } from '@edx/frontend-platform'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { AppContext } from '@edx/frontend-platform/react'; import AnonymousUserMenu from './AnonymousUserMenu'; import AuthenticatedUserDropdown from './AuthenticatedUserDropdown'; +import LinkedLogo from './LinkedLogo'; +import CourseLabel from './CourseLabel'; + import messages from './messages'; -function LinkedLogo({ - href, - src, - alt, - ...attributes -}) { - return ( - - {alt} - - ); -} - -LinkedLogo.propTypes = { - href: PropTypes.string.isRequired, - src: PropTypes.string.isRequired, - alt: PropTypes.string.isRequired, -}; - -function Header({ - courseOrg, courseNumber, courseTitle, intl, showUserDropdown, -}) { +export const Header = ({ + courseOrg, + courseNumber, + courseTitle, + intl, +}) => { const { authenticatedUser } = useContext(AppContext); - - let headerLogo = ( - - ); - return (
- {intl.formatMessage(messages.skipNavLink)} + + {intl.formatMessage(messages.skipNavLink)} +
- {headerLogo} -
- {courseOrg} {courseNumber} - {courseTitle} -
- {showUserDropdown && authenticatedUser && ( - - )} - {showUserDropdown && !authenticatedUser && ( - - )} + + + {authenticatedUser + ? () + : ()}
); -} - +}; Header.propTypes = { courseOrg: PropTypes.string, courseNumber: PropTypes.string, courseTitle: PropTypes.string, intl: intlShape.isRequired, - showUserDropdown: PropTypes.bool, }; - Header.defaultProps = { courseOrg: null, courseNumber: null, courseTitle: null, - showUserDropdown: true, }; export default injectIntl(Header); diff --git a/src/containers/CourseHeader/Header.test.jsx b/src/containers/CourseHeader/Header.test.jsx index 2889aa7..935443e 100644 --- a/src/containers/CourseHeader/Header.test.jsx +++ b/src/containers/CourseHeader/Header.test.jsx @@ -1,29 +1,38 @@ import React from 'react'; -import { - authenticatedUser, initializeMockApp, render, screen, -} from '../setupTest'; -import { Header } from './index'; +import { shallow } from 'enzyme'; -describe('Header', () => { - beforeAll(async () => { - // We need to mock AuthService to implicitly use `getAuthenticatedUser` within `AppContext.Provider`. - await initializeMockApp(); +import { AppContext } from '@edx/frontend-platform/react'; +import { Header } from './Header'; + +jest.mock('./AnonymousUserMenu', () => 'AnonymousUserMenu'); +jest.mock('./AuthenticatedUserDropdown', () => 'AuthenticatedUserDropdown'); +jest.mock('./LinkedLogo', () => 'LinkedLogo'); +jest.mock('./CourseLabel', () => 'CourseLabel'); + +jest.mock('@edx/frontend-platform/react', () => ({ + AppContext: { authenticatedUser: null }, +})); +jest.mock('react', () => ({ + ...jest.requireActual('react'), + useContext: (context) => context, +})); + +const courseData = { + courseOrg: 'course-org', + courseNumber: 'course-number', + courseTitle: 'course-title', +}; + +describe('Header component', () => { + const props = { + ...courseData, + intl: { formatMessage: (msg) => msg.defaultMessage }, + }; + test('snapshot', () => { + expect(shallow(
)).toMatchSnapshot(); }); - - it('displays user button', () => { - render(
); - expect(screen.getByRole('button')).toHaveTextContent(authenticatedUser.username); - }); - - it('displays course data', () => { - const courseData = { - courseOrg: 'course-org', - courseNumber: 'course-number', - courseTitle: 'course-title', - }; - render(
); - - expect(screen.getByText(`${courseData.courseOrg} ${courseData.courseNumber}`)).toBeInTheDocument(); - expect(screen.getByText(courseData.courseTitle)).toBeInTheDocument(); + test('snapshot with authenticatedUser', () => { + AppContext.authenticatedUser = { username: 'test' }; + expect(shallow(
)).toMatchSnapshot(); }); }); diff --git a/src/containers/CourseHeader/LinkedLogo.jsx b/src/containers/CourseHeader/LinkedLogo.jsx new file mode 100644 index 0000000..f385602 --- /dev/null +++ b/src/containers/CourseHeader/LinkedLogo.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { getConfig } from '@edx/frontend-platform'; + +const LinkedLogo = () => ( + + {getConfig().SITE_NAME} + +); + +export default LinkedLogo; diff --git a/src/containers/CourseHeader/LinkedLogo.test.jsx b/src/containers/CourseHeader/LinkedLogo.test.jsx new file mode 100644 index 0000000..19592bc --- /dev/null +++ b/src/containers/CourseHeader/LinkedLogo.test.jsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { shallow } from 'enzyme'; + +import LinkedLogo from './LinkedLogo'; + +jest.mock('@edx/frontend-platform', () => ({ + getConfig: () => ({ + LMS_BASE_URL: '', + LOGO_URL: '', + SITE_NAME: '', + }), +})); + +describe('Header CourseLabel component', () => { + test('snapshot', () => { + expect( + shallow(), + ).toMatchSnapshot(); + }); +}); diff --git a/src/containers/CourseHeader/__snapshots__/AnonymousUserMenu.test.jsx.snap b/src/containers/CourseHeader/__snapshots__/AnonymousUserMenu.test.jsx.snap new file mode 100644 index 0000000..e042921 --- /dev/null +++ b/src/containers/CourseHeader/__snapshots__/AnonymousUserMenu.test.jsx.snap @@ -0,0 +1,19 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Header AnonymousUserMenu component snapshot 1`] = ` +
+ + +
+`; diff --git a/src/containers/CourseHeader/__snapshots__/CourseLabel.test.jsx.snap b/src/containers/CourseHeader/__snapshots__/CourseLabel.test.jsx.snap new file mode 100644 index 0000000..fdf9dd0 --- /dev/null +++ b/src/containers/CourseHeader/__snapshots__/CourseLabel.test.jsx.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Header CourseLabel component snapshot 1`] = ` +
+ + course-org + + course-number + + + course-title + +
+`; diff --git a/src/containers/CourseHeader/__snapshots__/Header.test.jsx.snap b/src/containers/CourseHeader/__snapshots__/Header.test.jsx.snap new file mode 100644 index 0000000..57a5c72 --- /dev/null +++ b/src/containers/CourseHeader/__snapshots__/Header.test.jsx.snap @@ -0,0 +1,51 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Header component snapshot 1`] = ` +
+ + Skip to main content. + +
+ + + +
+
+`; + +exports[`Header component snapshot with authenticatedUser 1`] = ` +
+ + Skip to main content. + +
+ + + +
+
+`; diff --git a/src/containers/CourseHeader/__snapshots__/LinkedLogo.test.jsx.snap b/src/containers/CourseHeader/__snapshots__/LinkedLogo.test.jsx.snap new file mode 100644 index 0000000..c26dda8 --- /dev/null +++ b/src/containers/CourseHeader/__snapshots__/LinkedLogo.test.jsx.snap @@ -0,0 +1,14 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Header CourseLabel component snapshot 1`] = ` + + <getConfig().SITE_NAME> + +`; diff --git a/src/containers/CourseHeader/messages.js b/src/containers/CourseHeader/messages.js index 0750159..e35d61a 100644 --- a/src/containers/CourseHeader/messages.js +++ b/src/containers/CourseHeader/messages.js @@ -1,6 +1,11 @@ import { defineMessages } from '@edx/frontend-platform/i18n'; const messages = defineMessages({ + courseMaterial: { + id: 'learn.navigation.course.tabs.label', + defaultMessage: 'Course Material', + description: 'The accessible label for course tabs navigation', + }, dashboard: { id: 'header.menu.dashboard.label', defaultMessage: 'Dashboard', @@ -21,6 +26,11 @@ const messages = defineMessages({ defaultMessage: 'Account', description: 'The text for the user menu Account navigation link.', }, + orderHistory: { + id: 'header.menu.orderHistory.label', + defaultMessage: 'Order History', + description: 'The text for the user menu Order History navigation link.', + }, skipNavLink: { id: 'header.navigation.skipNavLink', defaultMessage: 'Skip to main content.',