@camunda/e2e-test-suite 0.0.598 → 0.0.599
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 ClusterDetailsPage {
|
|
|
47
47
|
readonly mcpTextarea: Locator;
|
|
48
48
|
constructor(page: Page);
|
|
49
49
|
clickAPITab(): Promise<void>;
|
|
50
|
+
dismissOopsIfPresent(): Promise<void>;
|
|
50
51
|
clickCreateClientButton(): Promise<void>;
|
|
51
52
|
clickClientNameTextbox(): Promise<void>;
|
|
52
53
|
fillClientNameTextbox(name: string): Promise<void>;
|
|
@@ -157,8 +157,33 @@ class ClusterDetailsPage {
|
|
|
157
157
|
await (0, test_1.expect)(this.apiTab).toBeVisible({ timeout: 60000 });
|
|
158
158
|
await this.apiTab.click({ timeout: 60000 });
|
|
159
159
|
}
|
|
160
|
+
async dismissOopsIfPresent() {
|
|
161
|
+
// The clients list panel sometimes lands in a Carbon "Oops ... something
|
|
162
|
+
// went wrong." state when a background ClustersService request fails on
|
|
163
|
+
// SaaS INT. The panel replaces the create-client button, so any click
|
|
164
|
+
// attempt will time out until the user clicks the inline Reload button.
|
|
165
|
+
const oopsHeading = this.page.getByRole('heading', { name: /Oops/i });
|
|
166
|
+
if (!(await oopsHeading.isVisible({ timeout: 1000 }).catch(() => false))) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const reloadButton = this.page.getByRole('button', {
|
|
170
|
+
name: 'Reload',
|
|
171
|
+
exact: true,
|
|
172
|
+
});
|
|
173
|
+
if (await reloadButton.isVisible({ timeout: 1000 }).catch(() => false)) {
|
|
174
|
+
await reloadButton.click({ timeout: 15000 }).catch(() => { });
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
await this.page.reload();
|
|
178
|
+
}
|
|
179
|
+
await this.page.waitForLoadState('domcontentloaded');
|
|
180
|
+
}
|
|
160
181
|
async clickCreateClientButton() {
|
|
161
|
-
await (0, clickLocatorWithRetry_1.clickLocatorWithRetry)(this.page, this.createFirstClientButton.or(this.createNewClientButton)
|
|
182
|
+
await (0, clickLocatorWithRetry_1.clickLocatorWithRetry)(this.page, this.createFirstClientButton.or(this.createNewClientButton), {
|
|
183
|
+
preAction: async () => {
|
|
184
|
+
await this.dismissOopsIfPresent();
|
|
185
|
+
},
|
|
186
|
+
});
|
|
162
187
|
}
|
|
163
188
|
async clickClientNameTextbox() {
|
|
164
189
|
await this.clientNameTextbox.click({ timeout: 60000 });
|
|
@@ -433,7 +458,24 @@ class ClusterDetailsPage {
|
|
|
433
458
|
await (0, test_1.expect)(this.clientCredentialsDialog
|
|
434
459
|
.getByText('The Client Secret will not be shown again.')
|
|
435
460
|
.first()).toBeVisible();
|
|
436
|
-
|
|
461
|
+
try {
|
|
462
|
+
await (0, test_1.expect)(this.clientsList.filter({ hasText: name })).toContainText(/(?=.*Orchestration)(?=.*Optimize)(?=.*Secrets)/, {
|
|
463
|
+
timeout: 10000,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
catch (err) {
|
|
467
|
+
// The clients list panel can land in "Oops ... something went wrong."
|
|
468
|
+
// while the post-create modal is still open. The modal blocks pointer
|
|
469
|
+
// events so we can't click Reload here; the modal's "Client Secret will
|
|
470
|
+
// not be shown again" message above already proves the client exists.
|
|
471
|
+
const oopsVisible = await this.page
|
|
472
|
+
.getByRole('heading', { name: /Oops/i })
|
|
473
|
+
.isVisible({ timeout: 1000 })
|
|
474
|
+
.catch(() => false);
|
|
475
|
+
if (!oopsVisible)
|
|
476
|
+
throw err;
|
|
477
|
+
console.warn(`createAPIClient: clients list panel is in Oops state; skipping row scope assertion for "${name}".`);
|
|
478
|
+
}
|
|
437
479
|
}
|
|
438
480
|
async clickEnvVarsButton() {
|
|
439
481
|
await (0, test_1.expect)(this.envVarsTab).toBeVisible({ timeout: 40000 });
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ClusterPage = void 0;
|
|
4
4
|
const test_1 = require("@playwright/test");
|
|
5
5
|
const sleep_1 = require("../../utils/sleep");
|
|
6
|
-
const expectLocatorWithRetry_1 = require("../../utils/assertionHelpers/expectLocatorWithRetry");
|
|
7
6
|
const clickLocatorWithRetry_1 = require("../../utils/assertionHelpers/clickLocatorWithRetry");
|
|
8
7
|
class ClusterPage {
|
|
9
8
|
page;
|
|
@@ -317,16 +316,39 @@ class ClusterPage {
|
|
|
317
316
|
}
|
|
318
317
|
}
|
|
319
318
|
async assertClusterHealthyStatusWithRetry(name, visibilityTimeout = 100000, totalTimeout = 500000) {
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
319
|
+
const unhealthy = this.cluster(name).getByText('Unhealthy', { exact: true });
|
|
320
|
+
const start = Date.now();
|
|
321
|
+
const maxRetries = 5;
|
|
322
|
+
let attempt = 0;
|
|
323
|
+
let lastErr;
|
|
324
|
+
while (Date.now() - start < totalTimeout && attempt < maxRetries) {
|
|
325
|
+
attempt++;
|
|
326
|
+
try {
|
|
325
327
|
await this.page.reload();
|
|
326
328
|
await (0, test_1.expect)(this.cluster(name)).toBeVisible({ timeout: 10000 });
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
329
|
+
// Unhealthy is a terminal state for this cluster instance; polling
|
|
330
|
+
// further wastes the full retry budget and hides the real signal.
|
|
331
|
+
if (await unhealthy.isVisible({ timeout: 2000 }).catch(() => false)) {
|
|
332
|
+
throw new Error(`Cluster "${name}" reached terminal Unhealthy state after ${Math.round((Date.now() - start) / 1000)}s; aborting Healthy poll.`);
|
|
333
|
+
}
|
|
334
|
+
await this.clusterHealthiness(name).waitFor({
|
|
335
|
+
state: 'visible',
|
|
336
|
+
timeout: visibilityTimeout,
|
|
337
|
+
});
|
|
338
|
+
console.log('Cluster is healthy:', name);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
if (err instanceof Error &&
|
|
343
|
+
err.message.includes('terminal Unhealthy state')) {
|
|
344
|
+
throw err;
|
|
345
|
+
}
|
|
346
|
+
lastErr = err;
|
|
347
|
+
console.log(`Attempt ${attempt} failed for cluster "${name}" Healthy check, retrying...`, err instanceof Error ? err.message : err);
|
|
348
|
+
await this.page.waitForTimeout(500);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
throw new Error(`Cluster "${name}" did not become Healthy after ${attempt} attempts. Last error: ${lastErr instanceof Error ? lastErr.message : lastErr}`);
|
|
330
352
|
}
|
|
331
353
|
async clickAlphaTab() {
|
|
332
354
|
await this.alphaTab.click();
|