Skip to content

Commit 5ae68fc

Browse files
author
Katelyn Grimes
committed
Added duplicate mutation to mha
1 parent b4c4cd4 commit 5ae68fc

File tree

4 files changed

+155
-10
lines changed

4 files changed

+155
-10
lines changed

src/components/Reports/MinisterHousingAllowance/MinisterHousingAllowance.graphql

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,28 @@ mutation SubmitMinistryHousingAllowanceRequest(
160160
}
161161
}
162162
}
163+
164+
mutation DuplicateMinistryHousingAllowanceRequest(
165+
$input: DuplicateMinistryHousingAllowanceRequestMutationInput!
166+
) {
167+
duplicateMinistryHousingAllowanceRequest(input: $input) {
168+
ministryHousingAllowanceRequest {
169+
id
170+
requestAttributes {
171+
rentOrOwn
172+
rentalValue
173+
furnitureCostsOne
174+
avgUtilityOne
175+
mortgageOrRentPayment
176+
furnitureCostsTwo
177+
repairCosts
178+
avgUtilityTwo
179+
unexpectedExpenses
180+
overallAmount
181+
phoneNumber
182+
emailAddress
183+
iUnderstandMhaPolicy
184+
}
185+
}
186+
}
187+
}

src/components/Reports/MinisterHousingAllowance/SharedComponents/CurrentBoardApproved.test.tsx

