From e6642959bec39422c6115c362d7000b337fb3c2a Mon Sep 17 00:00:00 2001 From: Michael Li Date: Fri, 21 Jun 2024 13:26:13 -0400 Subject: [PATCH] test(e2e): Fix flakiness when selecting org links (#2348) * test(e2e): Fix flakiness when selecting links Some links exist on both the "Global" and "Org" scope (i.e. Storage Policies, Auth Methods). There was some flakiness observed where the test intends to select the "Org" variant of the link, but the test moves too quickly and selects the "Global" variant instead. This commit ensures that the Org page has loaded after clicking the Org link before trying to navigate to the next thing. * test(e2e): Address flake due to OK conflict * test(e2e): Address flake due to OK conflict part 2 * CR: Fix more race conditions --- ui/admin/tests/e2e/helpers/boundary-ui.js | 33 ++++++++++++++++++- .../e2e/tests/auth-method-password.spec.js | 3 ++ .../tests/credential-store-static-ent.spec.js | 4 +-- .../e2e/tests/credential-store-static.spec.js | 2 +- .../tests/session-recording-aws-ent.spec.js | 6 ++++ .../tests/session-recording-minio-ent.spec.js | 6 ++++ 6 files changed, 50 insertions(+), 4 deletions(-) diff --git a/ui/admin/tests/e2e/helpers/boundary-ui.js b/ui/admin/tests/e2e/helpers/boundary-ui.js index 6dc308d0a..f02bc4675 100644 --- a/ui/admin/tests/e2e/helpers/boundary-ui.js +++ b/ui/admin/tests/e2e/helpers/boundary-ui.js @@ -240,7 +240,21 @@ exports.createVaultCredentialStore = async (page, vaultAddr, clientToken) => { */ exports.createStaticCredentialKeyPair = async (page, username, keyPath) => { const credentialName = 'Credential ' + nanoid(); - await page.getByRole('link', { name: 'Credentials', exact: true }).click(); + + const credentialsBreadcrumbIsVisible = await page + .getByRole('breadcrumbs', { name: 'Credentials' }) + .isVisible(); + if (credentialsBreadcrumbIsVisible) { + await page.getByRole('breadcrumbs', { name: 'Credentials' }).click(); + } else { + await page.getByRole('link', { name: 'Credentials', exact: true }).click(); + } + + await expect( + page + .getByRole('navigation', { name: 'breadcrumbs' }) + .getByText('Credentials'), + ).toBeVisible(); const newButtonIsVisible = await page .getByRole('link', { name: 'New', exact: true }) @@ -299,6 +313,12 @@ exports.createStaticCredentialUsernamePassword = async ( await page.getByRole('link', { name: 'Credentials', exact: true }).click(); } + await expect( + page + .getByRole('navigation', { name: 'breadcrumbs' }) + .getByText('Credentials'), + ).toBeVisible(); + const newButtonIsVisible = await page .getByRole('link', { name: 'New', exact: true }) .isVisible(); @@ -750,6 +770,11 @@ exports.addBrokeredCredentialsToTarget = async ( await page .getByRole('link', { name: 'Brokered Credentials', exact: true }) .click(); + await expect( + page + .getByRole('navigation', { name: 'breadcrumbs' }) + .getByText('Brokered Credentials'), + ).toBeVisible(); const addBrokeredCredentialsButtonIsVisible = await page .getByRole('article') @@ -796,6 +821,7 @@ exports.addInjectedCredentialsToTarget = async ( .getByRole('navigation', { name: 'Resources' }) .getByRole('link', { name: 'Targets' }) .click(); + await expect(page.getByRole('heading', { name: 'Targets' })).toBeVisible(); await page.getByRole('link', { name: targetName }).click(); await page .getByRole('link', { @@ -803,6 +829,11 @@ exports.addInjectedCredentialsToTarget = async ( exact: true, }) .click(); + await expect( + page + .getByRole('navigation', { name: 'breadcrumbs' }) + .getByText('Injected Application Credentials'), + ).toBeVisible(); const addInjectedCredentialsButtonIsVisible = await page .getByRole('article') diff --git a/ui/admin/tests/e2e/tests/auth-method-password.spec.js b/ui/admin/tests/e2e/tests/auth-method-password.spec.js index 17e150761..b0786c7d2 100644 --- a/ui/admin/tests/e2e/tests/auth-method-password.spec.js +++ b/ui/admin/tests/e2e/tests/auth-method-password.spec.js @@ -101,6 +101,9 @@ test('Verify new auth-method can be created and assigned to users @ce @ent @aws .getByRole('link', { name: 'Orgs' }) .click(); await page.getByRole('link', { name: orgName }).click(); + await expect( + page.getByRole('navigation', { name: 'breadcrumbs' }).getByText(orgName), + ).toBeVisible(); await page .getByRole('navigation', { name: 'IAM' }) .getByRole('link', { name: 'Auth Methods' }) diff --git a/ui/admin/tests/e2e/tests/credential-store-static-ent.spec.js b/ui/admin/tests/e2e/tests/credential-store-static-ent.spec.js index a1c3228cb..dfee760e4 100644 --- a/ui/admin/tests/e2e/tests/credential-store-static-ent.spec.js +++ b/ui/admin/tests/e2e/tests/credential-store-static-ent.spec.js @@ -72,7 +72,7 @@ test('Multiple Credential Stores (ENT) @ent @aws @docker', async ({ page }) => { .getByRole('button', { name: 'Manage' }) .click(); await page.getByRole('button', { name: 'Remove' }).click(); - await page.getByRole('button', { name: 'OK' }).click(); + await page.getByRole('button', { name: 'OK', exact: true }).click(); await expect( page.getByRole('alert').getByText('Success', { exact: true }), ).toBeVisible(); @@ -89,7 +89,7 @@ test('Multiple Credential Stores (ENT) @ent @aws @docker', async ({ page }) => { .getByRole('button', { name: 'Manage' }) .click(); await page.getByRole('button', { name: 'Remove' }).click(); - await page.getByRole('button', { name: 'OK' }).click(); + await page.getByRole('button', { name: 'OK', exact: true }).click(); await expect( page.getByRole('alert').getByText('Success', { exact: true }), ).toBeVisible(); diff --git a/ui/admin/tests/e2e/tests/credential-store-static.spec.js b/ui/admin/tests/e2e/tests/credential-store-static.spec.js index 09cdee92d..c39ca9830 100644 --- a/ui/admin/tests/e2e/tests/credential-store-static.spec.js +++ b/ui/admin/tests/e2e/tests/credential-store-static.spec.js @@ -221,7 +221,7 @@ test('Multiple Credential Stores (CE) @ce @aws @docker', async ({ page }) => { .getByRole('button', { name: 'Manage' }) .click(); await page.getByRole('button', { name: 'Remove' }).click(); - await page.getByRole('button', { name: 'OK' }).click(); + await page.getByRole('button', { name: 'OK', exact: true }).click(); await expect( page.getByRole('alert').getByText('Success', { exact: true }), ).toBeVisible(); diff --git a/ui/admin/tests/e2e/tests/session-recording-aws-ent.spec.js b/ui/admin/tests/e2e/tests/session-recording-aws-ent.spec.js index de163ac8d..bdd598482 100644 --- a/ui/admin/tests/e2e/tests/session-recording-aws-ent.spec.js +++ b/ui/admin/tests/e2e/tests/session-recording-aws-ent.spec.js @@ -120,6 +120,9 @@ test('Session Recording Test (AWS) @ent @aws', async ({ page }) => { // Create storage policy in org scope: keep session recordings forever await page.getByRole('link', { name: 'Orgs', exact: true }).click(); await page.getByRole('link', { name: orgName }).click(); + await expect( + page.getByRole('navigation', { name: 'breadcrumbs' }).getByText(orgName), + ).toBeVisible(); const policyName = await createStoragePolicy(page); await attachStoragePolicy(page, policyName); @@ -184,6 +187,9 @@ test('Session Recording Test (AWS) @ent @aws', async ({ page }) => { )[0]; await page.getByRole('link', { name: 'Orgs', exact: true }).click(); await page.getByRole('link', { name: orgName }).click(); + await expect( + page.getByRole('navigation', { name: 'breadcrumbs' }).getByText(orgName), + ).toBeVisible(); await page .getByRole('link', { name: 'Storage Policies', exact: true }) .click(); diff --git a/ui/admin/tests/e2e/tests/session-recording-minio-ent.spec.js b/ui/admin/tests/e2e/tests/session-recording-minio-ent.spec.js index 00fa9f737..4e20342a8 100644 --- a/ui/admin/tests/e2e/tests/session-recording-minio-ent.spec.js +++ b/ui/admin/tests/e2e/tests/session-recording-minio-ent.spec.js @@ -122,6 +122,9 @@ test('Session Recording Test (MinIO) @ent @docker', async ({ page }) => { // Create storage policy in org scope: keep session recordings forever await page.getByRole('link', { name: 'Orgs', exact: true }).click(); await page.getByRole('link', { name: orgName }).click(); + await expect( + page.getByRole('navigation', { name: 'breadcrumbs' }).getByText(orgName), + ).toBeVisible(); const policyName = await createStoragePolicy(page); await attachStoragePolicy(page, policyName); @@ -186,6 +189,9 @@ test('Session Recording Test (MinIO) @ent @docker', async ({ page }) => { )[0]; await page.getByRole('link', { name: 'Orgs', exact: true }).click(); await page.getByRole('link', { name: orgName }).click(); + await expect( + page.getByRole('navigation', { name: 'breadcrumbs' }).getByText(orgName), + ).toBeVisible(); await page .getByRole('link', { name: 'Storage Policies', exact: true }) .click();