@camunda/e2e-test-suite 0.0.1042 → 0.0.1044
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.
- package/dist/pages/8.8/ModelerCreatePage.js +12 -1
- package/dist/pages/8.8/ModelerHomePage.d.ts +2 -0
- package/dist/pages/8.8/ModelerHomePage.js +23 -0
- package/dist/pages/SM-8.10/ModelerHomePage.d.ts +1 -0
- package/dist/pages/SM-8.10/ModelerHomePage.js +13 -1
- package/dist/tests/8.8/idp-user-flows.spec.js +10 -8
- package/dist/tests/8.8/optimize-user-flows.spec.js +2 -1
- package/package.json +1 -1
|
@@ -903,7 +903,18 @@ class ModelerCreatePage {
|
|
|
903
903
|
await (0, test_1.expect)(this.deploySubButton).toBeVisible({
|
|
904
904
|
timeout: 60000,
|
|
905
905
|
});
|
|
906
|
-
|
|
906
|
+
// The modal renders Deploy enabled while it is still showing
|
|
907
|
+
// "Checking cluster availability", then disables it for
|
|
908
|
+
// ~0.1-2s once the cluster list lands and the deployment
|
|
909
|
+
// policy / linked-form checks run. A forced click inside that
|
|
910
|
+
// window is swallowed by the disabled button -- no deployment
|
|
911
|
+
// request is sent and the dialog never closes. Wait for the
|
|
912
|
+
// button to settle, and click without `force` so Playwright
|
|
913
|
+
// re-checks it is enabled at click time.
|
|
914
|
+
await (0, test_1.expect)(this.deploySubButton).toBeEnabled({
|
|
915
|
+
timeout: 20000,
|
|
916
|
+
});
|
|
917
|
+
await this.deploySubButton.click({ timeout: 20000 });
|
|
907
918
|
return true;
|
|
908
919
|
}
|
|
909
920
|
catch {
|
|
@@ -24,6 +24,7 @@ declare class ModelerHomePage {
|
|
|
24
24
|
readonly uploadFilesButton: Locator;
|
|
25
25
|
readonly messageBanner: Locator;
|
|
26
26
|
readonly idpTemplateOption: Locator;
|
|
27
|
+
readonly idpEmptyStateButton: Locator;
|
|
27
28
|
readonly idpApplicationNameInput: Locator;
|
|
28
29
|
readonly createIdpApplicationButton: Locator;
|
|
29
30
|
readonly dialog: Locator;
|
|
@@ -67,6 +68,7 @@ declare class ModelerHomePage {
|
|
|
67
68
|
clickMessageBanner(): Promise<void>;
|
|
68
69
|
selectCluster(clusterName: string): Promise<void>;
|
|
69
70
|
clickIdpApplicationTemplateOption(): Promise<void>;
|
|
71
|
+
startIdpApplicationCreation(): Promise<void>;
|
|
70
72
|
assertFormBreadcrumbVisible(formName: string): Promise<void>;
|
|
71
73
|
}
|
|
72
74
|
export { ModelerHomePage };
|
|
@@ -43,6 +43,7 @@ class ModelerHomePage {
|
|
|
43
43
|
uploadFilesButton;
|
|
44
44
|
messageBanner;
|
|
45
45
|
idpTemplateOption;
|
|
46
|
+
idpEmptyStateButton;
|
|
46
47
|
idpApplicationNameInput;
|
|
47
48
|
createIdpApplicationButton;
|
|
48
49
|
dialog;
|
|
@@ -74,6 +75,9 @@ class ModelerHomePage {
|
|
|
74
75
|
this.idpTemplateOption = page
|
|
75
76
|
.locator('[data-test="create-idp-application"]')
|
|
76
77
|
.getByText('IDP Application');
|
|
78
|
+
this.idpEmptyStateButton = page.getByRole('button', {
|
|
79
|
+
name: 'Create IDP application',
|
|
80
|
+
});
|
|
77
81
|
this.diagramTypeDropdown = page.locator('[data-test="diagram-dropdown"]');
|
|
78
82
|
// Matched on the test id alone: hub's design-system variant of the create
|
|
79
83
|
// menu renders "BPMN diagram" (lowercase d), so a text filter breaks the
|
|
@@ -605,6 +609,25 @@ class ModelerHomePage {
|
|
|
605
609
|
async clickIdpApplicationTemplateOption() {
|
|
606
610
|
await this.idpTemplateOption.click({ timeout: 120000 });
|
|
607
611
|
}
|
|
612
|
+
// Which control starts an IDP application depends on whether the workspace
|
|
613
|
+
// root already holds a resource: hub's EntityTable renders the toolbar's
|
|
614
|
+
// create menu OR the empty state, never both (same split
|
|
615
|
+
// clickCreateProcessApplication has to straddle). A workspace whose very
|
|
616
|
+
// first resource is the IDP application only ever offers the empty state's
|
|
617
|
+
// "Create IDP application" button, so waiting for the create menu there
|
|
618
|
+
// times out. Race both entry points, then use whichever one rendered.
|
|
619
|
+
async startIdpApplicationCreation() {
|
|
620
|
+
const rootLoaded = await this.becameVisible(this.idpEmptyStateButton.or(this.diagramTypeDropdown).first(), 60000);
|
|
621
|
+
if (!rootLoaded) {
|
|
622
|
+
await this.page.reload();
|
|
623
|
+
}
|
|
624
|
+
if (await this.becameVisible(this.idpEmptyStateButton, 5000)) {
|
|
625
|
+
await this.idpEmptyStateButton.click({ timeout: 60000 });
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
await this.clickWorkspaceDiagramTypeDropdown();
|
|
629
|
+
await this.clickIdpApplicationTemplateOption();
|
|
630
|
+
}
|
|
608
631
|
async assertFormBreadcrumbVisible(formName) {
|
|
609
632
|
await (0, test_1.expect)(this.formNameBreadcrumb(formName)).toBeVisible({
|
|
610
633
|
timeout: 120000,
|
|
@@ -23,6 +23,7 @@ declare class ModelerHomePage {
|
|
|
23
23
|
readonly crossComponentProjectFolder: Locator;
|
|
24
24
|
readonly homeBreadcrumb: Locator;
|
|
25
25
|
readonly formNameInput: Locator;
|
|
26
|
+
readonly formEditorCanvas: Locator;
|
|
26
27
|
readonly rows: Locator;
|
|
27
28
|
readonly licenseKeyTagNonProduction: Locator;
|
|
28
29
|
readonly licenseKeyTagNonCommercial: Locator;
|
|
@@ -39,6 +39,7 @@ class ModelerHomePage {
|
|
|
39
39
|
crossComponentProjectFolder;
|
|
40
40
|
homeBreadcrumb;
|
|
41
41
|
formNameInput;
|
|
42
|
+
formEditorCanvas;
|
|
42
43
|
rows;
|
|
43
44
|
licenseKeyTagNonProduction;
|
|
44
45
|
licenseKeyTagNonCommercial;
|
|
@@ -129,6 +130,11 @@ class ModelerHomePage {
|
|
|
129
130
|
.or(page.getByRole('button', { name: 'My organisation' }))
|
|
130
131
|
.first();
|
|
131
132
|
this.formNameInput = page.locator('[data-test="editable-input"]');
|
|
133
|
+
// form-js labels its editor region "Form Definition" on both shells (see
|
|
134
|
+
// FormJsPage.formEditor). Unlike the app header, it mounts only once the
|
|
135
|
+
// editor itself has rendered, which makes it the ready signal enterFormName
|
|
136
|
+
// gates on.
|
|
137
|
+
this.formEditorCanvas = page.getByLabel('Form Definition').first();
|
|
132
138
|
this.rows = page.getByRole('row');
|
|
133
139
|
this.licenseKeyTagNonProduction = page
|
|
134
140
|
.getByText('Non-production license')
|
|
@@ -343,9 +349,15 @@ class ModelerHomePage {
|
|
|
343
349
|
// renamed the PROJECT to the form's name instead of the form. The Carbon
|
|
344
350
|
// shell could not hit this: editable-input existed only inside the editor,
|
|
345
351
|
// so the gate implicitly waited for navigation.
|
|
352
|
+
//
|
|
353
|
+
// waitForURL is not enough on its own: the URL flips to /forms/ before the
|
|
354
|
+
// editor mounts, and the app header -- kebab included -- is already painted
|
|
355
|
+
// by then, still showing the process application as the deepest crumb. The
|
|
356
|
+
// canvas mounts together with the entity crumb, so gate on it rather than
|
|
357
|
+
// on the header, which is present either way.
|
|
346
358
|
await this.page.waitForURL(/\/forms\//, { timeout: 60000 });
|
|
347
359
|
await this.formNameInput
|
|
348
|
-
.or(this.
|
|
360
|
+
.or(this.formEditorCanvas)
|
|
349
361
|
.first()
|
|
350
362
|
.waitFor({ state: 'visible', timeout: 30000 });
|
|
351
363
|
if (await this.formNameInput.isVisible()) {
|
|
@@ -87,10 +87,11 @@ _8_8_1.test.describe('IDP User Flow Tests', () => {
|
|
|
87
87
|
await modelerHomePage.clickCrossComponentProjectFolder();
|
|
88
88
|
});
|
|
89
89
|
await _8_8_1.test.step('Add an IDP application to the project', async () => {
|
|
90
|
-
// Workspace
|
|
91
|
-
//
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
// Workspace root only: an IDP application can never be created
|
|
91
|
+
// inside a process application. The entry point there is the create
|
|
92
|
+
// menu or the empty state, depending on whether the workspace
|
|
93
|
+
// already holds a resource.
|
|
94
|
+
await modelerHomePage.startIdpApplicationCreation();
|
|
94
95
|
});
|
|
95
96
|
await _8_8_1.test.step('Creates a document extraction template', async () => {
|
|
96
97
|
await modelerHomePage.enterIdpApplicationName(idpApplicationName);
|
|
@@ -161,10 +162,11 @@ _8_8_1.test.describe('IDP User Flow Tests', () => {
|
|
|
161
162
|
await modelerHomePage.clickCrossComponentProjectFolder();
|
|
162
163
|
});
|
|
163
164
|
await _8_8_1.test.step('Add an IDP application to the project', async () => {
|
|
164
|
-
// Workspace
|
|
165
|
-
//
|
|
166
|
-
|
|
167
|
-
|
|
165
|
+
// Workspace root only: an IDP application can never be created
|
|
166
|
+
// inside a process application. The entry point there is the create
|
|
167
|
+
// menu or the empty state, depending on whether the workspace
|
|
168
|
+
// already holds a resource.
|
|
169
|
+
await modelerHomePage.startIdpApplicationCreation();
|
|
168
170
|
});
|
|
169
171
|
await _8_8_1.test.step('Creates a document extraction template', async () => {
|
|
170
172
|
await modelerHomePage.enterIdpApplicationName(idpApplicationName);
|
|
@@ -203,7 +203,8 @@ _8_8_1.test.describe('Optimize User Flow Tests', () => {
|
|
|
203
203
|
await (0, test_1.expect)(newOperateTab.getByText('Displaying data from 1 instance.')).toBeVisible({ timeout: 90000 });
|
|
204
204
|
});
|
|
205
205
|
});
|
|
206
|
-
|
|
206
|
+
// Skipped due to bug #60153: https://github.com/camunda/camunda/issues/60153
|
|
207
|
+
_8_8_1.test.skip('Process Import Flow @tasklistV1', async ({ page, homePage, modelerHomePage, appsPage, modelerCreatePage, }) => {
|
|
207
208
|
_8_8_1.test.slow();
|
|
208
209
|
const processName = 'Process Import Flow' + (await (0, _setup_1.generateRandomStringAsync)(6));
|
|
209
210
|
await _8_8_1.test.step('Navigate to Web Modeler', async () => {
|