From 5423c3630590ca428e3da215744ccd4c490fa9f9 Mon Sep 17 00:00:00 2001 From: Ben Warzeski Date: Fri, 1 Oct 2021 15:07:50 -0400 Subject: [PATCH 1/3] 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.', From 9e795382545711f1317b033c237c2908e0c370a0 Mon Sep 17 00:00:00 2001 From: Ben Warzeski Date: Fri, 1 Oct 2021 15:22:37 -0400 Subject: [PATCH 2/3] fix tests, clean up Header, and add tests for it --- src/App.jsx | 4 +- src/App.test.jsx | 60 +++---------- src/__snapshots__/App.test.jsx.snap | 37 ++++---- .../CourseHeader/AnonymousUserMenu.jsx | 2 +- .../UserMenu.test.jsx | 6 +- .../__snapshots__/UserMenu.test.jsx.snap | 28 ++++++ .../AuthenticatedUserDropdown/index.jsx | 3 - ...eader.test.jsx.snap => index.test.js.snap} | 0 src/containers/CourseHeader/index.js | 1 - .../CourseHeader/{Header.jsx => index.jsx} | 0 .../{Header.test.jsx => index.test.jsx} | 2 +- src/containers/CourseHeader/messages.js | 10 +++ src/containers/CourseHeader/messages2.js | 31 +++++++ .../ListView/ListViewBreadcrumb.jsx | 9 +- src/containers/ListView/index.jsx | 4 +- src/data/constants/app.js | 2 +- src/data/services/lms/fakeData/course.js | 4 +- src/data/services/lms/fakeData/index.js | 9 -- src/data/services/lms/fakeData/ora.js | 1 + src/data/services/lms/utils.js | 15 ---- src/data/services/lms/utils.test.js | 58 ------------- src/setupTest.js | 86 +------------------ 22 files changed, 117 insertions(+), 255 deletions(-) create mode 100644 src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/UserMenu.test.jsx.snap rename src/containers/CourseHeader/__snapshots__/{Header.test.jsx.snap => index.test.js.snap} (100%) delete mode 100644 src/containers/CourseHeader/index.js rename src/containers/CourseHeader/{Header.jsx => index.jsx} (100%) rename src/containers/CourseHeader/{Header.test.jsx => index.test.jsx} (96%) create mode 100644 src/containers/CourseHeader/messages2.js diff --git a/src/App.jsx b/src/App.jsx index 3204cae..3c6105c 100755 --- a/src/App.jsx +++ b/src/App.jsx @@ -10,9 +10,9 @@ import selectors from 'data/selectors'; import ListView from 'containers/ListView'; import './App.scss'; -import { Header } from 'containers/CourseHeader'; +import Header from 'containers/CourseHeader'; -const App = ({ courseMetadata }) => ( +export const App = ({ courseMetadata }) => (
({ - BrowserRouter: () => 'BrowserRouter', - Route: () => 'Route', - Switch: () => 'Switch', -})); -jest.mock('react-redux', () => ({ - Provider: () => 'Provider', -})); -jest.mock('react-intl', () => ({ - IntlProvider: () => 'IntlProvider', -})); -jest.mock('data/constants/app', () => ({ - routePath: '/:courseId', -})); jest.mock('@edx/frontend-component-footer', () => 'Footer'); -jest.mock('data/store', () => 'testStore'); jest.mock('containers/ListView', () => 'ListView'); +jest.mock('containers/CourseHeader', () => 'CourseHeader'); const logo = 'fakeLogo.png'; let el; let router; describe('App router component', () => { + const props = { + courseMetadata: { + org: 'course-org', + number: 'course-number', + title: 'course-title', + }, + }; test('snapshot', () => { - expect(shallow()).toMatchSnapshot(); + expect(shallow()).toMatchSnapshot(); }); describe('component', () => { beforeEach(() => { process.env.LOGO_POWERED_BY_OPEN_EDX_URL_SVG = logo; - el = shallow(); - router = el.childAt(0).childAt(0); - }); - describe('IntlProvider', () => { - test('outer-wrapper component', () => { - expect(el.type()).toBe(IntlProvider); - }); - test('"en" locale', () => { - expect(el.props().locale).toEqual('en'); - }); - }); - describe('Provider, inside IntlProvider', () => { - test('first child, passed the redux store props', () => { - expect(el.childAt(0).type()).toBe(Provider); - expect(el.childAt(0).props().store).toEqual(store); - }); + el = shallow(); + router = el.childAt(0); }); describe('Router', () => { - test('first child of Provider', () => { - expect(router.type()).toBe(Router); - }); test('Routing - ListView is only route', () => { expect(router.find('main')).toEqual(shallow( -
- - - -
, +
, )); }); }); diff --git a/src/__snapshots__/App.test.jsx.snap b/src/__snapshots__/App.test.jsx.snap index 924a583..3069065 100644 --- a/src/__snapshots__/App.test.jsx.snap +++ b/src/__snapshots__/App.test.jsx.snap @@ -1,26 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`App router component snapshot 1`] = ` - - - -
-
- - - -
-
-
-
-
-
+ +
+ +
+ +
+
+
+
`; diff --git a/src/containers/CourseHeader/AnonymousUserMenu.jsx b/src/containers/CourseHeader/AnonymousUserMenu.jsx index df5da10..ee1ea71 100644 --- a/src/containers/CourseHeader/AnonymousUserMenu.jsx +++ b/src/containers/CourseHeader/AnonymousUserMenu.jsx @@ -5,7 +5,7 @@ import { getLoginRedirectUrl } from '@edx/frontend-platform/auth'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Button } from '@edx/paragon'; -import message from './AnonymousUserMenu.messages'; +import message from './messages'; export const getRegisterUrl = () => { const { LMS_BASE_URL } = getConfig(); diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.test.jsx b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.test.jsx index 7b00a28..f340ea4 100644 --- a/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.test.jsx +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/UserMenu.test.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { AuthenticatedUserDropdown } from './AuthenticatedUserDropdown'; +import { UserMenu } from './UserMenu'; jest.mock('@edx/frontend-platform', () => ({ getConfig: () => ({ @@ -24,14 +24,14 @@ jest.mock('@fortawesome/free-solid-svg-icons', () => ({ faUserCircle: 'fa-user-circle-icon', })); -describe('Header AuthenticatedUserDropdown component', () => { +describe('Header AuthenticatedUserDropdown UserMenu component', () => { const props = { intl: { formatMessage: (msg) => msg.defaultMessage }, username: 'test-username', }; test('snapshot', () => { expect( - shallow(), + shallow(), ).toMatchSnapshot(); }); }); diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/UserMenu.test.jsx.snap b/src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/UserMenu.test.jsx.snap new file mode 100644 index 0000000..fb30595 --- /dev/null +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/__snapshots__/UserMenu.test.jsx.snap @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Header AuthenticatedUserDropdown UserMenu component snapshot 1`] = ` + + + Dashboard + + + Profile + + + Account + + + Sign Out + + +`; diff --git a/src/containers/CourseHeader/AuthenticatedUserDropdown/index.jsx b/src/containers/CourseHeader/AuthenticatedUserDropdown/index.jsx index f74bcb3..10998b6 100644 --- a/src/containers/CourseHeader/AuthenticatedUserDropdown/index.jsx +++ b/src/containers/CourseHeader/AuthenticatedUserDropdown/index.jsx @@ -1,9 +1,6 @@ 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'; diff --git a/src/containers/CourseHeader/__snapshots__/Header.test.jsx.snap b/src/containers/CourseHeader/__snapshots__/index.test.js.snap similarity index 100% rename from src/containers/CourseHeader/__snapshots__/Header.test.jsx.snap rename to src/containers/CourseHeader/__snapshots__/index.test.js.snap diff --git a/src/containers/CourseHeader/index.js b/src/containers/CourseHeader/index.js deleted file mode 100644 index 5653319..0000000 --- a/src/containers/CourseHeader/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as Header } from './Header'; diff --git a/src/containers/CourseHeader/Header.jsx b/src/containers/CourseHeader/index.jsx similarity index 100% rename from src/containers/CourseHeader/Header.jsx rename to src/containers/CourseHeader/index.jsx diff --git a/src/containers/CourseHeader/Header.test.jsx b/src/containers/CourseHeader/index.test.jsx similarity index 96% rename from src/containers/CourseHeader/Header.test.jsx rename to src/containers/CourseHeader/index.test.jsx index 935443e..becdf47 100644 --- a/src/containers/CourseHeader/Header.test.jsx +++ b/src/containers/CourseHeader/index.test.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { AppContext } from '@edx/frontend-platform/react'; -import { Header } from './Header'; +import { Header } from '.'; jest.mock('./AnonymousUserMenu', () => 'AnonymousUserMenu'); jest.mock('./AuthenticatedUserDropdown', () => 'AuthenticatedUserDropdown'); diff --git a/src/containers/CourseHeader/messages.js b/src/containers/CourseHeader/messages.js index e35d61a..0c03373 100644 --- a/src/containers/CourseHeader/messages.js +++ b/src/containers/CourseHeader/messages.js @@ -41,6 +41,16 @@ const messages = defineMessages({ defaultMessage: 'Sign Out', description: 'The label for the user menu Sign Out action.', }, + registerSentenceCase: { + id: 'header.register.sentenceCase', + defaultMessage: 'Register', + description: 'Text in a button, prompting the user to register.', + }, + signInSentenceCase: { + id: 'header.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/messages2.js b/src/containers/CourseHeader/messages2.js new file mode 100644 index 0000000..ad435a0 --- /dev/null +++ b/src/containers/CourseHeader/messages2.js @@ -0,0 +1,31 @@ +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/ListView/ListViewBreadcrumb.jsx b/src/containers/ListView/ListViewBreadcrumb.jsx index 8786dbd..40f41b3 100644 --- a/src/containers/ListView/ListViewBreadcrumb.jsx +++ b/src/containers/ListView/ListViewBreadcrumb.jsx @@ -3,10 +3,10 @@ import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { ArrowBack } from '@edx/paragon/icons'; -import { Hyperlink } from '@edx/paragon' +import { Hyperlink } from '@edx/paragon'; -import { locationId } from '../../data/constants/app'; import selectors from 'data/selectors'; +import { locationId } from '../../data/constants/app'; /** * @@ -23,7 +23,8 @@ export const ListViewBreadcrumb = ({ courseId, oraName }) => {

{oraName}

+ /> +

); }; @@ -42,4 +43,4 @@ export const mapStateToProps = (state) => ({ export const mapDispatchToProps = { }; -export default connect(mapStateToProps, mapDispatchToProps)(ListViewBreadcrumb); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(ListViewBreadcrumb); diff --git a/src/containers/ListView/index.jsx b/src/containers/ListView/index.jsx index b9b078c..97e91ec 100644 --- a/src/containers/ListView/index.jsx +++ b/src/containers/ListView/index.jsx @@ -23,7 +23,7 @@ import './ListView.scss'; const gradeStatusOptions = Object.keys(gradingStatusDisplay).map(key => ({ name: gradingStatusDisplay[key], - value: key + value: key, })); /** @@ -59,7 +59,7 @@ export class ListView extends React.Component { buttonText: `View selected responses (${selectedFlatRows.length})`, handleClick: this.handleViewAllResponsesClick, variant: 'primary', - } + }; } render() { diff --git a/src/data/constants/app.js b/src/data/constants/app.js index f59fa3a..0bf0e0a 100644 --- a/src/data/constants/app.js +++ b/src/data/constants/app.js @@ -2,4 +2,4 @@ import { getConfig } from '@edx/frontend-platform'; // eslint-disable-next-line import/prefer-default-export export const routePath = `${getConfig().PUBLIC_PATH}:courseId`; -export const locationId = window.location.pathname.slice(1) \ No newline at end of file +export const locationId = window.location.pathname.slice(1); diff --git a/src/data/services/lms/fakeData/course.js b/src/data/services/lms/fakeData/course.js index 99b1338..b78f56e 100644 --- a/src/data/services/lms/fakeData/course.js +++ b/src/data/services/lms/fakeData/course.js @@ -3,4 +3,6 @@ export const number = '101'; export const title = 'Time Travel 101'; export const courseId = 'course-v1:Foo+TT101+R0'; -export default { org, number, title, courseId }; +export default { + org, number, title, courseId, +}; diff --git a/src/data/services/lms/fakeData/index.js b/src/data/services/lms/fakeData/index.js index 796152e..ba8d002 100644 --- a/src/data/services/lms/fakeData/index.js +++ b/src/data/services/lms/fakeData/index.js @@ -4,15 +4,6 @@ import oraMetadata from './ora'; import courseMetadata from './course'; import ids from './ids'; -console.log({ - submissions, - oraMetadata, - courseMetadata, - mockSubmission, - mockSubmissionStatus, - ids, -}); - export default { submissions, oraMetadata, diff --git a/src/data/services/lms/fakeData/ora.js b/src/data/services/lms/fakeData/ora.js index eab8886..0531888 100644 --- a/src/data/services/lms/fakeData/ora.js +++ b/src/data/services/lms/fakeData/ora.js @@ -1,4 +1,5 @@ import ids from './ids'; + export const prompt = ` Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin scelerisque finibus sem in aliquam. Cras volutpat ipsum sit amet porttitor bibendum. Nunc tempor ex neque, sed faucibus nisl accumsan vitae. Proin et sem nisl. Aenean placerat justo a ligula eleifend, in imperdiet sem sodales. Maecenas eget aliquet purus, ac ornare risus. Nullam eget interdum erat. Mauris semper porta sapien et egestas. Aliquam viverra convallis pulvinar. Aliquam suscipit ligula felis, eu viverra ligula dignissim ut. Vivamus sit amet commodo sem. Nullam a viverra nibh. diff --git a/src/data/services/lms/utils.js b/src/data/services/lms/utils.js index 562da3d..9e01ee4 100644 --- a/src/data/services/lms/utils.js +++ b/src/data/services/lms/utils.js @@ -1,6 +1,5 @@ import queryString from 'query-string'; import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; -import { filters } from 'data/constants/filters'; /** * get(url) @@ -26,17 +25,3 @@ export const stringifyUrl = (url, query) => queryString.stringifyUrl( { url, query }, { skipNull: true, skipEmptyString: true }, ); - -/** - * filterQuery(options) - * Takes current filter object and returns it with only valid filters that are - * set and have non-'All' values - * @param {object} options - filter values - * @return {object} - valid filters that are set and do not equal 'All' - */ -export const filterQuery = (options) => Object.values(filters) - .filter(filter => options[filter] && options[filter] !== 'All') - .reduce( - (obj, filter) => ({ ...obj, [filter]: options[filter] }), - {}, - ); diff --git a/src/data/services/lms/utils.test.js b/src/data/services/lms/utils.test.js index 7aec18c..a033bba 100644 --- a/src/data/services/lms/utils.test.js +++ b/src/data/services/lms/utils.test.js @@ -1,6 +1,5 @@ import queryString from 'query-string'; import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; -import { filters } from 'data/constants/filters'; import * as utils from './utils'; jest.mock('query-string', () => ({ @@ -37,61 +36,4 @@ describe('lms service utils', () => { ); }); }); - describe('filterQuery', () => { - it('returns all filters included in validated list that are not "All"', () => { - const goodOptions = { - [filters.assignmentType]: 'quiz', - [filters.courseGradeMax]: 100, - [filters.courseGradeMin]: 1, - }; - const extraOptions = { - fake: 'option', - another: 'fake one', - }; - expect(utils.filterQuery({ - ...goodOptions, - ...extraOptions, - [filters.includeCourseRoleMembers]: 'All', - })).toEqual(goodOptions); - }); - }); }); - -/** - * get(url) - * simple wrapper providing an authenticated Http client get action - * @param {string} url - target url - */ -export const get = (...args) => getAuthenticatedHttpClient().get(...args); -/** - * post(url, data) - * simple wrapper providing an authenticated Http client post action - * @param {string} url - target url - * @param {object|string} data - post payload - */ -export const post = (...args) => getAuthenticatedHttpClient().post(...args); - -/** - * stringifyUrl(url, query) - * simple wrapper around queryString.stringifyUrl that sets skip behavior - * @param {string} url - base url string - * @param {object} query - query parameters - */ -export const stringifyUrl = (url, query) => queryString.stringifyUrl( - { url, query }, - { skipNull: true, skipEmptyString: true }, -); - -/** - * filterQuery(options) - * Takes current filter object and returns it with only valid filters that are - * set and have non-'All' values - * @param {object} options - filter values - * @return {object} - valid filters that are set and do not equal 'All' - */ -export const filterQuery = (options) => Object.values(filters) - .filter(filter => options[filter] && options[filter] !== 'All') - .reduce( - (obj, filter) => ({ ...obj, [filter]: options[filter] }), - {}, - ); diff --git a/src/setupTest.js b/src/setupTest.js index 5b06656..89fdeab 100755 --- a/src/setupTest.js +++ b/src/setupTest.js @@ -5,100 +5,16 @@ import '@testing-library/jest-dom/extend-expect'; import Enzyme from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; -import AppProvider from '@edx/frontend-platform/react/AppProvider'; -import { IntlProvider } from 'react-intl'; -import { render as rtlRender } from '@testing-library/react'; -import PropTypes from 'prop-types'; - -import { getConfig, mergeConfig } from '@edx/frontend-platform'; -import { configure as configureAuth, MockAuthService } from '@edx/frontend-platform/auth'; -import { configure as configureI18n } from '@edx/frontend-platform/i18n'; - -import appMessages from './i18n'; -import { messages as footerMessages } from '@edx/frontend-component-footer'; - Enzyme.configure({ adapter: new Adapter() }); jest.mock('@edx/frontend-platform/i18n', () => { const i18n = jest.requireActual('@edx/frontend-platform/i18n'); - const PropTypes = jest.requireActual('prop-types'); return { ...i18n, - intlShape: PropTypes.shape({ + intlShape: jest.requireActual('prop-types').shape({ formatMessage: jest.fn(msg => msg.defaultMessage), }), defineMessages: m => m, FormattedMessage: () => 'FormattedMessage', }; }); - -export const authenticatedUser = { - userId: 'abc123', - username: 'Mock User', - roles: [], - administrator: false, -}; - -export function initializeMockApp() { - mergeConfig({ - CONTACT_URL: process.env.CONTACT_URL || null, - INSIGHTS_BASE_URL: process.env.INSIGHTS_BASE_URL || null, - STUDIO_BASE_URL: process.env.STUDIO_BASE_URL || null, - TWITTER_URL: process.env.TWITTER_URL || null, - authenticatedUser: { - userId: 'abc123', - username: 'Mock User', - roles: [], - administrator: false, - }, - SUPPORT_URL_ID_VERIFICATION: 'http://example.com', - }); - - const authService = configureAuth(MockAuthService, { - config: getConfig() - }); - - // i18n doesn't have a service class to return. - configureI18n({ - config: getConfig(), - messages: [appMessages, footerMessages], - requireAuthenticatedUser: true, - }); - - return { authService }; -} - - - -function render( - ui, - { - store = null, - ...renderOptions - } = {}, -) { - function Wrapper({ children }) { - return ( - // eslint-disable-next-line react/jsx-filename-extension - - - {children} - - - ); - } - - Wrapper.propTypes = { - children: PropTypes.node.isRequired, - }; - - return rtlRender(ui, { wrapper: Wrapper, ...renderOptions }); -} - -// Re-export everything. -export * from '@testing-library/react'; - -// Override `render` method. -export { - render, -}; From e1934835f2de4fb2b5ab8ac9b415295f8073c722 Mon Sep 17 00:00:00 2001 From: Ben Warzeski Date: Fri, 1 Oct 2021 15:37:24 -0400 Subject: [PATCH 3/3] lint fixes --- src/containers/CriterionContainer/ReviewCriterion.jsx | 2 +- src/containers/ListView/ListViewBreadcrumb.jsx | 2 ++ src/data/services/lms/fakeData/ora.js | 2 -- src/data/store.js | 2 -- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/containers/CriterionContainer/ReviewCriterion.jsx b/src/containers/CriterionContainer/ReviewCriterion.jsx index 091e0e9..6e160bb 100644 --- a/src/containers/CriterionContainer/ReviewCriterion.jsx +++ b/src/containers/CriterionContainer/ReviewCriterion.jsx @@ -14,7 +14,7 @@ import selectors from 'data/selectors'; */ export const ReviewCriterion = ({ config, - data, + // data, }) => (
{ config.options.map(option => ( diff --git a/src/containers/ListView/ListViewBreadcrumb.jsx b/src/containers/ListView/ListViewBreadcrumb.jsx index 40f41b3..b6ace80 100644 --- a/src/containers/ListView/ListViewBreadcrumb.jsx +++ b/src/containers/ListView/ListViewBreadcrumb.jsx @@ -30,9 +30,11 @@ export const ListViewBreadcrumb = ({ courseId, oraName }) => { }; ListViewBreadcrumb.defaultProps = { courseId: '', + oraName: '', }; ListViewBreadcrumb.propTypes = { courseId: PropTypes.string, + oraName: PropTypes.string, }; export const mapStateToProps = (state) => ({ diff --git a/src/data/services/lms/fakeData/ora.js b/src/data/services/lms/fakeData/ora.js index 0531888..31f522b 100644 --- a/src/data/services/lms/fakeData/ora.js +++ b/src/data/services/lms/fakeData/ora.js @@ -1,5 +1,3 @@ -import ids from './ids'; - export const prompt = ` Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin scelerisque finibus sem in aliquam. Cras volutpat ipsum sit amet porttitor bibendum. Nunc tempor ex neque, sed faucibus nisl accumsan vitae. Proin et sem nisl. Aenean placerat justo a ligula eleifend, in imperdiet sem sodales. Maecenas eget aliquet purus, ac ornare risus. Nullam eget interdum erat. Mauris semper porta sapien et egestas. Aliquam viverra convallis pulvinar. Aliquam suscipit ligula felis, eu viverra ligula dignissim ut. Vivamus sit amet commodo sem. Nullam a viverra nibh. diff --git a/src/data/store.js b/src/data/store.js index 8ca7d2f..43b278e 100755 --- a/src/data/store.js +++ b/src/data/store.js @@ -3,8 +3,6 @@ import thunkMiddleware from 'redux-thunk'; import { composeWithDevTools } from 'redux-devtools-extension/logOnlyInProduction'; import { createLogger } from 'redux-logger'; -import fakeData from './services/lms/fakeData'; - import actions from './actions'; import selectors from './selectors'; import reducers from './reducers';