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>