From 20f8c990131b33d70bb50c99dbe19b4126ac0bc6 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Mon, 22 Apr 2024 10:39:53 -0400 Subject: [PATCH] test(e2e): Fixes for 0.16.0 (#2258) --- ui/admin/tests/e2e/helpers/boundary-cli.js | 2 +- ui/admin/tests/e2e/helpers/boundary-ui.js | 29 ++++++++++++------- .../e2e/tests/credential-store-static.spec.js | 16 ++++------ .../e2e/tests/credential-store-vault.spec.js | 16 ++++------ .../e2e/tests/session-recording-ent.spec.js | 13 +++++---- 5 files changed, 39 insertions(+), 37 deletions(-) diff --git a/ui/admin/tests/e2e/helpers/boundary-cli.js b/ui/admin/tests/e2e/helpers/boundary-cli.js index 832890be7..30db22853 100644 --- a/ui/admin/tests/e2e/helpers/boundary-cli.js +++ b/ui/admin/tests/e2e/helpers/boundary-cli.js @@ -626,7 +626,7 @@ exports.waitForSessionRecordingCli = async (storageBucketId) => { do { i = i + 1; const sessionRecordings = JSON.parse( - execSync('boundary session-recordings list -format json'), + execSync('boundary session-recordings list --recursive -format json'), ); filteredSessionRecording = sessionRecordings.items.filter( (obj) => diff --git a/ui/admin/tests/e2e/helpers/boundary-ui.js b/ui/admin/tests/e2e/helpers/boundary-ui.js index e9b1a4600..099a6fd9f 100644 --- a/ui/admin/tests/e2e/helpers/boundary-ui.js +++ b/ui/admin/tests/e2e/helpers/boundary-ui.js @@ -554,6 +554,9 @@ exports.waitForSessionToBeVisible = async (page, targetName) => { .getByRole('navigation', { name: 'Resources' }) .getByRole('link', { name: 'Sessions' }) .click(); + await expect( + page.getByRole('navigation', { name: 'breadcrumbs' }).getByText('Sessions'), + ).toBeVisible(); let i = 0; let sessionIsVisible = false; let sessionIsActive = false; @@ -568,8 +571,17 @@ exports.waitForSessionToBeVisible = async (page, targetName) => { if (sessionIsVisible && sessionIsActive) { break; } - await page.getByRole('button', { name: 'Refresh' }).click(); - await expect(page.getByRole('button', { name: 'Refresh' })).toBeEnabled(); + + const noSessionsAvailable = await page + .getByText('No Sessions Available', { exact: true }) + .isVisible(); + if (noSessionsAvailable) { + await new Promise((r) => setTimeout(r, 1000)); + await page.reload(); + } else { + await page.getByRole('button', { name: 'Refresh' }).click(); + await expect(page.getByRole('button', { name: 'Refresh' })).toBeEnabled(); + } } while (i < 5); if (!sessionIsVisible) { @@ -769,10 +781,7 @@ exports.createUser = async (page) => { .getByRole('navigation', { name: 'IAM' }) .getByRole('link', { name: 'Users' }) .click(); - await page - .getByRole('article') - .getByRole('link', { name: 'New', exact: true }) - .click(); + await page.getByRole('link', { name: 'New', exact: true }).click(); await page.getByLabel('Name').fill(userName); await page.getByRole('button', { name: 'Save' }).click(); await expect( @@ -818,10 +827,7 @@ exports.createGroup = async (page) => { .getByRole('navigation', { name: 'IAM' }) .getByRole('link', { name: 'Groups' }) .click(); - await page - .getByRole('article') - .getByRole('link', { name: 'New', exact: true }) - .click(); + await page.getByRole('link', { name: 'New', exact: true }).click(); await page.getByLabel('Name').fill(groupName); await page.getByRole('button', { name: 'Save' }).click(); await expect( @@ -926,6 +932,7 @@ exports.addGrantsToGroup = async (page, grants) => { /** * Uses the UI to create a new Storage Bucket. Assumes you have selected the desired scope. * @param {Page} page Playwright page object + * @param {string} scope Scope of the Storage Bucket * @param {string} bucketName Name of the Storage Bucket * @param {string} region Region of the Storage Bucket * @param {string} accessKeyId Access Key ID for the Storage Bucket @@ -935,6 +942,7 @@ exports.addGrantsToGroup = async (page, grants) => { */ exports.createStorageBucket = async ( page, + scope, bucketName, region, accessKeyId, @@ -947,6 +955,7 @@ exports.createStorageBucket = async ( .click(); await page.getByRole('link', { name: 'New Storage Bucket' }).click(); await page.getByLabel(new RegExp('Name*')).fill(storageBucketName); + await page.getByLabel('Scope').selectOption({ label: scope }); await page.getByLabel('Bucket name').fill(bucketName); await page.getByLabel('Region').fill(region); await page.getByLabel('Access key ID').fill(accessKeyId); 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 6d69cca7c..25446234a 100644 --- a/ui/admin/tests/e2e/tests/credential-store-static.spec.js +++ b/ui/admin/tests/e2e/tests/credential-store-static.spec.js @@ -16,14 +16,10 @@ const { const { createOrg, createProject, - createHostCatalog, - createHostSet, - createHostInHostSet, - createTarget, + createTargetWithAddress, createStaticCredentialStore, createStaticCredentialKeyPair, addBrokeredCredentialsToTarget, - addHostSourceToTarget, } = require('../helpers/boundary-ui'); test.use({ storageState: authenticatedState }); @@ -48,11 +44,11 @@ test.beforeEach(async ({ page }) => { orgName = await createOrg(page); projectName = await createProject(page); - await createHostCatalog(page); - const hostSetName = await createHostSet(page); - await createHostInHostSet(page, process.env.E2E_TARGET_ADDRESS); - targetName = await createTarget(page, process.env.E2E_TARGET_PORT); - await addHostSourceToTarget(page, hostSetName); + targetName = await createTargetWithAddress( + page, + process.env.E2E_TARGET_ADDRESS, + process.env.E2E_TARGET_PORT, + ); await createStaticCredentialStore(page); }); diff --git a/ui/admin/tests/e2e/tests/credential-store-vault.spec.js b/ui/admin/tests/e2e/tests/credential-store-vault.spec.js index 1b71fc69e..e7eb0ed3c 100644 --- a/ui/admin/tests/e2e/tests/credential-store-vault.spec.js +++ b/ui/admin/tests/e2e/tests/credential-store-vault.spec.js @@ -18,11 +18,7 @@ const { createOrg, createProject, createVaultCredentialStore, - createHostCatalog, - createHostSet, - createHostInHostSet, - createTarget, - addHostSourceToTarget, + createTargetWithAddress, addBrokeredCredentialsToTarget, } = require('../helpers/boundary-ui'); const { readFile } = require('fs/promises'); @@ -103,11 +99,11 @@ test('Vault Credential Store (User & Key Pair) @ce @aws @docker', async ({ ); const project = projects.items.filter((obj) => obj.name == projectName)[0]; - await createHostCatalog(page); - const hostSetName = await createHostSet(page); - await createHostInHostSet(page, process.env.E2E_TARGET_ADDRESS); - const targetName = await createTarget(page, process.env.E2E_TARGET_PORT); - await addHostSourceToTarget(page, hostSetName); + const targetName = await createTargetWithAddress( + page, + process.env.E2E_TARGET_ADDRESS, + process.env.E2E_TARGET_PORT, + ); const targets = JSON.parse( execSync(`boundary targets list -format json -scope-id ${project.id}`), ); diff --git a/ui/admin/tests/e2e/tests/session-recording-ent.spec.js b/ui/admin/tests/e2e/tests/session-recording-ent.spec.js index c5510b20b..823f30653 100644 --- a/ui/admin/tests/e2e/tests/session-recording-ent.spec.js +++ b/ui/admin/tests/e2e/tests/session-recording-ent.spec.js @@ -79,6 +79,7 @@ test('Verify session recording can be deleted @ent @aws', async ({ page }) => { await page.getByRole('link', { name: 'Orgs', exact: true }).click(); const storageBucketName = await createStorageBucket( page, + orgName, process.env.E2E_AWS_BUCKET_NAME, process.env.E2E_AWS_REGION, process.env.E2E_AWS_ACCESS_KEY_ID, @@ -86,7 +87,7 @@ test('Verify session recording can be deleted @ent @aws', async ({ page }) => { `"${process.env.E2E_WORKER_TAG_EGRESS}" in "/tags/type"`, ); const storageBuckets = JSON.parse( - execSync('boundary storage-buckets list -format json'), + execSync('boundary storage-buckets list --recursive -format json'), ); storageBucket = storageBuckets.items.filter( (obj) => obj.name == storageBucketName, @@ -94,8 +95,8 @@ test('Verify session recording can be deleted @ent @aws', async ({ page }) => { // Create target await page.getByRole('link', { name: 'Orgs', exact: true }).click(); - await page.getByRole('link', { name: orgId }).click(); - await page.getByRole('link', { name: projectId }).click(); + await page.getByRole('link', { name: orgName }).click(); + await page.getByRole('link', { name: projectName }).click(); const targetName = await createSshTargetWithAddressAndWorkerFilterEnt( page, process.env.E2E_TARGET_ADDRESS, @@ -118,7 +119,7 @@ test('Verify session recording can be deleted @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: orgId }).click(); + await page.getByRole('link', { name: orgName }).click(); const policyName = await createStoragePolicy(page); await attachStoragePolicy(page, policyName); @@ -135,7 +136,7 @@ test('Verify session recording can be deleted @ent @aws', async ({ page }) => { await expect( page.getByRole('alert').getByText('Success', { exact: true }), ).toBeVisible(); - await page.getByRole('button', { name: 'Dismiss' }).click(); + await page.getByRole('button', { name: 'Dismiss', exact: true }).click(); await waitForSessionRecordingCli(storageBucket.id); // Play back session recording @@ -182,7 +183,7 @@ test('Verify session recording can be deleted @ent @aws', async ({ page }) => { (obj) => obj.name == policyName, )[0]; await page.getByRole('link', { name: 'Orgs', exact: true }).click(); - await page.getByRole('link', { name: orgId }).click(); + await page.getByRole('link', { name: orgName }).click(); await page .getByRole('link', { name: 'Storage Policies', exact: true }) .click();