20913: Fix test to check that use profile gets saved 20913-user-profile
authorPeter Amstutz <peter.amstutz@curii.com>
Wed, 30 Aug 2023 20:23:33 +0000 (16:23 -0400)
committerPeter Amstutz <peter.amstutz@curii.com>
Wed, 30 Aug 2023 20:23:33 +0000 (16:23 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curii.com>

cypress/integration/user-profile.spec.js
src/store/user-profile/user-profile-actions.ts

index d91dbb0bc5bf4a49f98e7ffd256b2df31248edfb..0a06eaf361ba97763ba20d4730001c3b26e93378 100644 (file)
@@ -145,6 +145,8 @@ describe('User profile tests', function() {
             website: 'example.com',
         });
 
+        cy.get('[data-cy=profile-form] button[type="submit"]').should('not.be.disabled');
+
         // Submit
         cy.get('[data-cy=profile-form] button[type="submit"]').click();
 
@@ -159,6 +161,9 @@ describe('User profile tests', function() {
             role: 'Data Scientist',
             website: 'example.com',
         });
+
+        // if it worked, the save button should be disabled.
+        cy.get('[data-cy=profile-form] button[type="submit"]').should('be.disabled');
     });
 
     it('non-admin cannot edit other profile', function() {
index 9935518b98286e083ca29df33f8390a03e5e23b8..44b17c6045b2c6f9fc790f0ea27d270ac5079232 100644 (file)
@@ -29,149 +29,149 @@ export const getCurrentUserProfilePanelUuid = getProperty<string>(USER_PROFILE_P
 export const getUserProfileIsInaccessible = getProperty<boolean>(IS_PROFILE_INACCESSIBLE);
 
 export const loadUserProfilePanel = (userUuid?: string) =>
-  async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
-    // Reset isInacessible to ensure error screen is hidden
-    dispatch(propertiesActions.SET_PROPERTY({ key: IS_PROFILE_INACCESSIBLE, value: false }));
-    // Get user uuid from route or use current user uuid
-    const uuid = userUuid || getState().auth.user?.uuid;
-    if (uuid) {
-      await dispatch(propertiesActions.SET_PROPERTY({ key: USER_PROFILE_PANEL_ID, value: uuid }));
-      try {
-        const user = await services.userService.get(uuid, false);
-        dispatch(initialize(USER_PROFILE_FORM, user));
-        dispatch(updateResources([user]));
-        dispatch(UserProfileGroupsActions.REQUEST_ITEMS());
-      } catch (e) {
-        if (e.status === 404) {
-          await dispatch(propertiesActions.SET_PROPERTY({ key: IS_PROFILE_INACCESSIBLE, value: true }));
-          dispatch(reset(USER_PROFILE_FORM));
-        } else {
-          dispatch(snackbarActions.OPEN_SNACKBAR({
-            message: 'Could not load user profile',
-            kind: SnackbarKind.ERROR
-          }));
+    async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+        // Reset isInacessible to ensure error screen is hidden
+        dispatch(propertiesActions.SET_PROPERTY({ key: IS_PROFILE_INACCESSIBLE, value: false }));
+        // Get user uuid from route or use current user uuid
+        const uuid = userUuid || getState().auth.user?.uuid;
+        if (uuid) {
+            await dispatch(propertiesActions.SET_PROPERTY({ key: USER_PROFILE_PANEL_ID, value: uuid }));
+            try {
+                const user = await services.userService.get(uuid, false, ["uuid", "first_name", "last_name", "email", "username", "prefs", "is_admin", "is_active"]);
+                dispatch(initialize(USER_PROFILE_FORM, user));
+                dispatch(updateResources([user]));
+                dispatch(UserProfileGroupsActions.REQUEST_ITEMS());
+            } catch (e) {
+                if (e.status === 404) {
+                    await dispatch(propertiesActions.SET_PROPERTY({ key: IS_PROFILE_INACCESSIBLE, value: true }));
+                    dispatch(reset(USER_PROFILE_FORM));
+                } else {
+                    dispatch(snackbarActions.OPEN_SNACKBAR({
+                        message: 'Could not load user profile',
+                        kind: SnackbarKind.ERROR
+                    }));
+                }
+            }
         }
-      }
     }
-  }
 
 export const saveEditedUser = (resource: any) =>
-  async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
-      try {
-          const user = await services.userService.update(resource.uuid, resource);
-          dispatch(updateResources([user]));
-          dispatch(initialize(USER_PROFILE_FORM, user));
-          dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Profile has been updated.", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
-      } catch (e) {
-          dispatch(snackbarActions.OPEN_SNACKBAR({
-              message: "Could not update profile",
-              kind: SnackbarKind.ERROR,
-          }));
-      }
-  };
+    async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+        try {
+            const user = await services.userService.update(resource.uuid, resource);
+            dispatch(updateResources([user]));
+            dispatch(initialize(USER_PROFILE_FORM, user));
+            dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Profile has been updated.", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
+        } catch (e) {
+            dispatch(snackbarActions.OPEN_SNACKBAR({
+                message: "Could not update profile",
+                kind: SnackbarKind.ERROR,
+            }));
+        }
+    };
 
 export const openSetupDialog = (uuid: string) =>
-  (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
-    dispatch(dialogActions.OPEN_DIALOG({
-      id: SETUP_DIALOG,
-      data: {
-        title: 'Setup user',
-        text: 'Are you sure you want to setup this user?',
-        confirmButtonLabel: 'Confirm',
-        uuid
-      }
-    }));
-  };
+    (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+        dispatch(dialogActions.OPEN_DIALOG({
+            id: SETUP_DIALOG,
+            data: {
+                title: 'Setup user',
+                text: 'Are you sure you want to setup this user?',
+                confirmButtonLabel: 'Confirm',
+                uuid
+            }
+        }));
+    };
 
 export const openActivateDialog = (uuid: string) =>
-  (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
-    dispatch(dialogActions.OPEN_DIALOG({
-      id: ACTIVATE_DIALOG,
-      data: {
-        title: 'Activate user',
-        text: 'Are you sure you want to activate this user?',
-        confirmButtonLabel: 'Confirm',
-        uuid
-      }
-    }));
-  };
+    (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+        dispatch(dialogActions.OPEN_DIALOG({
+            id: ACTIVATE_DIALOG,
+            data: {
+                title: 'Activate user',
+                text: 'Are you sure you want to activate this user?',
+                confirmButtonLabel: 'Confirm',
+                uuid
+            }
+        }));
+    };
 
 export const openDeactivateDialog = (uuid: string) =>
-  (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
-    dispatch(dialogActions.OPEN_DIALOG({
-      id: DEACTIVATE_DIALOG,
-      data: {
-        title: 'Deactivate user',
-        text: 'Are you sure you want to deactivate this user?',
-        confirmButtonLabel: 'Confirm',
-        uuid
-      }
-    }));
-  };
+    (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+        dispatch(dialogActions.OPEN_DIALOG({
+            id: DEACTIVATE_DIALOG,
+            data: {
+                title: 'Deactivate user',
+                text: 'Are you sure you want to deactivate this user?',
+                confirmButtonLabel: 'Confirm',
+                uuid
+            }
+        }));
+    };
 
 export const setup = (uuid: string) =>
-  async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
-    try {
-      const resources = await services.userService.setup(uuid);
-      dispatch(updateResources(resources.items));
-
-      // Refresh data explorer
-      dispatch(UserProfileGroupsActions.REQUEST_ITEMS());
-
-      dispatch(snackbarActions.OPEN_SNACKBAR({ message: "User has been setup", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
-    } catch (e) {
-      dispatch(snackbarActions.OPEN_SNACKBAR({ message: e.message, hideDuration: 2000, kind: SnackbarKind.ERROR }));
-    } finally {
-      dispatch(dialogActions.CLOSE_DIALOG({ id: SETUP_DIALOG }));
-    }
-  };
+    async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+        try {
+            const resources = await services.userService.setup(uuid);
+            dispatch(updateResources(resources.items));
+
+            // Refresh data explorer
+            dispatch(UserProfileGroupsActions.REQUEST_ITEMS());
+
+            dispatch(snackbarActions.OPEN_SNACKBAR({ message: "User has been setup", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
+        } catch (e) {
+            dispatch(snackbarActions.OPEN_SNACKBAR({ message: e.message, hideDuration: 2000, kind: SnackbarKind.ERROR }));
+        } finally {
+            dispatch(dialogActions.CLOSE_DIALOG({ id: SETUP_DIALOG }));
+        }
+    };
 
 export const activate = (uuid: string) =>
-  async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
-    try {
-      const user = await services.userService.activate(uuid);
-      dispatch(updateResources([user]));
+    async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+        try {
+            const user = await services.userService.activate(uuid);
+            dispatch(updateResources([user]));
 
-      // Refresh data explorer
-      dispatch(UserProfileGroupsActions.REQUEST_ITEMS());
+            // Refresh data explorer
+            dispatch(UserProfileGroupsActions.REQUEST_ITEMS());
 
-      dispatch(snackbarActions.OPEN_SNACKBAR({ message: "User has been activated", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
-    } catch (e) {
-      dispatch(snackbarActions.OPEN_SNACKBAR({ message: e.message, hideDuration: 2000, kind: SnackbarKind.ERROR }));
-    }
-  };
+            dispatch(snackbarActions.OPEN_SNACKBAR({ message: "User has been activated", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
+        } catch (e) {
+            dispatch(snackbarActions.OPEN_SNACKBAR({ message: e.message, hideDuration: 2000, kind: SnackbarKind.ERROR }));
+        }
+    };
 
 export const deactivate = (uuid: string) =>
-  async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
-    try {
-      const { resources, auth } = getState();
-      // Call unsetup
-      const user = await services.userService.unsetup(uuid);
-      dispatch(updateResources([user]));
-
-      // Find and remove all users membership
-      const allUsersGroupUuid = getBuiltinGroupUuid(auth.localCluster, BuiltinGroups.ALL);
-      const memberships = filterResources((resource: LinkResource) =>
-          resource.kind === ResourceKind.LINK &&
-          resource.linkClass === LinkClass.PERMISSION &&
-          resource.headUuid === allUsersGroupUuid &&
-          resource.tailUuid === uuid
-      )(resources);
-      // Remove all users membership locally
-      dispatch<any>(deleteResources(memberships.map(link => link.uuid)));
-
-      // Refresh data explorer
-      dispatch(UserProfileGroupsActions.REQUEST_ITEMS());
-
-      dispatch(snackbarActions.OPEN_SNACKBAR({
-        message: "User has been deactivated.",
-        hideDuration: 2000,
-        kind: SnackbarKind.SUCCESS
-      }));
-    } catch (e) {
-      dispatch(snackbarActions.OPEN_SNACKBAR({
-        message: "Could not deactivate user",
-        kind: SnackbarKind.ERROR,
-      }));
-    }
-  };
+    async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+        try {
+            const { resources, auth } = getState();
+            // Call unsetup
+            const user = await services.userService.unsetup(uuid);
+            dispatch(updateResources([user]));
+
+            // Find and remove all users membership
+            const allUsersGroupUuid = getBuiltinGroupUuid(auth.localCluster, BuiltinGroups.ALL);
+            const memberships = filterResources((resource: LinkResource) =>
+                resource.kind === ResourceKind.LINK &&
+                resource.linkClass === LinkClass.PERMISSION &&
+                resource.headUuid === allUsersGroupUuid &&
+                resource.tailUuid === uuid
+            )(resources);
+            // Remove all users membership locally
+            dispatch<any>(deleteResources(memberships.map(link => link.uuid)));
+
+            // Refresh data explorer
+            dispatch(UserProfileGroupsActions.REQUEST_ITEMS());
+
+            dispatch(snackbarActions.OPEN_SNACKBAR({
+                message: "User has been deactivated.",
+                hideDuration: 2000,
+                kind: SnackbarKind.SUCCESS
+            }));
+        } catch (e) {
+            dispatch(snackbarActions.OPEN_SNACKBAR({
+                message: "Could not deactivate user",
+                kind: SnackbarKind.ERROR,
+            }));
+        }
+    };