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 2d7ca3d277 refactor(#3944): Increase test coverage for connect 
permission management
2d7ca3d277 is described below

commit 2d7ca3d277f0188529d3928005b4f5b6b6a53a78
Author: Philipp Zehnder <[email protected]>
AuthorDate: Wed Nov 19 14:53:32 2025 +0100

    refactor(#3944): Increase test coverage for connect permission management
---
 ui/cypress/support/utils/connect/ConnectUtils.ts   |   1 -
 ui/cypress/support/utils/pipeline/PipelineBtns.ts  |   4 +
 ui/cypress/support/utils/pipeline/PipelineUtils.ts |  11 +-
 ui/cypress/support/utils/user/PermissionUtils.ts   |  23 ++++
 .../userManagement/testUserRoleConnect.spec.ts     | 140 ++++++++++++++++-----
 .../object-permission-dialog.component.html        |  16 ++-
 .../pipeline-element-discovery.component.html      |   8 +-
 7 files changed, 165 insertions(+), 38 deletions(-)

diff --git a/ui/cypress/support/utils/connect/ConnectUtils.ts 
b/ui/cypress/support/utils/connect/ConnectUtils.ts
index 4c2f556905..fced3e0d72 100644
--- a/ui/cypress/support/utils/connect/ConnectUtils.ts
+++ b/ui/cypress/support/utils/connect/ConnectUtils.ts
@@ -279,7 +279,6 @@ export class ConnectUtils {
     }
 
     public static editAsset(assetNameList = []) {
-        //cy.dataCy('show-asset-checkbox').click();
         cy.get('mat-tree.asset-tree', { timeout: 10000 }).should('exist');
 
         assetNameList.forEach(assetName => {
diff --git a/ui/cypress/support/utils/pipeline/PipelineBtns.ts 
b/ui/cypress/support/utils/pipeline/PipelineBtns.ts
index 41f2f923f6..1ba9c36db7 100644
--- a/ui/cypress/support/utils/pipeline/PipelineBtns.ts
+++ b/ui/cypress/support/utils/pipeline/PipelineBtns.ts
@@ -36,6 +36,10 @@ export class PipelineBtns {
         return cy.dataCy('pipelines-navigate-to-editor');
     }
 
+    public static spPipelineElementSelection() {
+        return cy.dataCy('sp-pipeline-element-selection', { timeout: 10000 });
+    }
+
     public static editorAddPipelineElement() {
         return cy.dataCy('sp-editor-add-pipeline-element', { timeout: 10000 });
     }
diff --git a/ui/cypress/support/utils/pipeline/PipelineUtils.ts 
b/ui/cypress/support/utils/pipeline/PipelineUtils.ts
index 62d76cd996..b57656d4d4 100644
--- a/ui/cypress/support/utils/pipeline/PipelineUtils.ts
+++ b/ui/cypress/support/utils/pipeline/PipelineUtils.ts
@@ -94,11 +94,16 @@ export class PipelineUtils {
         PipelineBtns.pipelinesToEditor().click();
     }
 
+    public static checkDataStreamExists(dataSourceName: string) {
+        PipelineBtns.spPipelineElementSelection().should('be.visible');
+        PipelineBtns.editorAddPipelineElement().click();
+        cy.dataCy(dataSourceName).should('exist');
+        cy.dataCy('cancel-pipeline-element-discovery').click();
+    }
+
     public static selectDataStream(pipelineInput: PipelineInput) {
         // Select a stream
-        cy.dataCy('sp-pipeline-element-selection', { timeout: 10000 }).should(
-            'be.visible',
-        );
+        PipelineBtns.spPipelineElementSelection().should('be.visible');
         PipelineBtns.editorAddPipelineElement().click();
         cy.dataCy(pipelineInput.dataSource, { timeout: 10000 }).click();
     }
diff --git a/ui/cypress/support/utils/user/PermissionUtils.ts 
b/ui/cypress/support/utils/user/PermissionUtils.ts
index 3242960d22..56e07517b4 100644
--- a/ui/cypress/support/utils/user/PermissionUtils.ts
+++ b/ui/cypress/support/utils/user/PermissionUtils.ts
@@ -25,6 +25,13 @@ export class PermissionUtils {
         cy.dataCy('open-manage-permissions').click();
     }
 
+    public static changeOwnership(resourceName: string, email: string) {
+        PermissionUtils.openManagePermissions(resourceName);
+        cy.dataCy('owner-select').click();
+        cy.get(`[data-cy="owner-option-${email}"]`, { timeout: 10000 
}).click();
+        PermissionUtils.save();
+    }
+
     public static markElementAsPublic(resourceName: string) {
         PermissionUtils.openManagePermissions(resourceName);
         StaticPropertyUtils.clickCheckbox('permission-public-element');
@@ -43,4 +50,20 @@ export class PermissionUtils {
     public static save() {
         cy.dataCy('sp-manage-permissions-save').click();
     }
+
+    public static cancel() {
+        cy.dataCy('sp-manage-permissions-cancel').click();
+    }
+
+    public static validateUserCanNotChangePermissions(resourceName: string) {
+        PermissionUtils.openManagePermissions(resourceName);
+        cy.dataCy('warning-permissions-managed-by-owner').should('exist');
+        PermissionUtils.cancel();
+    }
+
+    public static validateUserCanChangePermissions(resourceName: string) {
+        PermissionUtils.openManagePermissions(resourceName);
+        cy.dataCy('permission-public-element').should('exist');
+        PermissionUtils.cancel();
+    }
 }
diff --git a/ui/cypress/tests/userManagement/testUserRoleConnect.spec.ts 
b/ui/cypress/tests/userManagement/testUserRoleConnect.spec.ts
index a517d854d1..9d9c37a179 100644
--- a/ui/cypress/tests/userManagement/testUserRoleConnect.spec.ts
+++ b/ui/cypress/tests/userManagement/testUserRoleConnect.spec.ts
@@ -19,53 +19,131 @@ import { UserRole } from 
'../../../src/app/_enums/user-role.enum';
 import { UserUtils } from '../../support/utils/UserUtils';
 import { ConnectUtils } from '../../support/utils/connect/ConnectUtils';
 import { PermissionUtils } from '../../support/utils/user/PermissionUtils';
-import { NavigationUtils } from 
'../../support/utils/navigation/NavigationUtils';
 import { User } from '../../support/model/User';
+import { PipelineUtils } from '../../support/utils/pipeline/PipelineUtils';
 
 describe('Test User Roles for Connect', () => {
-    let connectAdminUser: User;
+    const adapterName = 'simulator';
+    let user1: User;
+    let user2: User;
+
     beforeEach('Setup Test', () => {
         cy.initStreamPipesTest();
-        connectAdminUser = UserUtils.createUser(
-            'user',
+        user1 = UserUtils.createUser(
+            'user1',
             UserRole.ROLE_CONNECT_ADMIN,
+            UserRole.ROLE_PIPELINE_ADMIN,
         );
-        ConnectUtils.addMachineDataSimulator('simulator');
-    });
 
-    it('Connect admin should not see adapters of other users', () => {
-        switchUserAndValidateConnectModuleIsShown();
-
-        // Validate that no adapter is visible
-        ConnectUtils.checkAmountOfAdapters(0);
+        user2 = UserUtils.createUser(
+            'user2',
+            UserRole.ROLE_CONNECT_ADMIN,
+            UserRole.ROLE_PIPELINE_ADMIN,
+        );
     });
 
-    it('Connect admin should see public adapters of other users', () => {
-        // Set adapter to public
-        PermissionUtils.markElementAsPublic('simulator');
+    // 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);
+    // });
 
-        switchUserAndValidateConnectModuleIsShown();
+    it('Adapter is shared with group', () => {
+        // set up
+        UserUtils.switchUser(user1);
+        ConnectUtils.addMachineDataSimulator(adapterName);
 
-        // Validate that adapter is visible
-        ConnectUtils.checkAmountOfAdapters(1);
-    });
-
-    it('Connect admin should see shared adapters of other users', () => {
-        // Share adapter with user
-        PermissionUtils.authorizeUser('simulator', connectAdminUser.email);
+        // check admin
+        UserUtils.switchUser(UserUtils.adminUser);
+        validateAdapterIsVisible();
+        PermissionUtils.validateUserCanChangePermissions(adapterName);
 
-        switchUserAndValidateConnectModuleIsShown();
+        // check other users
+        UserUtils.switchUser(user2);
+        ConnectUtils.checkAmountOfAdapters(0);
+    });
 
-        // Validate that adapter is visible
+    function validateAdapterIsVisible() {
         ConnectUtils.checkAmountOfAdapters(1);
-    });
 
-    function switchUserAndValidateConnectModuleIsShown() {
-        UserUtils.switchUser(connectAdminUser);
+        ConnectUtils.validateEventsInPreview(adapterName, 7);
+
+        PipelineUtils.goToPipelineEditor();
+        PipelineUtils.checkDataStreamExists(adapterName);
 
-        NavigationUtils.validateActiveModules([
-            NavigationUtils.CONNECT,
-            NavigationUtils.CONFIGURATION,
-        ]);
+        ConnectUtils.goToConnect();
     }
 });
diff --git 
a/ui/projects/streampipes/shared-ui/src/lib/dialog/object-permission-dialog/object-permission-dialog.component.html
 
b/ui/projects/streampipes/shared-ui/src/lib/dialog/object-permission-dialog/object-permission-dialog.component.html
index 6e1cdf3c61..15353f20ed 100644
--- 
a/ui/projects/streampipes/shared-ui/src/lib/dialog/object-permission-dialog/object-permission-dialog.component.html
+++ 
b/ui/projects/streampipes/shared-ui/src/lib/dialog/object-permission-dialog/object-permission-dialog.component.html
@@ -35,10 +35,18 @@
                         }}</span>
                         <mat-form-field color="accent">
                             <mat-label>{{ 'Owner' | translate }}</mat-label>
-                            <mat-select formControlName="owner" fxFlex 
required>
+                            <mat-select
+                                data-cy="owner-select"
+                                formControlName="owner"
+                                fxFlex
+                                required
+                            >
                                 <mat-option
                                     *ngFor="let user of allUsers"
                                     [value]="user.principalId"
+                                    [attr.data-cy]="
+                                        'owner-option-' + user.email
+                                    "
                                     >{{ user.email }}
                                 </mat-option>
                             </mat-select>
@@ -219,7 +227,10 @@
             </div>
         </div>
     } @else {
-        <div class="sp-dialog-content">
+        <div
+            class="sp-dialog-content"
+            data-cy="warning-permissions-managed-by-owner"
+        >
             <div fxFlex="100" fxLayoutAlign="center center" fxLayout="column">
                 <mat-icon>block</mat-icon>
                 <h5>
@@ -252,6 +263,7 @@
                 mat-button
                 mat-flat-button
                 class="mat-basic"
+                data-cy="sp-manage-permissions-cancel"
                 (click)="close(false)"
             >
                 {{ 'Cancel' | translate }}
diff --git 
a/ui/src/app/editor/dialog/pipeline-element-discovery/pipeline-element-discovery.component.html
 
b/ui/src/app/editor/dialog/pipeline-element-discovery/pipeline-element-discovery.component.html
index 02f4c257dc..eb0bf6a0d0 100644
--- 
a/ui/src/app/editor/dialog/pipeline-element-discovery/pipeline-element-discovery.component.html
+++ 
b/ui/src/app/editor/dialog/pipeline-element-discovery/pipeline-element-discovery.component.html
@@ -59,7 +59,13 @@
     </div>
     <mat-divider></mat-divider>
     <div class="sp-dialog-actions">
-        <button mat-button mat-flat-button class="mat-basic" (click)="hide()">
+        <button
+            data-cy="cancel-pipeline-element-discovery"
+            mat-button
+            mat-flat-button
+            class="mat-basic"
+            (click)="hide()"
+        >
             Cancel
         </button>
     </div>

Reply via email to