This is an automated email from the ASF dual-hosted git repository.

zehnder pushed a commit to branch 3944-improve-permission-handling
in repository https://gitbox.apache.org/repos/asf/streampipes.git


The following commit(s) were added to 
refs/heads/3944-improve-permission-handling by this push:
     new 5d9efa0649 refactor(#3944): Remove user groups in reset management
5d9efa0649 is described below

commit 5d9efa06498cd20fea752251ca7647ab7cffbd0f
Author: Philipp Zehnder <[email protected]>
AuthorDate: Wed Nov 19 16:16:33 2025 +0100

    refactor(#3944): Remove user groups in reset management
---
 .../streampipes/rest/impl/ResetResource.java       |   9 ++
 ui/cypress/support/utils/UserUtils.ts              |  25 ++-
 ui/cypress/support/utils/user/UserBtns.ts          |  16 +-
 .../userManagement/testGroupManagement.spec.ts     |  13 +-
 .../userManagement/testUserRoleConnect.spec.ts     | 167 +++++++++++----------
 .../edit-user-dialog.component.html                |   1 +
 .../security-user-config.component.html            |   4 +-
 7 files changed, 133 insertions(+), 102 deletions(-)

diff --git 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
index 4596dbb7b3..bf89dc7778 100644
--- 
a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
+++ 
b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ResetResource.java
@@ -43,6 +43,8 @@ public class ResetResource extends 
AbstractAuthGuardedRestResource {
   public ResponseEntity<SuccessMessage> reset() {
     ResetManagement.reset(getAuthenticatedUsername());
     var userStorage = getUserStorage();
+
+
     // Delete all users other than current user (admin) and their resources
     var allUsers = new ArrayList<Principal>(userStorage.getAllUsers());
     for (var user : allUsers) {
@@ -52,6 +54,13 @@ public class ResetResource extends 
AbstractAuthGuardedRestResource {
         userStorage.deleteUser(user.getPrincipalId());
       }
     }
+
+    // Delete all user Groups
+    var allUserGroups = getNoSqlStorage().getUserGroupStorage().findAll();
+    for (var group : allUserGroups) {
+      
getNoSqlStorage().getUserGroupStorage().deleteElementById(group.getElementId());
+    }
+
     var message = Notifications.success("Reset of system successfully 
performed");
     return ok(message);
   }
diff --git a/ui/cypress/support/utils/UserUtils.ts 
b/ui/cypress/support/utils/UserUtils.ts
index e5557d0ad1..249a2e6322 100644
--- a/ui/cypress/support/utils/UserUtils.ts
+++ b/ui/cypress/support/utils/UserUtils.ts
@@ -20,6 +20,7 @@ import { User } from '../model/User';
 import { UserBuilder } from '../builder/UserBuilder';
 import { UserRole } from '../../../src/app/_enums/user-role.enum';
 import { UserBtns } from './user/UserBtns';
+import { ConfigurationBtns } from './configuration/ConfigurationBtns';
 
 export class UserUtils {
     public static adminUser = 
UserBuilder.create('[email protected]')
@@ -76,7 +77,7 @@ export class UserUtils {
             0,
         );
 
-        UserBtns.editUserBtn(user.email);
+        UserBtns.editUserBtn(user.name);
 
         UserBtns.userRoleCheckbox(role).click();
 
@@ -117,4 +118,26 @@ export class UserUtils {
         UserBtns.deleteUserBtn(user.name).click();
         UserBtns.confirmDeleteBtn().click();
     }
+
+    public static createGroup(name: string, ...roles: UserRole[]) {
+        this.goToUserConfiguration();
+
+        ConfigurationBtns.newUserGroupBtn().click();
+        ConfigurationBtns.inputGroupName(name);
+        roles.forEach(role => {
+            cy.get(`input[value="${role}"]`).check();
+        });
+        UserBtns.saveEditUserBtn().click();
+    }
+
+    public static addGroupToUser(groupName: string, name: string) {
+        this.goToUserConfiguration();
+        UserBtns.editUserBtn(name);
+
+        cy.dataCy('group-' + groupName)
+            .children()
+            .click();
+
+        UserBtns.saveEditUserBtn().click();
+    }
 }
diff --git a/ui/cypress/support/utils/user/UserBtns.ts 
b/ui/cypress/support/utils/user/UserBtns.ts
index 6aa8c87052..0f75a04eec 100644
--- a/ui/cypress/support/utils/user/UserBtns.ts
+++ b/ui/cypress/support/utils/user/UserBtns.ts
@@ -17,22 +17,18 @@
  */
 
 export class UserBtns {
-    public static editUserBtn(username) {
-        cy.get('[data-cy="security-user-config"]')
-            .find('tr')
-            .contains('b', username)
-            .closest('tr')
-            .within(() => {
-                cy.get('[data-cy="user-edit-btn"]')
-                    .should('be.visible')
-                    .click();
-            });
+    public static editUserBtn(name: string) {
+        cy.dataCy(`user-edit-${name}`).click();
     }
 
     public static userRoleCheckbox(role) {
         return cy.dataCy('role-' + role).children();
     }
 
+    public static groupCheckbox(group: string) {
+        return cy.dataCy('group-' + group).children();
+    }
+
     public static saveEditUserBtn() {
         return cy.dataCy('sp-element-edit-user-save');
     }
diff --git a/ui/cypress/tests/userManagement/testGroupManagement.spec.ts 
b/ui/cypress/tests/userManagement/testGroupManagement.spec.ts
index 97a2302daa..07bdd5daca 100644
--- a/ui/cypress/tests/userManagement/testGroupManagement.spec.ts
+++ b/ui/cypress/tests/userManagement/testGroupManagement.spec.ts
@@ -85,16 +85,9 @@ describe('Test Group Management for Pipelines', () => {
             3,
         );
 
-        // Add new user group with pipeline admin role
-        ConfigurationBtns.newUserGroupBtn().click();
-        ConfigurationBtns.inputGroupName('User_Group');
-        cy.get('input[value="ROLE_PIPELINE_ADMIN"]').check();
-        UserBtns.saveEditUserBtn().click();
-
-        // Add first user to group
-        UserBtns.firstEditUserBtn().click();
-        cy.get('input[type="checkbox"]').eq(0).check();
-        UserBtns.saveEditUserBtn().click();
+        UserUtils.createGroup('User_Group', UserRole.ROLE_PIPELINE_ADMIN);
+
+        UserUtils.addGroupToUser('User_Group', user.name);
 
         // Add user group to pipeline
         PipelineUtils.goToPipelines();
diff --git a/ui/cypress/tests/userManagement/testUserRoleConnect.spec.ts 
b/ui/cypress/tests/userManagement/testUserRoleConnect.spec.ts
index 9d9c37a179..dd0d008f49 100644
--- a/ui/cypress/tests/userManagement/testUserRoleConnect.spec.ts
+++ b/ui/cypress/tests/userManagement/testUserRoleConnect.spec.ts
@@ -42,86 +42,93 @@ describe('Test User Roles for Connect', () => {
         );
     });
 
-    // it('Adapter is not shared with other users', () => {
-    //     // set up
-    //     UserUtils.switchUser(user1);
-    //     ConnectUtils.addMachineDataSimulator(adapterName);
-    //
-    //     // check admin
-    //     UserUtils.switchUser(UserUtils.adminUser);
-    //     validateAdapterIsVisible();
-    //     PermissionUtils.validateUserCanChangePermissions(adapterName);
-    //
-    //     // check other users
-    //     UserUtils.switchUser(user2);
-    //     ConnectUtils.checkAmountOfAdapters(0);
-    // });
-    //
-    //
-    // it('Make adapter public', () => {
-    //     // set up
-    //     UserUtils.switchUser(user1);
-    //     ConnectUtils.addMachineDataSimulator(adapterName);
-    //     PermissionUtils.markElementAsPublic(adapterName);
-    //
-    //     // check admin
-    //     UserUtils.switchUser(UserUtils.adminUser);
-    //     validateAdapterIsVisible();
-    //     PermissionUtils.validateUserCanChangePermissions(adapterName);
-    //
-    //     // check other users
-    //     UserUtils.switchUser(user2);
-    //     validateAdapterIsVisible();
-    //     PermissionUtils.validateUserCanNotChangePermissions(adapterName);
-    // });
-    //
-    // it('Share adapter with other user and change ownership', () => {
-    //     const user3 = UserUtils.createUser(
-    //         'user3',
-    //         UserRole.ROLE_CONNECT_ADMIN,
-    //         UserRole.ROLE_PIPELINE_ADMIN,
-    //     );
-    //
-    //     // set up
-    //     UserUtils.switchUser(user1);
-    //     ConnectUtils.addMachineDataSimulator(adapterName);
-    //     PermissionUtils.authorizeUser(adapterName, user2.email);
-    //
-    //     // check admin
-    //     UserUtils.switchUser(UserUtils.adminUser);
-    //     validateAdapterIsVisible();
-    //     PermissionUtils.validateUserCanChangePermissions(adapterName);
-    //
-    //     // check authorized user
-    //     UserUtils.switchUser(user2);
-    //     validateAdapterIsVisible();
-    //     PermissionUtils.validateUserCanNotChangePermissions(adapterName);
-    //
-    //     UserUtils.switchUser(user3);
-    //     ConnectUtils.checkAmountOfAdapters(0);
-    //
-    //     // change ownership to user3
-    //     UserUtils.switchUser(user1);
-    //     ConnectUtils.goToConnect();
-    //     PermissionUtils.changeOwnership(adapterName, user3.email);
-    //     ConnectUtils.checkAmountOfAdapters(0);
-    //
-    //     UserUtils.switchUser(UserUtils.adminUser);
-    //     validateAdapterIsVisible();
-    //     PermissionUtils.validateUserCanChangePermissions(adapterName);
-    //
-    //     // check authorized user
-    //     UserUtils.switchUser(user2);
-    //     validateAdapterIsVisible();
-    //     PermissionUtils.validateUserCanNotChangePermissions(adapterName);
-    //
-    //     // validate that user3 is owner now
-    //     UserUtils.switchUser(user3);
-    //     validateAdapterIsVisible();
-    //     PermissionUtils.validateUserCanChangePermissions(adapterName);
-    // });
-
-    it('Adapter is shared with group', () => {
+    it('Adapter is not shared with other users', () => {
+        // set up
+        UserUtils.switchUser(user1);
+        ConnectUtils.addMachineDataSimulator(adapterName);
+
+        // check admin
+        UserUtils.switchUser(UserUtils.adminUser);
+        validateAdapterIsVisible();
+        PermissionUtils.validateUserCanChangePermissions(adapterName);
+
+        // check other users
+        UserUtils.switchUser(user2);
+        ConnectUtils.checkAmountOfAdapters(0);
+    });
+
+    it('Make adapter public', () => {
+        // set up
+        UserUtils.switchUser(user1);
+        ConnectUtils.addMachineDataSimulator(adapterName);
+        PermissionUtils.markElementAsPublic(adapterName);
+
+        // check admin
+        UserUtils.switchUser(UserUtils.adminUser);
+        validateAdapterIsVisible();
+        PermissionUtils.validateUserCanChangePermissions(adapterName);
+
+        // check other users
+        UserUtils.switchUser(user2);
+        validateAdapterIsVisible();
+        PermissionUtils.validateUserCanNotChangePermissions(adapterName);
+    });
+
+    it('Share adapter with other user and change ownership', () => {
+        const user3 = UserUtils.createUser(
+            'user3',
+            UserRole.ROLE_CONNECT_ADMIN,
+            UserRole.ROLE_PIPELINE_ADMIN,
+        );
+
+        // set up
+        UserUtils.switchUser(user1);
+        ConnectUtils.addMachineDataSimulator(adapterName);
+        PermissionUtils.authorizeUser(adapterName, user2.email);
+
+        // check admin
+        UserUtils.switchUser(UserUtils.adminUser);
+        validateAdapterIsVisible();
+        PermissionUtils.validateUserCanChangePermissions(adapterName);
+
+        // check authorized user
+        UserUtils.switchUser(user2);
+        validateAdapterIsVisible();
+        PermissionUtils.validateUserCanNotChangePermissions(adapterName);
+
+        UserUtils.switchUser(user3);
+        ConnectUtils.checkAmountOfAdapters(0);
+
+        // change ownership to user3
+        UserUtils.switchUser(user1);
+        ConnectUtils.goToConnect();
+        PermissionUtils.changeOwnership(adapterName, user3.email);
+        ConnectUtils.checkAmountOfAdapters(0);
+
+        UserUtils.switchUser(UserUtils.adminUser);
+        validateAdapterIsVisible();
+        PermissionUtils.validateUserCanChangePermissions(adapterName);
+
+        // check authorized user
+        UserUtils.switchUser(user2);
+        validateAdapterIsVisible();
+        PermissionUtils.validateUserCanNotChangePermissions(adapterName);
+
+        // validate that user3 is owner now
+        UserUtils.switchUser(user3);
+        validateAdapterIsVisible();
+        PermissionUtils.validateUserCanChangePermissions(adapterName);
+    });
+
+    it('Adapter is shared with group for user 2', () => {
+        // Add group with connect admin rights
+        UserUtils.createGroup(
+            'connect_admin_group',
+            UserRole.ROLE_CONNECT_ADMIN,
+        );
+        UserUtils.addGroupToUser('connect_admin_group', user2.name);
+        // Add group to user2
+
         // set up
         UserUtils.switchUser(user1);
         ConnectUtils.addMachineDataSimulator(adapterName);
diff --git 
a/ui/src/app/configuration/security-configuration/edit-user-dialog/edit-user-dialog.component.html
 
b/ui/src/app/configuration/security-configuration/edit-user-dialog/edit-user-dialog.component.html
index 3809333f0c..b1bfc9d312 100644
--- 
a/ui/src/app/configuration/security-configuration/edit-user-dialog/edit-user-dialog.component.html
+++ 
b/ui/src/app/configuration/security-configuration/edit-user-dialog/edit-user-dialog.component.html
@@ -157,6 +157,7 @@
                             [value]="group.groupId"
                             [checked]="user.groups.indexOf(group.groupId) > -1"
                             (change)="changeGroupAssignment($event)"
+                            [attr.data-cy]="'group-' + group.groupName"
                         >
                             {{ group.groupName }}
                         </mat-checkbox>
diff --git 
a/ui/src/app/configuration/security-configuration/security-user-configuration/security-user-config.component.html
 
b/ui/src/app/configuration/security-configuration/security-user-configuration/security-user-config.component.html
index 7ddef77d55..a429801b3f 100644
--- 
a/ui/src/app/configuration/security-configuration/security-user-configuration/security-user-config.component.html
+++ 
b/ui/src/app/configuration/security-configuration/security-user-configuration/security-user-config.component.html
@@ -104,7 +104,9 @@
                                     class="mat-basic"
                                     [matTooltip]="'Edit user' | translate"
                                     matTooltipPosition="above"
-                                    [attr.data-cy]="'user-edit-btn'"
+                                    [attr.data-cy]="
+                                        'user-edit-' + account.fullName
+                                    "
                                     (click)="editUser(account)"
                                 >
                                     <i class="material-icons">edit</i>

Reply via email to