From 134b46ea7e467a29f9d0820c36dd33af2a765b38 Mon Sep 17 00:00:00 2001 From: Tore Brede <tore.brede@uib.no> Date: Tue, 16 Aug 2022 15:25:58 +0200 Subject: [PATCH] GREG-264: Remembering gender when going back in wizard --- .../src/routes/guest/register/index.test.tsx | 95 +++++++++++++++++-- frontend/src/routes/guest/register/index.tsx | 2 +- .../routes/guest/register/steps/register.tsx | 8 +- 3 files changed, 95 insertions(+), 10 deletions(-) diff --git a/frontend/src/routes/guest/register/index.test.tsx b/frontend/src/routes/guest/register/index.test.tsx index 883f9a5c..ed7f8d1e 100644 --- a/frontend/src/routes/guest/register/index.test.tsx +++ b/frontend/src/routes/guest/register/index.test.tsx @@ -6,7 +6,9 @@ import { BrowserRouter } from 'react-router-dom' import { render, screen } from 'test-utils' import { FeatureContext } from 'contexts' +import { fireEvent } from '@testing-library/react' import GuestRegister from './index' +import { waitFor } from '../../../test-utils' enableFetchMocks() @@ -42,7 +44,7 @@ const allFeaturesOn = { test('Field showing values correctly', async () => { fetchMock.mockIf('/api/ui/v1/invited/', () => - Promise.resolve<any>(JSON.stringify(testData)) + Promise.resolve<any>(JSON.stringify(testData)), ) render( @@ -52,7 +54,7 @@ test('Field showing values correctly', async () => { <GuestRegister /> </LocalizationProvider> </FeatureContext.Provider> - </BrowserRouter> + </BrowserRouter>, ) await screen.findByDisplayValue(testData.person.first_name) @@ -77,7 +79,7 @@ test('Field showing values correctly', async () => { // TODO Haven't been able to mock getting role types properly yet, so not checking role name // await screen.findByDisplayValue(testData.role.name_en) await screen.findByDisplayValue( - `${testData.role.start} - ${testData.role.end}` + `${testData.role.start} - ${testData.role.end}`, ) // For the default setup the contact person at unit field should be showing @@ -89,7 +91,7 @@ test('Gender and birth date suggestions not showing if no national ID given', as // @ts-ignore testData.person.fnr = null fetchMock.mockIf('/api/ui/v1/invited/', () => - Promise.resolve<any>(JSON.stringify(testData)) + Promise.resolve<any>(JSON.stringify(testData)), ) render( <BrowserRouter> @@ -98,7 +100,7 @@ test('Gender and birth date suggestions not showing if no national ID given', as <GuestRegister /> </LocalizationProvider> </FeatureContext.Provider> - </BrowserRouter> + </BrowserRouter>, ) // Wait a bit so that all the values are showing @@ -124,7 +126,7 @@ test('Gender and birth date suggestions not overriding existing values', async ( testData.person.gender = 'female' fetchMock.mockIf('/api/ui/v1/invited/', () => - Promise.resolve<any>(JSON.stringify(testData)) + Promise.resolve<any>(JSON.stringify(testData)), ) render( <BrowserRouter> @@ -133,7 +135,7 @@ test('Gender and birth date suggestions not overriding existing values', async ( <GuestRegister /> </LocalizationProvider> </FeatureContext.Provider> - </BrowserRouter> + </BrowserRouter>, ) // In this a date of birth was already set, and it should not have been overridden by a suggestion @@ -143,3 +145,82 @@ test('Gender and birth date suggestions not overriding existing values', async ( // Check that the gender has not been overridden await screen.findByDisplayValue('female') }) + + +test('Gender is remembered when going back', async () => { + testData.person.fnr = '' + // @ts-ignore + testData.person.date_of_birth = '2002-08-20' + testData.person.passport = 'NO-12345678' + + fetchMock.mockIf('/api/ui/v1/invited/', () => + Promise.resolve<any>(JSON.stringify(testData))) + + render( + <BrowserRouter> + <FeatureContext.Provider value={allFeaturesOn}> + <LocalizationProvider dateAdapter={AdapterDateFns}> + <GuestRegister /> + </LocalizationProvider> + </FeatureContext.Provider> + </BrowserRouter>, + ) + + // Wait for data to be visible + await screen.findByDisplayValue(testData.person.first_name) + + // Set gender to male + const genderInput = screen.getByTestId('gender-select-inner') + fireEvent.change(genderInput, { target: { value: 'male' } }) + await waitFor(() => screen.getByText('input.male')) + + // Go forward and then back in wizard + const nextButton = screen.getByTestId('button-next') + nextButton.click() + await screen.findByTestId('button-back') + const backButton = screen.getByTestId('button-back') + backButton.click() + + // The selection should still be male + await waitFor(() => screen.getByText('input.male')) +}) + +test('Gender not required when gender field is not shown', async () => { + testData.person.fnr = '' + // @ts-ignore + testData.person.date_of_birth = '2002-08-20' + testData.person.passport = 'NO-12345678' + + fetchMock.mockIf('/api/ui/v1/invited/', () => + Promise.resolve<any>(JSON.stringify(testData))) + + const genderFieldOff = { + displayContactAtUnit: true, + displayComment: true, + displayContactAtUnitGuestInput: true, + showGenderFieldForGuest: false, + } + + render( + <BrowserRouter> + <FeatureContext.Provider value={genderFieldOff}> + <LocalizationProvider dateAdapter={AdapterDateFns}> + <GuestRegister /> + </LocalizationProvider> + </FeatureContext.Provider> + </BrowserRouter>, + ) + + // Wait for data to be visible + await screen.findByDisplayValue(testData.person.first_name) + + // No gender is set, but it should still be possible + // to go forward and back in wizard + let nextButton = screen.getByTestId('button-next') + nextButton.click() + await screen.findByTestId('button-back') + const backButton = screen.getByTestId('button-back') + backButton.click() + nextButton = screen.getByTestId('button-next') + nextButton.click() +}) diff --git a/frontend/src/routes/guest/register/index.tsx b/frontend/src/routes/guest/register/index.tsx index ce03d0e2..b7a2d093 100644 --- a/frontend/src/routes/guest/register/index.tsx +++ b/frontend/src/routes/guest/register/index.tsx @@ -431,7 +431,7 @@ export default function GuestRegister() { )} {activeStep === Step.ConsentStep && ( <Button - data-testid="button-black" + data-testid="button-back" color="secondary" sx={{ mr: 1 }} onClick={handleBack} diff --git a/frontend/src/routes/guest/register/steps/register.tsx b/frontend/src/routes/guest/register/steps/register.tsx index 2cca718c..00c6a596 100644 --- a/frontend/src/routes/guest/register/steps/register.tsx +++ b/frontend/src/routes/guest/register/steps/register.tsx @@ -265,11 +265,12 @@ const GuestRegisterStep = forwardRef( setValue('mobilePhoneCountry', defaultCountryCode) } - if (gender !== '') { + if (registerData?.gender) { // Need to set gender in the state and also in the form. This is // to handle the case where the gender is suggested by the // national ID number - setValue('gender', gender) + setValue('gender', registerData.gender) + setGender(registerData.gender) } }, [registerData]) @@ -426,6 +427,9 @@ const GuestRegisterStep = forwardRef( } return t(`input.${selected}`) }} + inputProps={{ + 'data-testid': 'gender-select-inner', + }} > {/* Keep it simple and hardcode the gender values */} <MenuItem disabled value=""> -- GitLab