Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,12 @@ import { AdditionalSalaryRequestSection } from '../SharedComponents/AdditionalSa
import { SpouseComponent } from '../SharedComponents/SpouseComponent';

export const AboutForm: React.FC = () => {
const { currentIndex, requestData } = useAdditionalSalaryRequest();
const { currentIndex, calculations } = useAdditionalSalaryRequest();
const { t } = useTranslation();
const theme = useTheme();

const { name, accountNumber, primaryAccountBalance } = useFormUserInfo();
const individualCap =
requestData?.latestAdditionalSalaryRequest?.calculations.currentSalaryCap ??
0;
const individualCap = calculations?.currentSalaryCap ?? 0;

return (
<AdditionalSalaryRequestSection title={getHeader(currentIndex)}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,10 @@ describe('RequestPage', () => {
currentStep: AdditionalSalaryRequestSectionEnum.CompleteForm,
pageType: PageEnum.Edit,
setPageType: mockSetPageType,
calculations: {
currentSalaryCap: 50000,
staffAccountBalance: 0,
},
requestData: {
latestAdditionalSalaryRequest: {
status: AsrStatusEnum.Pending,
Expand Down Expand Up @@ -400,6 +404,9 @@ describe('RequestPage', () => {
currentIndex: 1,
currentStep: AdditionalSalaryRequestSectionEnum.CompleteForm,
pageType: PageEnum.New,
calculations: {
currentSalaryCap: 50,
},
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down Expand Up @@ -451,6 +458,14 @@ describe('RequestPage', () => {
lastName: 'Doe',
},
},
Comment on lines 307 to 460
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need these?

calculations: {
currentSalaryCap: 500,
combinedCap: 100000,
},
spouseCalculations: {
currentSalaryCap: 50000,
pendingAsrAmount: 100,
},
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down Expand Up @@ -509,6 +524,13 @@ describe('RequestPage', () => {
lastName: 'Doe',
},
},
calculations: {
currentSalaryCap: 500,
},
spouseCalculations: {
currentSalaryCap: 500,
pendingAsrAmount: 600,
},
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@
| 'staffAccountBalance'
| 'pendingAsrAmount'
>;
spouseCalculations?: Pick<
AdditionalSalaryRequestCalculations,
| 'currentSalaryCap'
| 'staffAccountBalance'
| 'pendingAsrAmount'
> | null;
user: HcmDataQuery['hcm'][0] | undefined;
spouse: HcmDataQuery['hcm'][1] | undefined;
salaryInfo: SalaryInfoQuery['salaryInfo'] | undefined;
Expand Down Expand Up @@ -241,7 +247,8 @@
setPageType,
handleDeleteRequest,
requestId: requestData?.latestAdditionalSalaryRequest?.id ?? requestId,
calculations: requestData?.latestAdditionalSalaryRequest?.calculations,
spouseCalculations: requestData?.latestAdditionalSalaryRequest?.spouseCalculations,

Check warning on line 251 in src/components/Reports/AdditionalSalaryRequest/Shared/AdditionalSalaryRequestContext.tsx

View check run for this annotation

CodeScene Delta Analysis / CodeScene Code Health Review (main)

❌ Getting worse: Complex Method

AdditionalSalaryRequestProvider:React.FC<Props> increases in cyclomatic complexity from 25 to 29, threshold = 10. This function has many conditional statements (e.g. if, for, while), leading to lower code health. Avoid adding more conditionals and code to it without refactoring.
user,
spouse,
salaryInfo,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ThemeProvider } from '@mui/material/styles';

Check notice on line 1 in src/components/Reports/AdditionalSalaryRequest/Shared/useAdditionalSalaryRequestForm.test.tsx

View check run for this annotation

CodeScene Delta Analysis / CodeScene Code Health Review (main)

✅ Getting better: Code Duplication

reduced similar code in: 'should enable reinitialize','should populate initial values from request data query','should validate additional info when exceedsCap is true'. Avoid duplicated, aka copy-pasted, code inside the module. More duplication lowers the code health.
import { act, renderHook, waitFor } from '@testing-library/react';
import { DeepPartial } from 'ts-essentials';
import { GqlMockedProvider } from '__tests__/util/graphqlMocking';
Expand Down Expand Up @@ -49,6 +49,11 @@
goToStep: jest.fn(),
isDrawerOpen: true,
toggleDrawer: jest.fn(),
calculations: {
currentSalaryCap: 100000,
staffAccountBalance: 50000,
pendingAsrAmount: 0,
},
requestData: {
latestAdditionalSalaryRequest: {
phoneNumber: '555-123-4567',
Expand Down Expand Up @@ -214,6 +219,8 @@
mockUseAdditionalSalaryRequest.mockReturnValue({
...defaultMockContextValue,
user: undefined,
requestData: undefined,
calculations: undefined,
});

const { result } = renderHook(() => useAdditionalSalaryRequestForm(), {
Expand Down Expand Up @@ -241,9 +248,15 @@
expect(result.current.values.phoneNumber).toBe('555-1234');
});

it('should populate initial values from request data query', async () => {
const mocks = {
AdditionalSalaryRequest: {
it('should populate initial values from request data in context', async () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
...defaultMockContextValue,
calculations: {
currentSalaryCap: 50000,
staffAccountBalance: 20000,
pendingAsrAmount: 0,
},
requestData: {
latestAdditionalSalaryRequest: {
id: 'test-request-id',
currentYearSalaryNotReceived: 500,
Expand All @@ -268,38 +281,44 @@
pendingAsrAmount: 0,
},
},
},
};

const { result } = renderHook(() => useAdditionalSalaryRequestForm(), {
wrapper: ({ children }) => (
<TestWrapper mocks={mocks}>{children}</TestWrapper>
),
} as unknown as AdditionalSalaryRequestQuery,
});

await waitFor(() => {
expect(result.current.values.currentYearSalaryNotReceived).toBe('500');
const { result } = renderHook(() => useAdditionalSalaryRequestForm(), {
wrapper: TestWrapper,
});

expect(result.current.values.currentYearSalaryNotReceived).toBe('500');
expect(result.current.values.previousYearSalaryNotReceived).toBe('200');
expect(result.current.values.phoneNumber).toBe('123-456-7890');
});

it('should send isSpouse variable to request query', async () => {
renderHook(() => useAdditionalSalaryRequestForm(), {
wrapper: TestWrapper,
it('should read isSpouse from context', async () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
...defaultMockContextValue,
isSpouse: false,
requestData: undefined,
calculations: undefined,
});

await waitFor(() => {
expect(mutationSpy).toHaveGraphqlOperation('AdditionalSalaryRequest', {
isSpouse: false,
});
const { result } = renderHook(() => useAdditionalSalaryRequestForm(), {
wrapper: TestWrapper,
});

// isSpouse=false should be used (no spouse mode)
expect(result.current.values).toBeDefined();
});
});

describe('validation', () => {
it('should require phone number', async () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
...defaultMockContextValue,
user: undefined,
requestData: undefined,
calculations: undefined,
});

const { result } = renderHook(() => useAdditionalSalaryRequestForm(), {
wrapper: TestWrapper,
});
Expand Down Expand Up @@ -461,6 +480,25 @@
});

it('should validate additional info when exceedsCap is true', async () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
...defaultMockContextValue,
calculations: {
currentSalaryCap: 50,
staffAccountBalance: 0,
pendingAsrAmount: 0,
},
requestData: {
latestAdditionalSalaryRequest: {
phoneNumber: '555-123-4567',
calculations: {
currentSalaryCap: 50,
staffAccountBalance: 0,
pendingAsrAmount: 0,
},
},
} as unknown as AdditionalSalaryRequestQuery,
});

const { result } = renderHook(
() =>
useAdditionalSalaryRequestForm({
Expand Down Expand Up @@ -691,9 +729,16 @@
expect(result.current.values.currentYearSalaryNotReceived).toBe('100');
});

it('should enable reinitialize', async () => {
const mocks = {
AdditionalSalaryRequest: {
it('should initialize from requestData in context', async () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
...defaultMockContextValue,
calculations: {
currentSalaryCap: 50000,
combinedCap: 50000,
staffAccountBalance: 20000,
pendingAsrAmount: 0,
},
requestData: {
latestAdditionalSalaryRequest: {
id: 'test-request-id',
currentYearSalaryNotReceived: 999,
Expand All @@ -718,18 +763,14 @@
staffAccountBalance: 20000,
},
},
},
};
} as unknown as AdditionalSalaryRequestQuery,
});

const { result } = renderHook(() => useAdditionalSalaryRequestForm(), {
wrapper: ({ children }) => (
<TestWrapper mocks={mocks}>{children}</TestWrapper>
),
wrapper: TestWrapper,
});

await waitFor(() => {
expect(result.current.values.currentYearSalaryNotReceived).toBe('999');
});
expect(result.current.values.currentYearSalaryNotReceived).toBe('999');
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import { amount, phoneNumber } from 'src/lib/yupHelpers';
import { CompleteFormValues } from '../AdditionalSalaryRequest';
import {
useAdditionalSalaryRequestQuery,
useSubmitAdditionalSalaryRequestMutation,
useUpdateAdditionalSalaryRequestMutation,
} from '../AdditionalSalaryRequest.generated';
Expand Down Expand Up @@ -77,17 +76,13 @@
salaryInfo,
isInternational,
requestId,
isSpouse,
calculations,
requestData,
} = useAdditionalSalaryRequest();

const { primaryAccountBalance } = useFormUserInfo();

const { data: requestData } = useAdditionalSalaryRequestQuery({
variables: { isSpouse },
});
const individualCap =
requestData?.latestAdditionalSalaryRequest?.calculations.currentSalaryCap ??
0;
const individualCap = calculations?.currentSalaryCap ?? 0;

Check notice on line 85 in src/components/Reports/AdditionalSalaryRequest/Shared/useAdditionalSalaryRequestForm.ts

View check run for this annotation

CodeScene Delta Analysis / CodeScene Code Health Review (main)

✅ Getting better: Complex Method

useAdditionalSalaryRequestForm decreases in cyclomatic complexity from 41 to 40, threshold = 9. This function has many conditional statements (e.g. if, for, while), leading to lower code health. Avoid adding more conditionals and code to it without refactoring.
Copy link
Copy Markdown
Contributor Author

@dr-bizz dr-bizz Apr 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are doing this in the context, which is why we don't need to call useAdditionalSalaryRequestQuery here


const [updateAdditionalSalaryRequest] =
useUpdateAdditionalSalaryRequestMutation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ const mockUseAdditionalSalaryRequest =
describe('useFormUserInfo', () => {
it('returns staff info and calculated balances', () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
calculations: {
currentSalaryCap: 100000,
staffAccountBalance: 40000,
},
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down Expand Up @@ -44,6 +48,7 @@ describe('useFormUserInfo', () => {

it('defaults balances to 0 when calculations are undefined', () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
calculations: undefined,
requestData: {
latestAdditionalSalaryRequest: {
calculations: undefined,
Expand All @@ -63,6 +68,10 @@ describe('useFormUserInfo', () => {

it('handles undefined user gracefully', () => {
mockUseAdditionalSalaryRequest.mockReturnValue({
calculations: {
currentSalaryCap: 100000,
staffAccountBalance: 40000,
},
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { useAdditionalSalaryRequest } from './AdditionalSalaryRequestContext';

export const useFormUserInfo = () => {
const { requestData, user } = useAdditionalSalaryRequest();
const { staffAccountBalance } =
requestData?.latestAdditionalSalaryRequest?.calculations || {};
const { calculations, user } = useAdditionalSalaryRequest();
const { staffAccountBalance } = calculations || {};
const {
emailAddress: email,
preferredName: name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,10 @@ describe('useSalaryCalculations', () => {
user: {
currentSalary: { grossSalaryAmount: 1000 },
},
calculations: {
currentSalaryCap: 5000,
pendingAsrAmount: 1000,
},
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down Expand Up @@ -262,6 +266,10 @@ describe('useSalaryCalculations', () => {
user: {
currentSalary: { grossSalaryAmount: 50000 },
},
calculations: {
currentSalaryCap: 10000,
pendingAsrAmount: 10000,
},
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down Expand Up @@ -305,6 +313,10 @@ describe('useSalaryCalculations', () => {
roth403bPercentage: 0.1,
user: { currentSalary: { grossSalaryAmount: 50000 } },
spouse: { currentSalary: { grossSalaryAmount: 40000 } },
calculations: {
currentSalaryCap: 70000,
},
spouseCalculations,
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down Expand Up @@ -403,6 +415,10 @@ describe('useSalaryCalculations', () => {
roth403bPercentage: 0.1,
user: { currentSalary: { grossSalaryAmount: 50000 } },
spouse: { currentSalary: { grossSalaryAmount: 40000 } },
calculations: {
currentSalaryCap: 60000,
},
spouseCalculations,
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down Expand Up @@ -548,6 +564,10 @@ describe('useSalaryCalculations', () => {
roth403bPercentage: 0.1,
user: { currentSalary: { grossSalaryAmount: 50000 } },
spouse: { currentSalary: { grossSalaryAmount: 40000 } },
calculations: {
currentSalaryCap: 55000,
},
spouseCalculations,
requestData: {
latestAdditionalSalaryRequest: {
calculations: {
Expand Down Expand Up @@ -644,6 +664,7 @@ describe('useSalaryCalculations', () => {
roth403bPercentage: 0.1,
user: { currentSalary: { grossSalaryAmount: 50000 } },
spouse: undefined,
calculations: { currentSalaryCap: cap },
requestData: {
latestAdditionalSalaryRequest: {
calculations: { currentSalaryCap: cap },
Expand Down
Loading
Loading