@camunda/e2e-test-suite 0.0.1047 → 0.0.1049
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.
|
@@ -47,6 +47,7 @@ declare class ModelerHomePage {
|
|
|
47
47
|
clickFormOption(): Promise<void>;
|
|
48
48
|
enterFormName(name: string): Promise<void>;
|
|
49
49
|
private renameViaMoreActions;
|
|
50
|
+
private waitForEntityCrumb;
|
|
50
51
|
clickProjectBreadcrumb(): Promise<void>;
|
|
51
52
|
clickWorkspaceBreadcrumb(): Promise<void>;
|
|
52
53
|
enterResourceContainer(name?: string): Promise<void>;
|
|
@@ -356,6 +356,11 @@ class ModelerHomePage {
|
|
|
356
356
|
// canvas mounts together with the entity crumb, so gate on it rather than
|
|
357
357
|
// on the header, which is present either way.
|
|
358
358
|
await this.page.waitForURL(/\/forms\//, { timeout: 60000 });
|
|
359
|
+
// The URL flips before the editor mounts, and the app header re-renders as
|
|
360
|
+
// it does. Renaming in that window finds the kebab but loses the menu it
|
|
361
|
+
// opens, so wait for the editor canvas first. Soft: on a shell that labels
|
|
362
|
+
// the canvas differently the retry in renameViaMoreActions still covers us.
|
|
363
|
+
await this.becameVisible(this.formEditorCanvas, 60000);
|
|
359
364
|
await this.formNameInput
|
|
360
365
|
.or(this.formEditorCanvas)
|
|
361
366
|
.first()
|
|
@@ -377,6 +382,12 @@ class ModelerHomePage {
|
|
|
377
382
|
// menu from the keyboard -- same control, reached the way a keyboard user
|
|
378
383
|
// reaches it, and unaffected by what paints over it.
|
|
379
384
|
//
|
|
385
|
+
// The header keeps re-rendering for a while after the editor mounts (the
|
|
386
|
+
// breadcrumb swap, then the license tags arriving in that ml-auto sibling),
|
|
387
|
+
// and each re-render unmounts the open menu: the nightly trace shows "Rename"
|
|
388
|
+
// resolving, reporting "element is not stable", then "element was detached
|
|
389
|
+
// from the DOM". Reopen the menu and try again rather than racing a single
|
|
390
|
+
// open; the last attempt throws so a genuinely missing menu still fails.
|
|
380
391
|
// A freshly created entity's file data lands after the editor has already
|
|
381
392
|
// painted, and the header re-renders when it does -- which unmounts the open
|
|
382
393
|
// Radix menu mid-click ("element was detached from the DOM, retrying") and
|
|
@@ -385,6 +396,7 @@ class ModelerHomePage {
|
|
|
385
396
|
// test. Escape first: the trigger toggles, so an attempt that left the menu
|
|
386
397
|
// open would otherwise have the next Enter close it again.
|
|
387
398
|
async renameViaMoreActions(name) {
|
|
399
|
+
await this.waitForEntityCrumb();
|
|
388
400
|
const entityActions = this.moreActionsButton.last();
|
|
389
401
|
// The header keeps settling after the editor paints: the license tags
|
|
390
402
|
// mount into the ml-auto sibling and the breadcrumb label swaps from its
|
|
@@ -403,17 +415,31 @@ class ModelerHomePage {
|
|
|
403
415
|
await this.renameMenuItem.click({ timeout: 15000 });
|
|
404
416
|
await (0, test_1.expect)(this.renameInput).toBeVisible({ timeout: 10000 });
|
|
405
417
|
}).toPass({ timeout: 120000, intervals: [1000, 2000, 5000] });
|
|
406
|
-
await (0, test_1.expect)(async () => {
|
|
407
|
-
await this.page.keyboard.press('Escape');
|
|
408
|
-
await entityActions.focus();
|
|
409
|
-
await entityActions.press('Enter');
|
|
410
|
-
await this.renameMenuItem.click({ timeout: 5000 });
|
|
411
|
-
await (0, test_1.expect)(this.renameInput).toBeVisible({ timeout: 10000 });
|
|
412
|
-
}).toPass({ timeout: 120000, intervals: [2000] });
|
|
413
418
|
await this.renameInput.fill(name);
|
|
414
419
|
await this.renameSubmitButton.click();
|
|
415
420
|
await (0, test_1.expect)(this.renameInput).toBeHidden({ timeout: 10000 });
|
|
416
421
|
}
|
|
422
|
+
// The breadcrumb is built up progressively: on a freshly created resource the
|
|
423
|
+
// container is briefly the deepest crumb and owns the only kebab, and the
|
|
424
|
+
// entity crumb is appended a render later. Reopening the menu is not enough
|
|
425
|
+
// on its own -- an attempt that lands inside that window opens the
|
|
426
|
+
// CONTAINER's menu, so "Rename" there renames the process application
|
|
427
|
+
// instead of the entity, and the entity crumb's arrival re-renders the
|
|
428
|
+
// breadcrumb and unmounts the menu mid-click. Wait for the deepest kebab to
|
|
429
|
+
// stop being the container's. Shells that label the kebab generically
|
|
430
|
+
// ("More actions") never match a container label, so this is a no-op there.
|
|
431
|
+
async waitForEntityCrumb() {
|
|
432
|
+
if (!this.processApplicationName) {
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
const containerActions = `${this.processApplicationName} actions`;
|
|
436
|
+
await test_1.expect
|
|
437
|
+
.poll(async () => (await this.moreActionsButton
|
|
438
|
+
.last()
|
|
439
|
+
.getAttribute('aria-label')
|
|
440
|
+
.catch(() => null)) ?? '', { timeout: 30000 })
|
|
441
|
+
.not.toBe(containerActions);
|
|
442
|
+
}
|
|
417
443
|
// Kept under its original name because it is what ~10 call sites already
|
|
418
444
|
// mean: "go back to where my resources live". That is now the process
|
|
419
445
|
// application, not the workspace root.
|
|
@@ -76,8 +76,15 @@ SM_8_10_1.test.describe('Identity User Flow Tests', () => {
|
|
|
76
76
|
});
|
|
77
77
|
if (node_process_1.default.env.IS_OPTIMIZE !== 'false') {
|
|
78
78
|
await SM_8_10_1.test.step('Ensure Optimize is not Accessible', async () => {
|
|
79
|
-
//
|
|
80
|
-
|
|
79
|
+
// Re-skipped: camunda/camunda#60317 is closed as completed, but this
|
|
80
|
+
// still reproduces as of 2026-08-31 (run 33382455150) -- and worse
|
|
81
|
+
// than the original description ("message not rendering"): the
|
|
82
|
+
// zero-role test user gets the full Optimize dashboard, not just a
|
|
83
|
+
// missing error message. The Modeler no-access check directly above
|
|
84
|
+
// this step correctly blocks the same user, so this looks like a
|
|
85
|
+
// real, unresolved authorization gap specific to Optimize, not a
|
|
86
|
+
// test setup issue. Flagged for follow-up rather than re-fixed here.
|
|
87
|
+
SM_8_10_1.test.skip(true, 'Optimize renders full dashboard for a zero-role user instead of denying access -- camunda/camunda#60317 still reproduces');
|
|
81
88
|
await navigationPage.goToOptimizeWithoutAccess(credentials);
|
|
82
89
|
await (0, test_1.expect)(page.getByText('User has no authorization to access Optimize. Please check your Identity configuration')).toBeVisible({
|
|
83
90
|
timeout: 60000,
|