From 8741e1d8808e0939a4b5982de411231116b13e88 Mon Sep 17 00:00:00 2001 From: mashal-m Date: Fri, 14 Oct 2022 18:34:16 +0500 Subject: [PATCH 1/3] refactor: migrate off paragon modal deprecated migration --- .../CodeAssignmentModal.test.jsx | 3 +- src/components/CodeAssignmentModal/index.jsx | 75 +++++++++------- .../CodeReminderModal.test.jsx | 2 +- src/components/CodeReminderModal/index.jsx | 76 ++++++++++------- src/components/CodeRevokeModal/index.jsx | 85 +++++++++++-------- src/components/InviteLearnersModal/index.jsx | 64 ++++++++------ .../CodeReminderModal.test.jsx | 6 +- .../CodeRevokeModal/CodeRevokeModal.test.jsx | 12 +-- .../InviteLearnersModal.test.jsx | 2 +- 9 files changed, 194 insertions(+), 131 deletions(-) diff --git a/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx b/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx index ff5b45bce0..127173f56c 100644 --- a/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx +++ b/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx @@ -90,7 +90,7 @@ const initialProps = { enterpriseSlug: 'bearsRus', setEmailAddress: () => {}, enterpriseUuid: 'foo', - createPendingEnterpriseUsers: () => {}, + createPendingEnterpriseUsers: () => { }, }; const mockStore = configureMockStore([thunk]); @@ -134,7 +134,6 @@ const CodeAssignmentModalWrapper = (props) => ( ); /* eslint-enable react/prop-types */ - describe('CodeAssignmentModal component', () => { it('displays a modal', () => { render(); diff --git a/src/components/CodeAssignmentModal/index.jsx b/src/components/CodeAssignmentModal/index.jsx index f98ec5abbb..79465154c5 100644 --- a/src/components/CodeAssignmentModal/index.jsx +++ b/src/components/CodeAssignmentModal/index.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxForm, SubmissionError } from 'redux-form'; import { - Button, Icon, Modal, Form, + Button, Icon, ModalDialog, ActionRow, Form, } from '@edx/paragon'; import isEmail from 'validator/lib/isEmail'; @@ -373,7 +373,7 @@ export class BaseCodeAssignmentModal extends React.Component { > Notify learners by email - { notify && ( + {notify && ( - - <> - {mode === MODAL_TYPES.assign && submitting && } - {`Assign ${isBulkAssign ? 'Codes' : 'Code'}`} - - , - , - ]} +
+ - + className="code-assignment" + hasCloseButton + + > + + + {this.renderTitle()} + + + +
+ {this.renderBody()} +
+
+ + + + Cancel + + , + , + + +
+
); } } diff --git a/src/components/CodeReminderModal/CodeReminderModal.test.jsx b/src/components/CodeReminderModal/CodeReminderModal.test.jsx index 8ae8c93505..0b1e57308f 100644 --- a/src/components/CodeReminderModal/CodeReminderModal.test.jsx +++ b/src/components/CodeReminderModal/CodeReminderModal.test.jsx @@ -126,10 +126,10 @@ const CodeReminderModalWrapper = (props) => ( ); /* eslint-enable react/prop-types */ - describe('CodeReminderModal component', () => { it('displays a modal', () => { render(); + expect(screen.getByText(initialProps.title)).toBeInTheDocument(); }); it('displays an error', () => { diff --git a/src/components/CodeReminderModal/index.jsx b/src/components/CodeReminderModal/index.jsx index c383940aab..dcea67ac2f 100644 --- a/src/components/CodeReminderModal/index.jsx +++ b/src/components/CodeReminderModal/index.jsx @@ -1,7 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxForm, SubmissionError } from 'redux-form'; -import { Button, Icon, Modal } from '@edx/paragon'; +import { + Button, Icon, ModalDialog, ActionRow, +} from '@edx/paragon'; import SaveTemplateButton from '../../containers/SaveTemplateButton'; import { EMAIL_TEMPLATE_SUBJECT_KEY } from '../../data/constants/emailTemplate'; @@ -214,35 +216,51 @@ export class BaseCodeReminderModal extends React.Component { } = this.state; return ( - <> - - <> - {mode === REMIND_MODE && submitting && } - Remind - - , - , - ]} +
+ - + className="code-reminder" + hasCloseButton + + > + + + Invite Learners + + + +
+ {this.renderBody()} +
+
+ + + + Cancel + + , + , + + +
+
); } } diff --git a/src/components/CodeRevokeModal/index.jsx b/src/components/CodeRevokeModal/index.jsx index 64727922e1..dfd10a9d92 100644 --- a/src/components/CodeRevokeModal/index.jsx +++ b/src/components/CodeRevokeModal/index.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Field, reduxForm, SubmissionError } from 'redux-form'; import { - Button, Icon, Modal, + Button, Icon, ModalDialog, ActionRow, } from '@edx/paragon'; import { faInfoCircle } from '@fortawesome/free-solid-svg-icons'; @@ -177,11 +177,11 @@ class CodeRevokeModal extends React.Component { <> {submitFailed && ( - + )}
{isBulkRevoke && ( @@ -232,36 +232,51 @@ class CodeRevokeModal extends React.Component { } = this.state; return ( - <> - - <> - {mode === MODAL_TYPES.revoke && submitting && } - Revoke - - , - , - ]} +
+ - + className="code-revoke" + hasCloseButton + + > + + + {this.renderTitle()} + + + + {this.renderBody()} + + + + + Close + + , + , + + + +
); } } diff --git a/src/components/InviteLearnersModal/index.jsx b/src/components/InviteLearnersModal/index.jsx index 851fe3b9c9..c88bc815d2 100644 --- a/src/components/InviteLearnersModal/index.jsx +++ b/src/components/InviteLearnersModal/index.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Field, reduxForm, SubmissionError } from 'redux-form'; import { - Button, Icon, Modal, Alert, + Button, Icon, Alert, ModalDialog, ActionRow, } from '@edx/paragon'; import { Cancel as ErrorIcon } from '@edx/paragon/icons'; @@ -179,30 +179,46 @@ class InviteLearnersModal extends React.Component { } = this.props; return ( - <> - - <> - {submitting && } - Invite learners - - , - ]} - closeText="Cancel" +
+ - + className="add-users" + hasCloseButton + + > + + + Invite learners + + + +
+ {this.renderBody()} +
+
+ + + + Cancel + + , + + +
+
); } } diff --git a/src/containers/CodeReminderModal/CodeReminderModal.test.jsx b/src/containers/CodeReminderModal/CodeReminderModal.test.jsx index 77b0f675da..ba31b05c6e 100644 --- a/src/containers/CodeReminderModal/CodeReminderModal.test.jsx +++ b/src/containers/CodeReminderModal/CodeReminderModal.test.jsx @@ -170,7 +170,7 @@ describe('CodeReminderModalWrapper', () => { expect(wrapper.find('.bulk-selected-codes').text()).toEqual('Selected codes: 2'); expect(wrapper.find('#email-template')).toBeTruthy(); - wrapper.find('.modal-footer .code-remind-save-btn').hostNodes().simulate('click'); + wrapper.find('.pgn__modal-footer .code-remind-save-btn').hostNodes().simulate('click'); expect(spy).toHaveBeenCalledWith(couponId, codeReminderRequestData(2)); }); @@ -191,7 +191,7 @@ describe('CodeReminderModalWrapper', () => { expect(wrapper.find('.bulk-selected-codes').text()).toEqual('Selected codes: 2'); expect(wrapper.find('#email-template')).toBeTruthy(); - wrapper.find('.modal-footer .code-remind-save-btn').hostNodes().simulate('click'); + wrapper.find('.pgn__modal-footer .code-remind-save-btn').hostNodes().simulate('click'); const expectedData = codeReminderRequestData(2); delete expectedData.base_enterprise_url; expect(spy).toHaveBeenCalledWith(couponId, expectedData); @@ -208,7 +208,7 @@ describe('CodeReminderModalWrapper', () => { />); expect(wrapper.find('.bulk-selected-codes').text()).toEqual('Selected codes: 3'); - wrapper.find('.modal-footer .code-remind-save-btn').hostNodes().simulate('click'); + wrapper.find('.pgn__modal-footer .code-remind-save-btn').hostNodes().simulate('click'); expect(spy).toHaveBeenCalledWith(couponId, codeReminderRequestData(0, selectedToggle)); }); diff --git a/src/containers/CodeRevokeModal/CodeRevokeModal.test.jsx b/src/containers/CodeRevokeModal/CodeRevokeModal.test.jsx index 30d5a1a165..98178e9461 100644 --- a/src/containers/CodeRevokeModal/CodeRevokeModal.test.jsx +++ b/src/containers/CodeRevokeModal/CodeRevokeModal.test.jsx @@ -114,13 +114,13 @@ describe('CodeRevokeModalWrapper', () => { spy = jest.spyOn(EcommerceApiService, 'sendCodeRevoke'); const wrapper = mount(); - expect(wrapper.find('.modal-title').text()).toEqual(couponTitle); + expect(wrapper.find('.pgn__modal-title').text()).toEqual(couponTitle); expect(wrapper.find('.assignment-details p.code').text()).toEqual(`Code: ${data.code}`); expect(wrapper.find('.assignment-details p.email').text()).toEqual(`Email: ${data.assigned_to}`); - expect(wrapper.find('.modal-body form h3').text()).toEqual('Email Template'); - wrapper.find('.modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); + expect(wrapper.find('.pgn__modal-body-content form h3').text()).toEqual('Email Template'); + wrapper.find('.pgn__modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); expect(spy).toHaveBeenCalledWith(couponId, codeRevokeRequestData(1)); }); @@ -133,7 +133,7 @@ describe('CodeRevokeModalWrapper', () => { />); expect(wrapper.find('.bulk-selected-codes').text()).toEqual('Selected codes: 2'); - wrapper.find('.modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); + wrapper.find('.pgn__modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); expect(spy).toHaveBeenCalledWith(couponId, codeRevokeRequestData(2)); }); @@ -149,7 +149,7 @@ describe('CodeRevokeModalWrapper', () => { })} />); - wrapper.find('.modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); + wrapper.find('.pgn__modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); const expectedData = codeRevokeRequestData(2); delete expectedData.base_enterprise_url; expect(spy).toHaveBeenCalledWith(couponId, expectedData); @@ -164,7 +164,7 @@ describe('CodeRevokeModalWrapper', () => { />); expect(wrapper.find('.bulk-selected-codes').exists()).toBeFalsy(); - wrapper.find('.modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); + wrapper.find('.pgn__modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); expect(spy).not.toHaveBeenCalled(); }); diff --git a/src/containers/InviteLearnersModal/InviteLearnersModal.test.jsx b/src/containers/InviteLearnersModal/InviteLearnersModal.test.jsx index 4f64eda2b1..8c2565c054 100644 --- a/src/containers/InviteLearnersModal/InviteLearnersModal.test.jsx +++ b/src/containers/InviteLearnersModal/InviteLearnersModal.test.jsx @@ -55,6 +55,6 @@ describe('UserSubscriptionModalWrapper', () => { it('renders user licenses modal', () => { const wrapper = mount(); - expect(wrapper.find('.modal-body form h3').first().text()).toEqual('Add Users'); + expect(wrapper.find('.pgn__modal-body-content form h3').first().text()).toEqual('Add Users'); }); }); From 431c55f03d439ff42c7db2ae6d1c4271793d4987 Mon Sep 17 00:00:00 2001 From: mashal-m Date: Fri, 14 Oct 2022 19:09:33 +0500 Subject: [PATCH 2/3] refactor: migrate off paragon modal deprecated migration --- src/components/CodeReminderModal/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CodeReminderModal/index.jsx b/src/components/CodeReminderModal/index.jsx index dcea67ac2f..82cc613755 100644 --- a/src/components/CodeReminderModal/index.jsx +++ b/src/components/CodeReminderModal/index.jsx @@ -227,7 +227,7 @@ export class BaseCodeReminderModal extends React.Component { > - Invite Learners + {this.renderTitle()} From e89f772025b1e97b241b8ff41a11411965fd7c88 Mon Sep 17 00:00:00 2001 From: mashal-m Date: Fri, 2 Jun 2023 13:17:14 +0500 Subject: [PATCH 3/3] refactor: fixed the requested changes --- .../CodeAssignmentModal.test.jsx | 2 +- src/components/CodeAssignmentModal/index.jsx | 93 ++++++++----------- src/components/CodeReminderModal/index.jsx | 93 ++++++++----------- src/components/CodeRevokeModal/index.jsx | 92 ++++++++---------- src/components/InviteLearnersModal/index.jsx | 76 +++++++-------- .../CodeReminderModal.test.jsx | 6 +- .../CodeRevokeModal/CodeRevokeModal.test.jsx | 11 +-- .../InviteLearnersModal.test.jsx | 2 +- 8 files changed, 161 insertions(+), 214 deletions(-) diff --git a/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx b/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx index 127173f56c..e41d8743ac 100644 --- a/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx +++ b/src/components/CodeAssignmentModal/CodeAssignmentModal.test.jsx @@ -90,7 +90,7 @@ const initialProps = { enterpriseSlug: 'bearsRus', setEmailAddress: () => {}, enterpriseUuid: 'foo', - createPendingEnterpriseUsers: () => { }, + createPendingEnterpriseUsers: () => {}, }; const mockStore = configureMockStore([thunk]); diff --git a/src/components/CodeAssignmentModal/index.jsx b/src/components/CodeAssignmentModal/index.jsx index 0259ce596e..659cc7a4da 100644 --- a/src/components/CodeAssignmentModal/index.jsx +++ b/src/components/CodeAssignmentModal/index.jsx @@ -38,7 +38,6 @@ export class BaseCodeAssignmentModal extends React.Component { super(props); this.errorMessageRef = React.createRef(); - this.modalRef = React.createRef(); this.state = { mode: MODAL_TYPES.assign, @@ -52,14 +51,6 @@ export class BaseCodeAssignmentModal extends React.Component { this.getNumberOfSelectedCodes = this.getNumberOfSelectedCodes.bind(this); } - componentDidMount() { - const { current: { firstFocusableElement } } = this.modalRef; - - if (firstFocusableElement) { - firstFocusableElement.focus(); - } - } - componentDidUpdate(prevProps) { const { submitFailed, @@ -402,50 +393,46 @@ export class BaseCodeAssignmentModal extends React.Component { } = this.state; return ( -
- - - - {this.renderTitle()} - - - -
- {this.renderBody()} -
-
- - - - Cancel - - , - , - - -
-
+ + + + {this.renderTitle()} + + + + {this.renderBody()} + + + + + Cancel + + , + , + + + ); } } diff --git a/src/components/CodeReminderModal/index.jsx b/src/components/CodeReminderModal/index.jsx index 129741f2d7..57cf861d48 100644 --- a/src/components/CodeReminderModal/index.jsx +++ b/src/components/CodeReminderModal/index.jsx @@ -35,7 +35,6 @@ export class BaseCodeReminderModal extends React.Component { super(props); this.errorMessageRef = React.createRef(); - this.modalRef = React.createRef(); this.state = { mode: REMIND_MODE, @@ -46,14 +45,6 @@ export class BaseCodeReminderModal extends React.Component { this.getNumberOfSelectedCodes = this.getNumberOfSelectedCodes.bind(this); } - componentDidMount() { - const { current: { firstFocusableElement } } = this.modalRef; - - if (firstFocusableElement) { - firstFocusableElement.focus(); - } - } - componentDidUpdate(prevProps) { const { submitFailed, @@ -216,50 +207,46 @@ export class BaseCodeReminderModal extends React.Component { } = this.state; return ( -
- - - - {this.renderTitle()} - - - -
- {this.renderBody()} -
-
- - - - Cancel - - , - , - - -
-
+ + + + {this.renderTitle()} + + + + {this.renderBody()} + + + + + Cancel + + , + , + + + ); } } diff --git a/src/components/CodeRevokeModal/index.jsx b/src/components/CodeRevokeModal/index.jsx index 80ba954cb2..b84240c436 100644 --- a/src/components/CodeRevokeModal/index.jsx +++ b/src/components/CodeRevokeModal/index.jsx @@ -30,7 +30,6 @@ class CodeRevokeModal extends React.Component { super(props); this.errorMessageRef = React.createRef(); - this.modalRef = React.createRef(); this.state = { mode: MODAL_TYPES.revoke, @@ -42,14 +41,6 @@ class CodeRevokeModal extends React.Component { this.handleModalSubmit = this.handleModalSubmit.bind(this); } - componentDidMount() { - const { current: { firstFocusableElement } } = this.modalRef; - - if (firstFocusableElement) { - firstFocusableElement.focus(); - } - } - componentDidUpdate(prevProps) { const { submitFailed, @@ -228,51 +219,46 @@ class CodeRevokeModal extends React.Component { } = this.state; return ( -
- - - - {this.renderTitle()} - - - - {this.renderBody()} - - - - - Close - - , - , - - - -
+ + + {this.renderTitle()} + + + + {this.renderBody()} + + + + + Close + + , + , + + + ); } } diff --git a/src/components/InviteLearnersModal/index.jsx b/src/components/InviteLearnersModal/index.jsx index c88bc815d2..fc24dbda09 100644 --- a/src/components/InviteLearnersModal/index.jsx +++ b/src/components/InviteLearnersModal/index.jsx @@ -18,18 +18,13 @@ class InviteLearnersModal extends React.Component { super(props); this.errorMessageRef = React.createRef(); - this.modalRef = React.createRef(); this.handleModalSubmit = this.handleModalSubmit.bind(this); } componentDidMount() { - const { current: { firstFocusableElement } } = this.modalRef; const { contactEmail } = this.props; - if (firstFocusableElement) { - firstFocusableElement.focus(); - } this.props.initialize({ 'email-template-greeting': emailTemplate.greeting, 'email-template-body': emailTemplate.body, @@ -179,46 +174,39 @@ class InviteLearnersModal extends React.Component { } = this.props; return ( -
- - - - Invite learners - - - -
- {this.renderBody()} -
-
- - - - Cancel - - , - - -
-
+ + + Invite learners + + + + {this.renderBody()} + + + + + Cancel + + , + + + ); } } diff --git a/src/containers/CodeReminderModal/CodeReminderModal.test.jsx b/src/containers/CodeReminderModal/CodeReminderModal.test.jsx index ba31b05c6e..e0bd5e3a4b 100644 --- a/src/containers/CodeReminderModal/CodeReminderModal.test.jsx +++ b/src/containers/CodeReminderModal/CodeReminderModal.test.jsx @@ -170,7 +170,7 @@ describe('CodeReminderModalWrapper', () => { expect(wrapper.find('.bulk-selected-codes').text()).toEqual('Selected codes: 2'); expect(wrapper.find('#email-template')).toBeTruthy(); - wrapper.find('.pgn__modal-footer .code-remind-save-btn').hostNodes().simulate('click'); + wrapper.find('div .code-remind-save-btn').hostNodes().simulate('click'); expect(spy).toHaveBeenCalledWith(couponId, codeReminderRequestData(2)); }); @@ -191,7 +191,7 @@ describe('CodeReminderModalWrapper', () => { expect(wrapper.find('.bulk-selected-codes').text()).toEqual('Selected codes: 2'); expect(wrapper.find('#email-template')).toBeTruthy(); - wrapper.find('.pgn__modal-footer .code-remind-save-btn').hostNodes().simulate('click'); + wrapper.find('div .code-remind-save-btn').hostNodes().simulate('click'); const expectedData = codeReminderRequestData(2); delete expectedData.base_enterprise_url; expect(spy).toHaveBeenCalledWith(couponId, expectedData); @@ -208,7 +208,7 @@ describe('CodeReminderModalWrapper', () => { />); expect(wrapper.find('.bulk-selected-codes').text()).toEqual('Selected codes: 3'); - wrapper.find('.pgn__modal-footer .code-remind-save-btn').hostNodes().simulate('click'); + wrapper.find('div .code-remind-save-btn').hostNodes().simulate('click'); expect(spy).toHaveBeenCalledWith(couponId, codeReminderRequestData(0, selectedToggle)); }); diff --git a/src/containers/CodeRevokeModal/CodeRevokeModal.test.jsx b/src/containers/CodeRevokeModal/CodeRevokeModal.test.jsx index 98178e9461..3837ecd0d6 100644 --- a/src/containers/CodeRevokeModal/CodeRevokeModal.test.jsx +++ b/src/containers/CodeRevokeModal/CodeRevokeModal.test.jsx @@ -118,9 +118,8 @@ describe('CodeRevokeModalWrapper', () => { expect(wrapper.find('.assignment-details p.code').text()).toEqual(`Code: ${data.code}`); expect(wrapper.find('.assignment-details p.email').text()).toEqual(`Email: ${data.assigned_to}`); - - expect(wrapper.find('.pgn__modal-body-content form h3').text()).toEqual('Email Template'); - wrapper.find('.pgn__modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); + expect(wrapper.find('div form h3').text()).toEqual('Email Template'); + wrapper.find('div .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); expect(spy).toHaveBeenCalledWith(couponId, codeRevokeRequestData(1)); }); @@ -133,7 +132,7 @@ describe('CodeRevokeModalWrapper', () => { />); expect(wrapper.find('.bulk-selected-codes').text()).toEqual('Selected codes: 2'); - wrapper.find('.pgn__modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); + wrapper.find('div .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); expect(spy).toHaveBeenCalledWith(couponId, codeRevokeRequestData(2)); }); @@ -149,7 +148,7 @@ describe('CodeRevokeModalWrapper', () => { })} />); - wrapper.find('.pgn__modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); + wrapper.find('div .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); const expectedData = codeRevokeRequestData(2); delete expectedData.base_enterprise_url; expect(spy).toHaveBeenCalledWith(couponId, expectedData); @@ -164,7 +163,7 @@ describe('CodeRevokeModalWrapper', () => { />); expect(wrapper.find('.bulk-selected-codes').exists()).toBeFalsy(); - wrapper.find('.pgn__modal-footer .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); + wrapper.find('div .code-revoke-save-btn .btn-primary').hostNodes().simulate('click'); expect(spy).not.toHaveBeenCalled(); }); diff --git a/src/containers/InviteLearnersModal/InviteLearnersModal.test.jsx b/src/containers/InviteLearnersModal/InviteLearnersModal.test.jsx index 8c2565c054..9021c1507c 100644 --- a/src/containers/InviteLearnersModal/InviteLearnersModal.test.jsx +++ b/src/containers/InviteLearnersModal/InviteLearnersModal.test.jsx @@ -55,6 +55,6 @@ describe('UserSubscriptionModalWrapper', () => { it('renders user licenses modal', () => { const wrapper = mount(); - expect(wrapper.find('.pgn__modal-body-content form h3').first().text()).toEqual('Add Users'); + expect(wrapper.find('div form h3').first().text()).toEqual('Add Users'); }); });