Lines changed: 88 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import React from 'react';
22
import { ThemeProvider } from '@mui/material/styles';
3-
import { render } from '@testing-library/react';
3+
import { render, waitFor } from '@testing-library/react';
4+
import userEvent from '@testing-library/user-event';
45
import TestRouter from '__tests__/util/TestRouter';
6+
import { GqlMockedProvider } from '__tests__/util/graphqlMocking';
57
import theme from 'src/theme';
8+
import { DuplicateMinistryHousingAllowanceRequestMutation } from '../MinisterHousingAllowance.generated';
69
import {
710
ContextType,
811
HcmData,
@@ -11,11 +14,21 @@ import {
1114
import { mockMHARequest } from '../mockData';
1215
import { CurrentBoardApproved } from './CurrentBoardApproved';
1316

17+
const newRequestId = 'new-request-id';
18+
const mutationSpy = jest.fn();
19+
const mockPush = jest.fn();
1420
interface TestComponentProps {
1521
contextValue: Partial<ContextType>;
22+
router?: {
23+
push?: jest.Mock;
24+
query?: { accountListId?: string };
25+
};
1626
}
1727

18-
const TestComponent: React.FC<TestComponentProps> = ({ contextValue }) => {
28+
const TestComponent: React.FC<TestComponentProps> = ({
29+
contextValue,
30+
router = {},
31+
}) => {
1932
const approvedMHARequest = {
2033
...mockMHARequest,
2134
updatedAt: '2022-12-01',
@@ -30,12 +43,18 @@ const TestComponent: React.FC<TestComponentProps> = ({ contextValue }) => {
3043

3144
return (
3245
<ThemeProvider theme={theme}>
33-
<TestRouter>
34-
<MinisterHousingAllowanceContext.Provider
35-
value={contextValue as ContextType}
46+
<TestRouter router={router}>
47+
<GqlMockedProvider<{
48+
DuplicateMinistryHousingAllowanceRequest: DuplicateMinistryHousingAllowanceRequestMutation;
49+
}>
50+
onCall={mutationSpy}
3651
>
37-
<CurrentBoardApproved request={approvedMHARequest} />
38-
</MinisterHousingAllowanceContext.Provider>
52+
<MinisterHousingAllowanceContext.Provider
53+
value={contextValue as ContextType}
54+
>
55+
<CurrentBoardApproved request={approvedMHARequest} />
56+
</MinisterHousingAllowanceContext.Provider>
57+
</GqlMockedProvider>
3958
</TestRouter>
4059
</ThemeProvider>
4160
);
@@ -115,4 +134,66 @@ describe('CurrentBoardApproved Component', () => {
115134
// Spouse data should not be rendered
116135
expect(queryByText('Jane')).not.toBeInTheDocument();
117136
});
137+
138+
it('should navigate to edit page with new requestId after duplicate mutation', async () => {
139+
const { getByText } = render(
140+
<ThemeProvider theme={theme}>
141+
<TestRouter router={{ push: mockPush }}>
142+
<GqlMockedProvider<{
143+
DuplicateMinistryHousingAllowanceRequest: DuplicateMinistryHousingAllowanceRequestMutation;
144+
}>
145+
mocks={{
146+
DuplicateMinistryHousingAllowanceRequest: {
147+
duplicateMinistryHousingAllowanceRequest: {
148+
ministryHousingAllowanceRequest: {
149+
id: newRequestId,
150+
},
151+
},
152+
},
153+
}}
154+
onCall={mutationSpy}
155+
>
156+
<MinisterHousingAllowanceContext.Provider
157+
value={
158+
{
159+
isMarried: false,
160+
preferredName: 'John',
161+
spousePreferredName: '',
162+
requestId: 'old-request-id',
163+
userHcmData: {
164+
staffInfo: {
165+
personNumber: '000123456',
166+
},
167+
} as unknown as HcmData,
168+
spouseHcmData: null,
169+
} as ContextType
170+
}
171+
>
172+
<CurrentBoardApproved request={mockMHARequest} />
173+
</MinisterHousingAllowanceContext.Provider>
174+
</GqlMockedProvider>
175+
</TestRouter>
176+
</ThemeProvider>,
177+
);
178+
179+
const updateButton = getByText('Update Current MHA');
180+
userEvent.click(updateButton);
181+
182+
await waitFor(() => {
183+
expect(mutationSpy).toHaveGraphqlOperation(
184+
'DuplicateMinistryHousingAllowanceRequest',
185+
{
186+
input: {
187+
requestId: 'old-request-id',
188+
},
189+
},
190+
);
191+
});
192+
193+
await waitFor(() => {
194+
expect(mockPush).toHaveBeenCalledWith(
195+
`/accountLists/account-list-1/reports/housingAllowance/${newRequestId}/edit`,
196+
);
197+
});
198+
});
118199
});

src/components/Reports/MinisterHousingAllowance/SharedComponents/CurrentBoardApproved.tsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useRouter } from 'next/router';
12
import { HomeSharp } from '@mui/icons-material';
23
import {
34
Grid,
@@ -16,6 +17,7 @@ import { useAccountListId } from 'src/hooks/useAccountListId';
1617
import { useLocale } from 'src/hooks/useLocale';
1718
import { currencyFormat, dateFormatShort } from 'src/lib/intlFormat';
1819
import { StatusCard } from '../../Shared/CalculationReports/StatusCard/StatusCard';
20+
import { useDuplicateMinistryHousingAllowanceRequestMutation } from '../MinisterHousingAllowance.generated';
1921
import { useMinisterHousingAllowance } from '../Shared/Context/MinisterHousingAllowanceContext';
2022
import { MHARequest } from './types';
2123

@@ -29,8 +31,16 @@ export const CurrentBoardApproved: React.FC<CurrentBoardApprovedProps> = ({
2931
const { t } = useTranslation();
3032
const locale = useLocale();
3133
const accountListId = useAccountListId();
34+
const router = useRouter();
3235
const currency = 'USD';
3336

37+
const [duplicateMHA] = useDuplicateMinistryHousingAllowanceRequestMutation({
38+
refetchQueries: [
39+
'MinistryHousingAllowanceRequests',
40+
'MinistryHousingAllowanceRequest',
41+
],
42+
});
43+
3444
const { isMarried, preferredName, spousePreferredName, requestId } =
3545
useMinisterHousingAllowance();
3646

@@ -39,6 +49,32 @@ export const CurrentBoardApproved: React.FC<CurrentBoardApprovedProps> = ({
3949

4050
const lastUpdated = request?.updatedAt ?? null;
4151

52+
const handleDuplicateRequest = async () => {
53+
if (!requestId) {
54+
return;
55+
}
56+
57+
try {
58+
const result = await duplicateMHA({
59+
variables: {
60+
input: {
61+
requestId: requestId,
62+
},
63+
},
64+
});
65+
66+
const newRequestId =
67+
result.data?.duplicateMinistryHousingAllowanceRequest
68+
?.ministryHousingAllowanceRequest?.id;
69+
70+
if (newRequestId) {
71+
router.push(
72+
`/accountLists/${accountListId}/reports/housingAllowance/${newRequestId}/edit`,
73+
);
74+
}
75+
} catch (error) {}
76+
};
77+
4278
return (
4379
<StatusCard
4480
formType={t('MHA Request')}
@@ -49,7 +85,7 @@ export const CurrentBoardApproved: React.FC<CurrentBoardApprovedProps> = ({
4985
linkOneText={t('View Current MHA')}
5086
linkOne={`/accountLists/${accountListId}/reports/housingAllowance/${requestId}/view`}
5187
linkTwoText={t('Update Current MHA')}
52-
linkTwo=""
88+
handleLinkTwo={handleDuplicateRequest}
5389
isRequest={false}
5490
handleConfirmCancel={() => {}}
5591
styling={{ p: 0 }}

src/components/Reports/Shared/CalculationReports/StatusCard/StatusCard.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ interface StatusCardProps {
3737
hideActions?: boolean;
3838
handleDownload?: () => void;
3939
handleConfirmCancel: () => void;
40+
handleLinkTwo?: () => void;
4041
styling?: SxProps<Theme>;
4142
}
4243

@@ -56,6 +57,7 @@ export const StatusCard: React.FC<StatusCardProps> = ({
5657
hideActions,
5758
handleDownload,
5859
handleConfirmCancel,
60+
handleLinkTwo,
5961
styling,
6062
}) => {
6163
const { t } = useTranslation();
@@ -119,8 +121,9 @@ export const StatusCard: React.FC<StatusCardProps> = ({
119121
{linkOneText}
120122
</Button>
121123
<Button
122-
component={NextLink}
123-
href={linkTwo ?? ''}
124+
component={linkTwo ? NextLink : 'button'}
125+
href={linkTwo ?? undefined}
126+
onClick={handleLinkTwo}
124127
variant={isRequest ? 'outlined' : 'contained'}
125128
sx={{ px: 2, py: 1 }}
126129
>

0 commit comments

Comments
 (0)