Skip to content
Snippets Groups Projects
Commit 2fa67877 authored by Tore.Brede's avatar Tore.Brede
Browse files

GREG-283: Fixing issue where default value for mobile country code was set on every rerender

parent 6a1948b3
No related branches found
No related tags found
1 merge request!335GREG-283: Fixing issue where default value for mobile country code was set on every rerender
Pipeline #142927 failed
...@@ -9,6 +9,8 @@ import GuestRegisterStep from './register' ...@@ -9,6 +9,8 @@ import GuestRegisterStep from './register'
import { GuestRegisterData } from '../enteredGuestData' import { GuestRegisterData } from '../enteredGuestData'
import AuthenticationMethod from '../authenticationMethod' import AuthenticationMethod from '../authenticationMethod'
import { GuestInviteInformation } from '../guestDataForm' import { GuestInviteInformation } from '../guestDataForm'
import userEvent from '@testing-library/user-event'
import { fireEvent } from '@testing-library/react'
function getEmptyGuestData(): GuestInviteInformation { function getEmptyGuestData(): GuestInviteInformation {
return { return {
...@@ -43,7 +45,7 @@ test('Guest register page showing passport field on manual registration', async ...@@ -43,7 +45,7 @@ test('Guest register page showing passport field on manual registration', async
initialGuestData={getEmptyGuestData()} initialGuestData={getEmptyGuestData()}
registerData={null} registerData={null}
/> />
</LocalizationProvider> </LocalizationProvider>,
) )
await waitFor(() => { await waitFor(() => {
...@@ -68,7 +70,7 @@ test('Name not editable if present and invite is Feide', async () => { ...@@ -68,7 +70,7 @@ test('Name not editable if present and invite is Feide', async () => {
initialGuestData={testData} initialGuestData={testData}
registerData={null} registerData={null}
/> />
</LocalizationProvider> </LocalizationProvider>,
) )
await waitFor(() => { await waitFor(() => {
...@@ -92,7 +94,7 @@ test('Name editable if missing and invite is Feide', async () => { ...@@ -92,7 +94,7 @@ test('Name editable if missing and invite is Feide', async () => {
initialGuestData={testData} initialGuestData={testData}
registerData={null} registerData={null}
/> />
</LocalizationProvider> </LocalizationProvider>,
) )
await waitFor(() => { await waitFor(() => {
...@@ -117,7 +119,7 @@ test('Identifier fields disabled if invite is Feide and national ID present', as ...@@ -117,7 +119,7 @@ test('Identifier fields disabled if invite is Feide and national ID present', as
initialGuestData={testData} initialGuestData={testData}
registerData={null} registerData={null}
/> />
</LocalizationProvider> </LocalizationProvider>,
) )
await waitFor(() => { await waitFor(() => {
...@@ -143,7 +145,7 @@ test('Identifier fields enabled if invite is Feide but national ID number missin ...@@ -143,7 +145,7 @@ test('Identifier fields enabled if invite is Feide but national ID number missin
initialGuestData={testData} initialGuestData={testData}
registerData={null} registerData={null}
/> />
</LocalizationProvider> </LocalizationProvider>,
) )
await waitFor(() => { await waitFor(() => {
...@@ -169,7 +171,7 @@ test('Identifier fields disabled and name fields enabled if invite is ID-porten' ...@@ -169,7 +171,7 @@ test('Identifier fields disabled and name fields enabled if invite is ID-porten'
initialGuestData={testData} initialGuestData={testData}
registerData={null} registerData={null}
/> />
</LocalizationProvider> </LocalizationProvider>,
) )
await waitFor(() => { await waitFor(() => {
...@@ -222,14 +224,14 @@ test('Gender required to be set if gender field is showing', async () => { ...@@ -222,14 +224,14 @@ test('Gender required to be set if gender field is showing', async () => {
ref={reference} ref={reference}
/> />
</LocalizationProvider> </LocalizationProvider>
</FeatureContext.Provider> </FeatureContext.Provider>,
) )
reference.current?.doSubmit() reference.current?.doSubmit()
// The validation should fail for gender since to value has been set // The validation should fail for gender since to value has been set
const validationMessage = await waitFor(() => const validationMessage = await waitFor(() =>
screen.getByText('validation.genderIsRequired') screen.getByText('validation.genderIsRequired'),
) )
expect(validationMessage).toBeInTheDocument() expect(validationMessage).toBeInTheDocument()
}) })
...@@ -275,19 +277,19 @@ test('Gender not required to be set if gender field is not showing', async () => ...@@ -275,19 +277,19 @@ test('Gender not required to be set if gender field is not showing', async () =>
ref={reference} ref={reference}
/> />
</LocalizationProvider> </LocalizationProvider>
</FeatureContext.Provider> </FeatureContext.Provider>,
) )
reference.current?.doSubmit() reference.current?.doSubmit()
await waitFor( await waitFor(
() => { () => {
expect( expect(
screen.queryByText('validation.genderIsRequired') screen.queryByText('validation.genderIsRequired'),
).not.toBeInTheDocument() ).not.toBeInTheDocument()
}, },
{ {
timeout: 5000, timeout: 5000,
} },
) )
}) })
...@@ -334,7 +336,7 @@ test('Guest not allowed to proceed in wizard if phone number is not valid', asyn ...@@ -334,7 +336,7 @@ test('Guest not allowed to proceed in wizard if phone number is not valid', asyn
ref={reference} ref={reference}
/> />
</LocalizationProvider> </LocalizationProvider>
</FeatureContext.Provider> </FeatureContext.Provider>,
) )
await act(async () => reference.current?.doSubmit()) await act(async () => reference.current?.doSubmit())
...@@ -385,7 +387,7 @@ test('Guest allowed to proceed in wizard if data is valid', async () => { ...@@ -385,7 +387,7 @@ test('Guest allowed to proceed in wizard if data is valid', async () => {
ref={reference} ref={reference}
/> />
</LocalizationProvider> </LocalizationProvider>
</FeatureContext.Provider> </FeatureContext.Provider>,
) )
await act(async () => reference.current?.doSubmit()) await act(async () => reference.current?.doSubmit())
...@@ -452,3 +454,69 @@ test('Default country code gets set in form values', async () => { ...@@ -452,3 +454,69 @@ test('Default country code gets set in form values', async () => {
// @ts-ignore // @ts-ignore
expect(guestRegisterData.mobilePhoneCountry).toEqual('NO') expect(guestRegisterData.mobilePhoneCountry).toEqual('NO')
}) })
test('Foreign country code gets set in form values', async () => {
// This stores the data sent from the form when the user clicks submit
let guestRegisterData: GuestRegisterData | null = null
const nextHandler = (registerData: GuestRegisterData) => {
guestRegisterData = registerData
}
// +393892778451
const allFeaturesOn = {
displayContactAtUnit: true,
displayComment: true,
displayContactAtUnitGuestInput: true,
showGenderFieldForGuest: true,
}
const formData: GuestRegisterData = {
firstName: 'Test',
lastName: 'Test2',
mobilePhoneCountry: '',
mobilePhone: '3892778472',
nationalIdNumber: '',
passportNumber: '123456',
passportNationality: 'IT',
dateOfBirth: addYears(-20)(new Date()),
gender: 'male',
}
const testData = getEmptyGuestData()
testData.gender = 'male'
const submitMock = jest.fn()
// Need this to be able to call on the submit-method on the form
const reference = {
current: {
doSubmit: submitMock,
},
}
render(
<FeatureContext.Provider value={allFeaturesOn}>
<LocalizationProvider dateAdapter={AdapterDateFns}>
<GuestRegisterStep
nextHandler={nextHandler}
initialGuestData={testData}
registerData={formData}
ref={reference}
/>
</LocalizationProvider>
</FeatureContext.Provider>,
)
const countryCodeInput = screen.getByTestId('phone-country-code-select-inner')
fireEvent.change(countryCodeInput, { target: { value: 'IT' } })
expect(guestRegisterData).toBeNull()
await act(async () => reference.current?.doSubmit())
// Check that the mobile phone country code has been set to what was entered
// @ts-ignore
expect(guestRegisterData.mobilePhoneCountry).toEqual('IT')
})
...@@ -65,7 +65,7 @@ const GuestRegisterStep = forwardRef( ...@@ -65,7 +65,7 @@ const GuestRegisterStep = forwardRef(
const [countryCode, setCountryCode] = useState<CountryCallingCode>(defaultCountryCode) const [countryCode, setCountryCode] = useState<CountryCallingCode>(defaultCountryCode)
const [passportNationality, setPassportNationality] = useState< const [passportNationality, setPassportNationality] = useState<
string | undefined string | undefined
>(undefined) >(undefined)
// Set suggestion for the gender field if gender is not already given in the input // Set suggestion for the gender field if gender is not already given in the input
const [gender, setGender] = useState<string>( const [gender, setGender] = useState<string>(
...@@ -107,17 +107,6 @@ const GuestRegisterStep = forwardRef( ...@@ -107,17 +107,6 @@ const GuestRegisterStep = forwardRef(
} }
} }
if (!registerData || !registerData.mobilePhoneCountry) {
// If there is no country code set in the registered data
// then set the default value. This is necessary even though
// the country code is set in a state variable above, because
// that does not cause the country code to be added to the
// form values by itself. If it was not set here it would be
// blank in the form even though the default value is shown
// in the select menu
setValue('mobilePhoneCountry', defaultCountryCode)
}
const validatePhoneNumber = ( const validatePhoneNumber = (
countryCodeCallingCode: CountryCallingCode | undefined, countryCodeCallingCode: CountryCallingCode | undefined,
phoneNumberToValidate: string phoneNumberToValidate: string
...@@ -141,7 +130,7 @@ const GuestRegisterStep = forwardRef( ...@@ -141,7 +130,7 @@ const GuestRegisterStep = forwardRef(
// it is necessary to do another pass here to make sure the phone number entered // it is necessary to do another pass here to make sure the phone number entered
// really is valid // really is valid
const validationMessage = validatePhoneNumber( const validationMessage = validatePhoneNumber(
countryCode, data.mobilePhoneCountry,
data.mobilePhone data.mobilePhone
) )
...@@ -215,10 +204,10 @@ const GuestRegisterStep = forwardRef( ...@@ -215,10 +204,10 @@ const GuestRegisterStep = forwardRef(
const handleCountryCodeChange = (event: SelectChangeEvent) => { const handleCountryCodeChange = (event: SelectChangeEvent) => {
// There should always be a value in the event since it is // There should always be a value in the event since it is
// not possible to select a blank field in the select menu // not possible to select a blank field in the select menu
// for country codes // for country code
const countryCodeType = event.target.value as CountryCode const countryCodeType = event.target.value as CountryCode
setCountryCode(countryCodeType) setCountryCode(countryCodeType)
setValue('mobilePhoneCountry', countryCodeType) setValue('mobilePhoneCountry', countryCodeType, { shouldDirty: true, shouldTouch: true })
} }
const handleMobilePhoneChange = (value: any) => { const handleMobilePhoneChange = (value: any) => {
...@@ -263,8 +252,17 @@ const GuestRegisterStep = forwardRef( ...@@ -263,8 +252,17 @@ const GuestRegisterStep = forwardRef(
if (registerData?.passportNationality) { if (registerData?.passportNationality) {
setPassportNationality(registerData.passportNationality) setPassportNationality(registerData.passportNationality)
} }
// Need to set both country code in state and in form
// because of the way the validation and form handling is done.
// It would be cleaner if it somehow is possible to only
// have the value in the form
if (registerData?.mobilePhoneCountry) { if (registerData?.mobilePhoneCountry) {
setCountryCode(registerData.mobilePhoneCountry) setCountryCode(registerData.mobilePhoneCountry)
setValue('mobilePhoneCountry', registerData.mobilePhoneCountry)
}
else {
setCountryCode(defaultCountryCode)
setValue('mobilePhoneCountry', defaultCountryCode)
} }
if (gender !== '') { if (gender !== '') {
...@@ -552,6 +550,7 @@ const GuestRegisterStep = forwardRef( ...@@ -552,6 +550,7 @@ const GuestRegisterStep = forwardRef(
helperText={ helperText={
errors.mobilePhone && errors.mobilePhone.message errors.mobilePhone && errors.mobilePhone.message
} }
data-testid="mobile-phone-number-input"
onChange={handleMobilePhoneChange} onChange={handleMobilePhoneChange}
/> />
)} )}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment