From 68cbbf61cdadb43e7e0151c5e0d56bf552065f8a Mon Sep 17 00:00:00 2001
From: Tore Brede <Tore.Brede@uib.no>
Date: Thu, 13 Jan 2022 13:51:16 +0100
Subject: [PATCH] GREG-165: Adding some more rules for when fields should be
 visible

---
 .../routes/guest/register/steps/formSetup.ts  |  5 +-
 .../guest/register/steps/register.test.tsx    | 52 +++++++++++++++++++
 .../routes/guest/register/steps/register.tsx  | 33 ++++++++----
 3 files changed, 78 insertions(+), 12 deletions(-)

diff --git a/frontend/src/routes/guest/register/steps/formSetup.ts b/frontend/src/routes/guest/register/steps/formSetup.ts
index e6484dca..2bee52f9 100644
--- a/frontend/src/routes/guest/register/steps/formSetup.ts
+++ b/frontend/src/routes/guest/register/steps/formSetup.ts
@@ -3,6 +3,7 @@
  * the form needs to enable and disable fields.
  */
 export type FormSetup = {
-  allow_first_name_editable: boolean
-  allow_last_name_editable: boolean
+  allowFirstNameEditable: boolean
+  allowLastNameEditable: boolean
+  disableIdentifierFields: boolean
 }
diff --git a/frontend/src/routes/guest/register/steps/register.test.tsx b/frontend/src/routes/guest/register/steps/register.test.tsx
index a530ba37..8ffcf440 100644
--- a/frontend/src/routes/guest/register/steps/register.test.tsx
+++ b/frontend/src/routes/guest/register/steps/register.test.tsx
@@ -97,3 +97,55 @@ test('Name editable if missing and invite is Feide', async () => {
     expect(screen.queryByTestId('last-name-input-text')).toBeEnabled()
   })
 })
+
+test('Identifier fields disabled if invite if Feide and national ID present', async () => {
+  const nextHandler = (registerData: GuestRegisterData) => {
+    console.log(`Entered data: ${registerData}`)
+  }
+
+  const testData = getEmptyGuestData()
+  testData.authentication_method = AuthenticationMethod.Feide
+  testData.fnr = '12042335418'
+
+  render(
+    <LocalizationProvider dateAdapter={AdapterDateFns}>
+      <GuestRegisterStep
+        nextHandler={nextHandler}
+        initialGuestData={testData}
+        registerData={null}
+      />
+    </LocalizationProvider>
+  )
+
+  await waitFor(() => {
+    expect(screen.queryByTestId('national-id-number-input')).toBeDisabled()
+    expect(screen.queryByTestId('passport_number_input')).toBeDisabled()
+    expect(screen.queryByTestId('passport-nationality-input')).toBeDisabled()
+  })
+})
+
+test('Identifier fields enabled if invite if Feide but national ID number missing', async () => {
+  const nextHandler = (registerData: GuestRegisterData) => {
+    console.log(`Entered data: ${registerData}`)
+  }
+
+  const testData = getEmptyGuestData()
+  testData.authentication_method = AuthenticationMethod.Feide
+  testData.fnr = ''
+
+  render(
+    <LocalizationProvider dateAdapter={AdapterDateFns}>
+      <GuestRegisterStep
+        nextHandler={nextHandler}
+        initialGuestData={testData}
+        registerData={null}
+      />
+    </LocalizationProvider>
+  )
+
+  await waitFor(() => {
+    expect(screen.queryByTestId('national-id-number-input')).toBeEnabled()
+    expect(screen.queryByTestId('passport_number_input')).toBeEnabled()
+    expect(screen.queryByTestId('passport-nationality-input')).toBeEnabled()
+  })
+})
diff --git a/frontend/src/routes/guest/register/steps/register.tsx b/frontend/src/routes/guest/register/steps/register.tsx
index 84ec3886..a07cf65d 100644
--- a/frontend/src/routes/guest/register/steps/register.tsx
+++ b/frontend/src/routes/guest/register/steps/register.tsx
@@ -225,14 +225,21 @@ const GuestRegisterStep = forwardRef(
       )
 
     const formSetup: FormSetup = {
-      allow_first_name_editable:
+      allowFirstNameEditable:
         initialGuestData.authentication_method ===
           AuthenticationMethod.Invite ||
         initialGuestData.first_name.length === 0,
-      allow_last_name_editable:
+      allowLastNameEditable:
         initialGuestData.authentication_method ===
           AuthenticationMethod.Invite ||
         initialGuestData.last_name.length === 0,
+      // If there is a national ID number (presumably from Feide),
+      // already present, then do not allow the user to change the data
+      // in the identifier fields
+      disableIdentifierFields:
+        initialGuestData.authentication_method === AuthenticationMethod.Feide &&
+        initialGuestData.fnr !== null &&
+        initialGuestData.fnr?.length !== 0,
     }
 
     return (
@@ -267,7 +274,7 @@ const GuestRegisterStep = forwardRef(
                     onChange={onChange}
                     error={!!errors.firstName}
                     helperText={errors.firstName && errors.firstName.message}
-                    disabled={!formSetup.allow_first_name_editable}
+                    disabled={!formSetup.allowFirstNameEditable}
                     inputProps={{
                       'data-testid': 'first-name-input-text',
                     }}
@@ -289,7 +296,7 @@ const GuestRegisterStep = forwardRef(
                     onChange={onChange}
                     error={!!errors.lastName}
                     helperText={errors.lastName && errors.lastName.message}
-                    disabled={!formSetup.allow_last_name_editable}
+                    disabled={!formSetup.allowLastNameEditable}
                     inputProps={{
                       'data-testid': 'last-name-input-text',
                     }}
@@ -495,6 +502,10 @@ const GuestRegisterStep = forwardRef(
                     helperText={
                       errors.nationalIdNumber && errors.nationalIdNumber.message
                     }
+                    disabled={formSetup.disableIdentifierFields}
+                    inputProps={{
+                      'data-testid': 'national-id-number-input',
+                    }}
                   />
                 )}
               />
@@ -522,6 +533,10 @@ const GuestRegisterStep = forwardRef(
                     }
                     return selected
                   }}
+                  disabled={formSetup.disableIdentifierFields}
+                  inputProps={{
+                    'data-testid': 'passport-nationality-input',
+                  }}
                 >
                   <MenuItem disabled value="">
                     {t('input.passportNationality')}
@@ -538,15 +553,13 @@ const GuestRegisterStep = forwardRef(
                   render={({ field }) => (
                     <TextField
                       id="passportNumber"
-                      data-testid="passport_number_input"
+                      inputProps={{
+                        'data-testid': 'passport_number_input',
+                      }}
                       value={field.value}
                       label={t('input.passportNumber')}
                       onChange={field.onChange}
-                      disabled={
-                        initialGuestData.authentication_method !==
-                          AuthenticationMethod.Invite &&
-                        initialGuestData.passport !== null
-                      }
+                      disabled={formSetup.disableIdentifierFields}
                     />
                   )}
                 />
-- 
GitLab