@camunda/e2e-test-suite 0.0.1026 → 0.0.1027
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -8,6 +8,8 @@ declare class Authorization {
|
|
|
8
8
|
protected readonly createAuthorizationOwnerTypeOption: (name: string) => Locator;
|
|
9
9
|
protected readonly createAuthorizationOwnerComboBox: Locator;
|
|
10
10
|
protected readonly createAuthorizationOwnerOption: (name: string) => Locator;
|
|
11
|
+
protected readonly createAuthorizationOwnerSearchInput: Locator;
|
|
12
|
+
protected readonly createAuthorizationOwnerSearchOption: (name: string) => Locator;
|
|
11
13
|
protected readonly createAuthorizationResourceTypeDropdown: Locator;
|
|
12
14
|
protected readonly createAuthorizationResourceTypeOption: (name: string) => Locator;
|
|
13
15
|
protected readonly createAuthorizationResourceIdField: Locator;
|
|
@@ -19,6 +21,7 @@ declare class Authorization {
|
|
|
19
21
|
protected readonly deleteAuthorizationModalDeleteButton: Locator;
|
|
20
22
|
protected readonly tableFilter: Locator;
|
|
21
23
|
constructor(page: Page);
|
|
24
|
+
private selectAuthorizationOwner;
|
|
22
25
|
createAuthorization(authorization: {
|
|
23
26
|
ownerType: string;
|
|
24
27
|
ownerId: string;
|
|
@@ -14,6 +14,8 @@ class Authorization {
|
|
|
14
14
|
createAuthorizationOwnerTypeOption;
|
|
15
15
|
createAuthorizationOwnerComboBox;
|
|
16
16
|
createAuthorizationOwnerOption;
|
|
17
|
+
createAuthorizationOwnerSearchInput;
|
|
18
|
+
createAuthorizationOwnerSearchOption;
|
|
17
19
|
createAuthorizationResourceTypeDropdown;
|
|
18
20
|
createAuthorizationResourceTypeOption;
|
|
19
21
|
createAuthorizationResourceIdField;
|
|
@@ -51,6 +53,16 @@ class Authorization {
|
|
|
51
53
|
name,
|
|
52
54
|
exact: true,
|
|
53
55
|
});
|
|
56
|
+
// Every owner type now renders a server-backed search dropdown instead of
|
|
57
|
+
// the combobox that listed all owners up front. The dropdown is a Carbon
|
|
58
|
+
// Search inside a ListBox, so it has no combobox role; its results are
|
|
59
|
+
// list-box menu items that carry the owner ID as their title.
|
|
60
|
+
this.createAuthorizationOwnerSearchInput =
|
|
61
|
+
this.createAuthorizationModal.getByPlaceholder('Search by owner ID');
|
|
62
|
+
this.createAuthorizationOwnerSearchOption = (name) => this.createAuthorizationModal
|
|
63
|
+
.locator('.cds--list-box__menu-item')
|
|
64
|
+
.filter({ hasText: name })
|
|
65
|
+
.first();
|
|
54
66
|
this.createAuthorizationResourceTypeDropdown =
|
|
55
67
|
this.createAuthorizationModal.getByRole('combobox', {
|
|
56
68
|
name: 'Resource type',
|
|
@@ -79,18 +91,38 @@ class Authorization {
|
|
|
79
91
|
});
|
|
80
92
|
this.tableFilter = page.getByRole('searchbox', { name: 'Filter table' });
|
|
81
93
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
await this.
|
|
86
|
-
await this.
|
|
94
|
+
// Released 8.10 alpha images still render the Carbon combobox that lists
|
|
95
|
+
// every owner, so accept whichever owner field this build shows.
|
|
96
|
+
async selectAuthorizationOwner(ownerId) {
|
|
97
|
+
await (0, test_1.expect)(this.createAuthorizationOwnerSearchInput.or(this.createAuthorizationOwnerComboBox)).toBeVisible({ timeout: 30000 });
|
|
98
|
+
if (await this.createAuthorizationOwnerSearchInput.isVisible()) {
|
|
99
|
+
await this.createAuthorizationOwnerSearchInput.fill(ownerId);
|
|
100
|
+
const ownerOption = this.createAuthorizationOwnerSearchOption(ownerId);
|
|
101
|
+
// The search is debounced and served by the API, so a just-created
|
|
102
|
+
// owner can take a while to surface.
|
|
103
|
+
await (0, test_1.expect)(ownerOption).toBeVisible({ timeout: 60000 });
|
|
104
|
+
await ownerOption.click({ timeout: 30000 });
|
|
105
|
+
// Picking an owner replaces the search input with a tag holding the
|
|
106
|
+
// selection, which is how we know the choice was committed.
|
|
107
|
+
await (0, test_1.expect)(this.createAuthorizationOwnerSearchInput).toBeHidden({
|
|
108
|
+
timeout: 30000,
|
|
109
|
+
});
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
87
112
|
await this.createAuthorizationOwnerComboBox.click();
|
|
88
|
-
await (0, test_1.expect)(this.createAuthorizationOwnerOption(
|
|
113
|
+
await (0, test_1.expect)(this.createAuthorizationOwnerOption(ownerId)).toBeVisible({
|
|
89
114
|
timeout: 30000,
|
|
90
115
|
});
|
|
91
|
-
await this.createAuthorizationOwnerOption(
|
|
116
|
+
await this.createAuthorizationOwnerOption(ownerId).click({
|
|
92
117
|
timeout: 30000,
|
|
93
118
|
});
|
|
119
|
+
}
|
|
120
|
+
async createAuthorization(authorization) {
|
|
121
|
+
await this.createAuthorizationButton.click();
|
|
122
|
+
await (0, test_1.expect)(this.createAuthorizationModal).toBeVisible();
|
|
123
|
+
await this.createAuthorizationOwnerTypeCombobox.click();
|
|
124
|
+
await this.createAuthorizationOwnerTypeOption(authorization.ownerType).click();
|
|
125
|
+
await this.selectAuthorizationOwner(authorization.ownerId);
|
|
94
126
|
// The Resource type is pre-selected and disabled when the dialog is
|
|
95
127
|
// opened from a specific resource-type tab. Only pick it from the dropdown
|
|
96
128
|
// when the field is still enabled (editable).
|
|
@@ -263,9 +263,15 @@ class OCTenantPage {
|
|
|
263
263
|
await this.roleIdSearchBox.click();
|
|
264
264
|
}
|
|
265
265
|
async fillRoleIdSearchBox(roleId, roleIdentifier) {
|
|
266
|
-
await this.roleIdSearchBox.fill(roleId);
|
|
267
266
|
const result = this.page.getByText(roleIdentifier).first();
|
|
268
|
-
|
|
267
|
+
// The dropdown matches against the roles fetched with an empty search
|
|
268
|
+
// filter, so clearing the box re-triggers that fetch before retyping.
|
|
269
|
+
await (0, test_1.expect)(async () => {
|
|
270
|
+
await this.roleIdSearchBox.fill('');
|
|
271
|
+
await this.page.waitForLoadState('networkidle');
|
|
272
|
+
await this.roleIdSearchBox.fill(roleId);
|
|
273
|
+
await (0, test_1.expect)(result).toBeVisible({ timeout: 15000 });
|
|
274
|
+
}).toPass({ timeout: 90000, intervals: [2000] });
|
|
269
275
|
await result.click();
|
|
270
276
|
}
|
|
271
277
|
async clickAssignRoleSubButton() {
|
|
@@ -279,6 +285,7 @@ class OCTenantPage {
|
|
|
279
285
|
return;
|
|
280
286
|
}
|
|
281
287
|
await this.clickAssignRoleButton();
|
|
288
|
+
await this.page.waitForLoadState('networkidle');
|
|
282
289
|
await this.clickRoleIdSearchBox();
|
|
283
290
|
await this.fillRoleIdSearchBox(roleId, roleIdentifier);
|
|
284
291
|
await this.clickAssignRoleSubButton();
|
|
@@ -6,6 +6,12 @@ async function findLocatorWithPagination(page, locator, options) {
|
|
|
6
6
|
const maxPages = 10;
|
|
7
7
|
const paginationButton = page.getByRole('button', { name: 'Next page' });
|
|
8
8
|
const backupPaginationButton = page.getByRole('button', { name: 'Load more' });
|
|
9
|
+
// The design-system DataTable the Admin UI is migrating onto labels its
|
|
10
|
+
// forward control just "Next", unlike Carbon's "Next page". Scope it to the
|
|
11
|
+
// pagination bar so an unrelated wizard "Next" can never be clicked.
|
|
12
|
+
const dataTablePaginationButton = page
|
|
13
|
+
.locator('[data-slot="data-table-pagination"]')
|
|
14
|
+
.getByRole('button', { name: 'Next', exact: true });
|
|
9
15
|
const startTime = Date.now();
|
|
10
16
|
for (let pageNum = 0; pageNum < maxPages; pageNum++) {
|
|
11
17
|
if (Date.now() - startTime > timeout) {
|
|
@@ -20,7 +26,10 @@ async function findLocatorWithPagination(page, locator, options) {
|
|
|
20
26
|
console.log(`Found locator "${locator}" on page ${pageNum + 1}`);
|
|
21
27
|
return true;
|
|
22
28
|
}
|
|
23
|
-
const nextButton = paginationButton
|
|
29
|
+
const nextButton = paginationButton
|
|
30
|
+
.or(backupPaginationButton)
|
|
31
|
+
.or(dataTablePaginationButton)
|
|
32
|
+
.last();
|
|
24
33
|
const isVisible = await nextButton
|
|
25
34
|
.isVisible({ timeout: 1000 })
|
|
26
35
|
.catch(() => false);
|