From e7d4f54e62a5a2a6eabb660e1e4fc17c982b840f Mon Sep 17 00:00:00 2001 From: Samay Sofo Date: Fri, 4 Oct 2024 22:38:12 +0000 Subject: [PATCH 1/8] B-Added flashmessage to TOO submittion page and updated unit tests --- .../Office/AddOrdersForm/AddOrdersForm.jsx | 2 + .../AddOrdersForm/AddOrdersForm.test.jsx | 27 +++++++- .../RequestedShipments.test.jsx | 61 ++++++++++++------- .../SubmittedRequestedShipments.jsx | 10 ++- 4 files changed, 76 insertions(+), 24 deletions(-) diff --git a/src/components/Office/AddOrdersForm/AddOrdersForm.jsx b/src/components/Office/AddOrdersForm/AddOrdersForm.jsx index b05737d59fc..cd2a5916b1b 100644 --- a/src/components/Office/AddOrdersForm/AddOrdersForm.jsx +++ b/src/components/Office/AddOrdersForm/AddOrdersForm.jsx @@ -11,6 +11,7 @@ import { ORDERS_PAY_GRADE_OPTIONS } from 'constants/orders'; import { dropdownInputOptions } from 'utils/formatters'; import WizardNavigation from 'components/Customer/WizardNavigation/WizardNavigation'; import Callout from 'components/Callout'; +import ConnectedFlashMessage from 'containers/FlashMessage/FlashMessage'; const AddOrdersForm = ({ onSubmit, ordersTypeOptions, initialValues, onBack, isSafetyMoveSelected }) => { const payGradeOptions = dropdownInputOptions(ORDERS_PAY_GRADE_OPTIONS); @@ -37,6 +38,7 @@ const AddOrdersForm = ({ onSubmit, ordersTypeOptions, initialValues, onBack, isS const isRetirementOrSeparation = ['RETIREMENT', 'SEPARATION'].includes(values.ordersType); return (
+

Tell us about the orders

diff --git a/src/components/Office/AddOrdersForm/AddOrdersForm.test.jsx b/src/components/Office/AddOrdersForm/AddOrdersForm.test.jsx index ac975f31fe9..945eccf49e2 100644 --- a/src/components/Office/AddOrdersForm/AddOrdersForm.test.jsx +++ b/src/components/Office/AddOrdersForm/AddOrdersForm.test.jsx @@ -1,11 +1,20 @@ import React from 'react'; import { render, waitFor, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { Provider } from 'react-redux'; import AddOrdersForm from './AddOrdersForm'; import { dropdownInputOptions } from 'utils/formatters'; import { ORDERS_PAY_GRADE_OPTIONS } from 'constants/orders'; +import { configureStore } from 'shared/store'; + +jest.mock('store/flash/actions', () => ({ + ...jest.requireActual('store/flash/actions'), + setFlashMessage: jest.fn(), +})); + +const mockStore = configureStore({}); describe('CreateMoveCustomerInfo Component', () => { const initialValues = { @@ -22,12 +31,22 @@ describe('CreateMoveCustomerInfo Component', () => { ordersTypeOptions: dropdownInputOptions(ORDERS_PAY_GRADE_OPTIONS), onSubmit: jest.fn(), onBack: jest.fn(), + setFlashMessage: jest.fn(), }; + afterEach(() => { + jest.clearAllMocks(); + }); + it('renders the form inputs', async () => { - render(); + render( + + + , + ); await waitFor(() => { + expect(testProps.setFlashMessage).not.toHaveBeenCalled(); expect(screen.getByText('Tell us about the orders')).toBeInTheDocument(); expect(screen.getByLabelText('Orders type')).toBeInTheDocument(); expect(screen.getByLabelText('Orders date')).toBeInTheDocument(); @@ -41,7 +60,11 @@ describe('CreateMoveCustomerInfo Component', () => { }); it('shows an error message if trying to submit an invalid form', async () => { - const { getByRole, findAllByRole, getByLabelText } = render(); + const { getByRole, findAllByRole, getByLabelText } = render( + + + , + ); await userEvent.click(getByLabelText('Orders type')); await userEvent.click(getByLabelText('Orders date')); await userEvent.click(getByLabelText('Report by date')); diff --git a/src/components/Office/RequestedShipments/RequestedShipments.test.jsx b/src/components/Office/RequestedShipments/RequestedShipments.test.jsx index 2dd12b87ee9..2b680f5d984 100644 --- a/src/components/Office/RequestedShipments/RequestedShipments.test.jsx +++ b/src/components/Office/RequestedShipments/RequestedShipments.test.jsx @@ -2,6 +2,7 @@ import React from 'react'; import { act } from 'react-dom/test-utils'; import { render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { Provider } from 'react-redux'; import { shipments, @@ -21,12 +22,22 @@ import SubmittedRequestedShipments from './SubmittedRequestedShipments'; import { MockProviders } from 'testUtils'; import { permissionTypes } from 'constants/permissions'; +import { configureStore } from 'shared/store'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useNavigate: () => jest.fn(), })); +jest.mock('store/flash/actions', () => ({ + ...jest.requireActual('store/flash/actions'), + setFlashMessage: jest.fn(), +})); + +afterEach(() => { + jest.clearAllMocks(); +}); + const moveTaskOrder = { eTag: 'MjAyMC0wNi0yNlQyMDoyMjo0MS43Mjc4NTNa', id: '6e8c5ca4-774c-4170-934a-59d22259e480', @@ -45,17 +56,20 @@ const moveTaskOrderServicesCounselingCompleted = { }; const approveMTO = jest.fn().mockResolvedValue({ response: { status: 200 } }); +const mockStore = configureStore({}); const submittedRequestedShipmentsComponent = ( - + + + ); const submittedRequestedShipmentsComponentWithPermission = ( @@ -102,16 +116,18 @@ const submittedRequestedShipmentsComponentAvailableToPrimeAt = ( ); const submittedRequestedShipmentsComponentServicesCounselingCompleted = ( - + + + ); const submittedRequestedShipmentsComponentMissingRequiredInfo = ( @@ -392,11 +408,14 @@ describe('RequestedShipments', () => { const Component = statusComponents[status]; - render(); + render( + + + , + ); const customerRemarks = screen.getAllByTestId('customerRemarks'); const counselorRemarks = screen.getAllByTestId('counselorRemarks'); - expect(customerRemarks.at(0).textContent).toBe('please treat gently'); expect(customerRemarks.at(1).textContent).toBe('please treat gently'); diff --git a/src/components/Office/RequestedShipments/SubmittedRequestedShipments.jsx b/src/components/Office/RequestedShipments/SubmittedRequestedShipments.jsx index bf847cb57cb..8bcb5f2e23f 100644 --- a/src/components/Office/RequestedShipments/SubmittedRequestedShipments.jsx +++ b/src/components/Office/RequestedShipments/SubmittedRequestedShipments.jsx @@ -4,6 +4,7 @@ import * as PropTypes from 'prop-types'; import { Button, Checkbox, Fieldset } from '@trussworks/react-uswds'; import { generatePath } from 'react-router-dom'; import { debounce } from 'lodash'; +import { connect } from 'react-redux'; import styles from './RequestedShipments.module.scss'; @@ -21,6 +22,7 @@ import shipmentCardsStyles from 'styles/shipmentCards.module.scss'; import { MoveTaskOrderShape, MTOServiceItemShape, OrdersInfoShape } from 'types/order'; import { ShipmentShape } from 'types/shipment'; import { fieldValidationShape } from 'utils/displayFlags'; +import { setFlashMessage as setFlashMessageAction } from 'store/flash/actions'; // nts defaults show preferred pickup date and pickup address, flagged items when collapsed // ntsr defaults shows preferred delivery date, storage facility address, destination address, flagged items when collapsed @@ -50,6 +52,7 @@ const SubmittedRequestedShipments = ({ displayDestinationType, mtoServiceItems, isMoveLocked, + setFlashMessage, }) => { const [isModalVisible, setIsModalVisible] = useState(false); const [filteredShipments, setFilteredShipments] = useState([]); @@ -122,11 +125,13 @@ const SubmittedRequestedShipments = ({ onError: () => { // TODO: Decide if we want to display an error notice, log error event, or retry setSubmitting(false); + setFlashMessage(null); }, }, ); }), ); + setFlashMessage('TASK_ORDER_CREATE_SUCCESS', 'success', 'Task order created successfully.'); handleAfterSuccess('../mto', { showMTOpostedMessage: true }); } catch { setSubmitting(false); @@ -332,4 +337,7 @@ SubmittedRequestedShipments.defaultProps = { mtoServiceItems: [], }; -export default SubmittedRequestedShipments; +const mapDispatchToProps = { + setFlashMessage: setFlashMessageAction, +}; +export default connect(() => ({}), mapDispatchToProps)(SubmittedRequestedShipments); From e1245bdeee613aaa8ace50cc80fabeda9bd309ac Mon Sep 17 00:00:00 2001 From: Samay Sofo Date: Sun, 6 Oct 2024 23:02:26 +0000 Subject: [PATCH 2/8] B-20975:Code clean up --- .../Office/AddOrdersForm/AddOrdersForm.test.jsx | 14 +------------- .../RequestedShipments/RequestedShipments.test.jsx | 9 --------- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/src/components/Office/AddOrdersForm/AddOrdersForm.test.jsx b/src/components/Office/AddOrdersForm/AddOrdersForm.test.jsx index 945eccf49e2..6282ec69bcb 100644 --- a/src/components/Office/AddOrdersForm/AddOrdersForm.test.jsx +++ b/src/components/Office/AddOrdersForm/AddOrdersForm.test.jsx @@ -9,14 +9,8 @@ import { dropdownInputOptions } from 'utils/formatters'; import { ORDERS_PAY_GRADE_OPTIONS } from 'constants/orders'; import { configureStore } from 'shared/store'; -jest.mock('store/flash/actions', () => ({ - ...jest.requireActual('store/flash/actions'), - setFlashMessage: jest.fn(), -})); - -const mockStore = configureStore({}); - describe('CreateMoveCustomerInfo Component', () => { + const mockStore = configureStore({}); const initialValues = { ordersType: '', issueDate: '', @@ -31,13 +25,8 @@ describe('CreateMoveCustomerInfo Component', () => { ordersTypeOptions: dropdownInputOptions(ORDERS_PAY_GRADE_OPTIONS), onSubmit: jest.fn(), onBack: jest.fn(), - setFlashMessage: jest.fn(), }; - afterEach(() => { - jest.clearAllMocks(); - }); - it('renders the form inputs', async () => { render( @@ -46,7 +35,6 @@ describe('CreateMoveCustomerInfo Component', () => { ); await waitFor(() => { - expect(testProps.setFlashMessage).not.toHaveBeenCalled(); expect(screen.getByText('Tell us about the orders')).toBeInTheDocument(); expect(screen.getByLabelText('Orders type')).toBeInTheDocument(); expect(screen.getByLabelText('Orders date')).toBeInTheDocument(); diff --git a/src/components/Office/RequestedShipments/RequestedShipments.test.jsx b/src/components/Office/RequestedShipments/RequestedShipments.test.jsx index 2b680f5d984..7ba8098453f 100644 --- a/src/components/Office/RequestedShipments/RequestedShipments.test.jsx +++ b/src/components/Office/RequestedShipments/RequestedShipments.test.jsx @@ -29,15 +29,6 @@ jest.mock('react-router-dom', () => ({ useNavigate: () => jest.fn(), })); -jest.mock('store/flash/actions', () => ({ - ...jest.requireActual('store/flash/actions'), - setFlashMessage: jest.fn(), -})); - -afterEach(() => { - jest.clearAllMocks(); -}); - const moveTaskOrder = { eTag: 'MjAyMC0wNi0yNlQyMDoyMjo0MS43Mjc4NTNa', id: '6e8c5ca4-774c-4170-934a-59d22259e480', From e467c1a3b737b42f21fd40b2ead2a4e71132d38d Mon Sep 17 00:00:00 2001 From: Samay Sofo Date: Thu, 10 Oct 2024 09:35:00 -0500 Subject: [PATCH 3/8] Added state management for allowing sc user to access orders page. --- .../Office/CustomerOnboarding/CreateCustomerForm.jsx | 5 ++++- .../CustomerOnboarding/CreateCustomerForm.test.jsx | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.jsx b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.jsx index 69354c506e6..2f89a760762 100644 --- a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.jsx +++ b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.jsx @@ -29,8 +29,9 @@ import { isBooleanFlagEnabled } from 'utils/featureFlags'; import departmentIndicators from 'constants/departmentIndicators'; import { generateUniqueDodid, generateUniqueEmplid } from 'utils/customer'; import Hint from 'components/Hint'; +import { setCanAddOrders as setCanAddOrdersAction } from 'store/general/actions'; -export const CreateCustomerForm = ({ userPrivileges, setFlashMessage }) => { +export const CreateCustomerForm = ({ userPrivileges, setFlashMessage, setCanAddOrders }) => { const [serverError, setServerError] = useState(null); const [showEmplid, setShowEmplid] = useState(false); const [isSafetyMove, setIsSafetyMove] = useState(false); @@ -133,6 +134,7 @@ export const CreateCustomerForm = ({ userPrivileges, setFlashMessage }) => { return createCustomerWithOktaOption({ body }) .then((res) => { const customerId = Object.keys(res.createdCustomer)[0]; + setCanAddOrders(true); setFlashMessage('CUSTOMER_CREATE_SUCCESS', 'success', `Customer created successfully.`); navigate( generatePath(servicesCounselingRoutes.BASE_CUSTOMERS_ORDERS_ADD_PATH, { @@ -555,6 +557,7 @@ export const CreateCustomerForm = ({ userPrivileges, setFlashMessage }) => { const mapDispatchToProps = { setFlashMessage: setFlashMessageAction, + setCanAddOrders: setCanAddOrdersAction, }; export default connect(() => ({}), mapDispatchToProps)(CreateCustomerForm); diff --git a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx index 841f7eb7c5e..9491908a54c 100644 --- a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx +++ b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx @@ -10,6 +10,7 @@ import { createCustomerWithOktaOption } from 'services/ghcApi'; import { servicesCounselingRoutes } from 'constants/routes'; import { isBooleanFlagEnabled } from 'utils/featureFlags'; import departmentIndicators from 'constants/departmentIndicators'; +import { setCanAddOrders } from 'store/general/actions'; const mockNavigate = jest.fn(); jest.mock('react-router-dom', () => ({ @@ -32,6 +33,14 @@ jest.mock('utils/featureFlags', () => ({ isBooleanFlagEnabled: jest.fn().mockImplementation(() => Promise.resolve(false)), })); +jest.mock('store/general/actions', () => ({ + ...jest.requireActual('store/general/actions'), + setCanAddOrders: jest.fn().mockImplementation(() => ({ + type: '', + payload: '', + })), +})); + beforeEach(jest.resetAllMocks); const fakePayload = { @@ -169,6 +178,7 @@ const mockUserPrivileges = [ const testProps = { setFlashMessage: jest.fn(), + setCanAddOrders: jest.fn(), userPrivileges: mockUserPrivileges, }; @@ -336,6 +346,7 @@ describe('CreateCustomerForm', () => { await userEvent.click(saveBtn); await waitFor(() => { + expect(setCanAddOrders).toHaveBeenCalledWith(true); expect(createCustomerWithOktaOption).toHaveBeenCalled(); expect(mockNavigate).toHaveBeenCalledWith(ordersPath, { state: { From e751aa800184d4c131555c7eb9a953cba02c3147 Mon Sep 17 00:00:00 2001 From: Samay Sofo Date: Thu, 10 Oct 2024 09:51:39 -0500 Subject: [PATCH 4/8] Fixed tests --- src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx index 9491908a54c..c3487b6e92d 100644 --- a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx +++ b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx @@ -346,8 +346,8 @@ describe('CreateCustomerForm', () => { await userEvent.click(saveBtn); await waitFor(() => { - expect(setCanAddOrders).toHaveBeenCalledWith(true); expect(createCustomerWithOktaOption).toHaveBeenCalled(); + expect(setCanAddOrders).toHaveBeenCalledWith(true); expect(mockNavigate).toHaveBeenCalledWith(ordersPath, { state: { isSafetyMoveSelected: false, From 5e9d887a6f6fa44e92ca3c4865dfe13b422b1972 Mon Sep 17 00:00:00 2001 From: Samay Sofo Date: Thu, 10 Oct 2024 11:07:39 -0500 Subject: [PATCH 5/8] Fixed test --- src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx index c3487b6e92d..4c9ab0f9a4b 100644 --- a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx +++ b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx @@ -347,7 +347,6 @@ describe('CreateCustomerForm', () => { await waitFor(() => { expect(createCustomerWithOktaOption).toHaveBeenCalled(); - expect(setCanAddOrders).toHaveBeenCalledWith(true); expect(mockNavigate).toHaveBeenCalledWith(ordersPath, { state: { isSafetyMoveSelected: false, From cec97af1edc1ba380260b522cdefff2e9d0ab437 Mon Sep 17 00:00:00 2001 From: Samay Sofo Date: Thu, 10 Oct 2024 11:24:00 -0500 Subject: [PATCH 6/8] Fixed test --- src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx index 4c9ab0f9a4b..1446c0a8307 100644 --- a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx +++ b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx @@ -10,7 +10,6 @@ import { createCustomerWithOktaOption } from 'services/ghcApi'; import { servicesCounselingRoutes } from 'constants/routes'; import { isBooleanFlagEnabled } from 'utils/featureFlags'; import departmentIndicators from 'constants/departmentIndicators'; -import { setCanAddOrders } from 'store/general/actions'; const mockNavigate = jest.fn(); jest.mock('react-router-dom', () => ({ From b97688a4fae22c16b2debdf620e40a30bca85864 Mon Sep 17 00:00:00 2001 From: Samay Sofo Date: Thu, 10 Oct 2024 13:51:21 -0500 Subject: [PATCH 7/8] Code clean up --- pkg/services/mocks/LineOfAccountingFetcher.go | 4 ---- pkg/services/mocks/OrderFetcher.go | 4 ---- pkg/services/mocks/TransportationAccountingCodeFetcher.go | 4 ---- 3 files changed, 12 deletions(-) diff --git a/pkg/services/mocks/LineOfAccountingFetcher.go b/pkg/services/mocks/LineOfAccountingFetcher.go index 69b16a10d79..42a05a4e0ce 100644 --- a/pkg/services/mocks/LineOfAccountingFetcher.go +++ b/pkg/services/mocks/LineOfAccountingFetcher.go @@ -42,10 +42,6 @@ func (_m *LineOfAccountingFetcher) FetchLongLinesOfAccounting(departmentIndicato panic("no return value specified for FetchLongLinesOfAccounting") } - if len(ret) == 0 { - panic("no return value specified for FetchLongLinesOfAccounting") - } - var r0 []models.LineOfAccounting var r1 error if rf, ok := ret.Get(0).(func(models.DepartmentIndicator, time.Time, string, appcontext.AppContext) ([]models.LineOfAccounting, error)); ok { diff --git a/pkg/services/mocks/OrderFetcher.go b/pkg/services/mocks/OrderFetcher.go index 7dec217b451..c7eb39d01ce 100644 --- a/pkg/services/mocks/OrderFetcher.go +++ b/pkg/services/mocks/OrderFetcher.go @@ -88,10 +88,6 @@ func (_m *OrderFetcher) ListOrders(appCtx appcontext.AppContext, officeUserID uu panic("no return value specified for ListOrders") } - if len(ret) == 0 { - panic("no return value specified for ListOrders") - } - var r0 []models.Move var r1 int var r2 error diff --git a/pkg/services/mocks/TransportationAccountingCodeFetcher.go b/pkg/services/mocks/TransportationAccountingCodeFetcher.go index f3147f8bc41..dd7c061638e 100644 --- a/pkg/services/mocks/TransportationAccountingCodeFetcher.go +++ b/pkg/services/mocks/TransportationAccountingCodeFetcher.go @@ -24,10 +24,6 @@ func (_m *TransportationAccountingCodeFetcher) FetchOrderTransportationAccountin panic("no return value specified for FetchOrderTransportationAccountingCodes") } - if len(ret) == 0 { - panic("no return value specified for FetchOrderTransportationAccountingCodes") - } - var r0 []models.TransportationAccountingCode var r1 error if rf, ok := ret.Get(0).(func(models.DepartmentIndicator, time.Time, string, appcontext.AppContext) ([]models.TransportationAccountingCode, error)); ok { From b74bc135214433d5b148dee23a4fe13d1d2dd2d8 Mon Sep 17 00:00:00 2001 From: Samay Sofo Date: Thu, 10 Oct 2024 18:10:12 -0500 Subject: [PATCH 8/8] Added test for addOrders State management --- .../Office/CustomerOnboarding/CreateCustomerForm.test.jsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx index 1446c0a8307..d5de3e44d8d 100644 --- a/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx +++ b/src/pages/Office/CustomerOnboarding/CreateCustomerForm.test.jsx @@ -23,7 +23,6 @@ jest.mock('services/ghcApi', () => ({ })); jest.mock('store/flash/actions', () => ({ - ...jest.requireActual('store/flash/actions'), setFlashMessage: jest.fn(), })); @@ -33,11 +32,7 @@ jest.mock('utils/featureFlags', () => ({ })); jest.mock('store/general/actions', () => ({ - ...jest.requireActual('store/general/actions'), - setCanAddOrders: jest.fn().mockImplementation(() => ({ - type: '', - payload: '', - })), + setCanAddOrders: jest.fn(), })); beforeEach(jest.resetAllMocks); @@ -346,6 +341,7 @@ describe('CreateCustomerForm', () => { await waitFor(() => { expect(createCustomerWithOktaOption).toHaveBeenCalled(); + expect(testProps.setCanAddOrders).toHaveBeenCalledWith(true); expect(mockNavigate).toHaveBeenCalledWith(ordersPath, { state: { isSafetyMoveSelected: false,