* test(e2e): Address deprecation * test(e2e): Add additional connection assertions on tests * CR: Fix flake when waiting for sessions If no sessions are available and the page needs to reload, we should wait to ensure that the page has loaded before checking what the state of the sessions are * CR: Address flake in connect methods Noticed an issue where a session recording was not playable. The theory is that the session didn't last long enough before it was cancelled. This adds a 2 second wait after establishing a connection before continuing. * CR: Use authenticated state by default * CR: Update dynamic host catalog assertion * CR: Simplify host set checks - Use .all() when looping - Add check to see if we need to reload the page or not * CR: Be more specific with locator Ran into a conflict with the Static/Dynamic host catalog type and the Static/Dynamic credential type. * CR: Update connection methods to be more resilient Rather than using a hardcoded sleep, we will now run a command on the target and wait for a specific string to return before continuing. * CR
138 lines
4.3 KiB
JavaScript
138 lines
4.3 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: BUSL-1.1
|
|
*/
|
|
|
|
import { test } from '../../global-setup.js';
|
|
import { expect } from '@playwright/test';
|
|
import { execSync } from 'node:child_process';
|
|
|
|
import * as boundaryCli from '../../helpers/boundary-cli';
|
|
import { AuthMethodsPage } from '../pages/auth-methods.js';
|
|
import { LoginPage } from '../pages/login.js';
|
|
import { OrgsPage } from '../pages/orgs.js';
|
|
import { UsersPage } from '../pages/users.js';
|
|
|
|
// Reset storage state for this file to avoid being authenticated
|
|
test.use({ storageState: { cookies: [], origins: [] } });
|
|
|
|
test.beforeAll(async () => {
|
|
await boundaryCli.checkBoundaryCli();
|
|
});
|
|
|
|
test('Verify new auth-method can be created and assigned to users @ce @ent @aws @docker', async ({
|
|
page,
|
|
baseURL,
|
|
adminAuthMethodId,
|
|
adminLoginName,
|
|
adminPassword,
|
|
}) => {
|
|
await page.goto('/');
|
|
let orgName;
|
|
let authMethodName;
|
|
try {
|
|
// Log in
|
|
const loginPage = new LoginPage(page);
|
|
await loginPage.login(adminLoginName, adminPassword);
|
|
await expect(
|
|
page.getByRole('navigation', { name: 'breadcrumbs' }).getByText('Orgs'),
|
|
).toBeVisible();
|
|
|
|
// Create a new password auth method and account
|
|
const orgsPage = new OrgsPage(page);
|
|
orgName = await orgsPage.createOrg();
|
|
|
|
const authMethodsPage = new AuthMethodsPage(page);
|
|
authMethodName = await authMethodsPage.createPasswordAuthMethod();
|
|
const username = 'test-user';
|
|
const password = 'password';
|
|
|
|
await authMethodsPage.createPasswordAccount(username, password);
|
|
await authMethodsPage.makeAuthMethodPrimary();
|
|
const usersPage = new UsersPage(page);
|
|
await usersPage.createUser();
|
|
await usersPage.addAccountToUser(username);
|
|
|
|
// Log in using new account
|
|
await loginPage.logout(adminLoginName);
|
|
await page.getByText('Choose a different scope').click();
|
|
await page.getByRole('link', { name: orgName }).click();
|
|
await page.getByRole('link', { name: authMethodName }).click();
|
|
|
|
await loginPage.login(username, password);
|
|
await expect(
|
|
page
|
|
.getByRole('navigation', { name: 'breadcrumbs' })
|
|
.getByText('Projects'),
|
|
).toBeVisible();
|
|
|
|
// Log back in as admin
|
|
await loginPage.logout(username);
|
|
await loginPage.login(adminLoginName, adminPassword);
|
|
|
|
// Set a new password on the account
|
|
await page
|
|
.getByRole('navigation', { name: 'General' })
|
|
.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' })
|
|
.click();
|
|
await page.getByRole('link', { name: authMethodName }).click();
|
|
await page.getByRole('link', { name: 'Accounts', exact: true }).click();
|
|
await page.getByRole('link', { name: username }).click();
|
|
const newPassword = 'new-password';
|
|
await authMethodsPage.setPasswordToAccount(newPassword);
|
|
|
|
// Log in using new password
|
|
await loginPage.logout(adminLoginName);
|
|
|
|
await page.getByText('Choose a different scope').click();
|
|
await page.getByRole('link', { name: orgName }).click();
|
|
await page.getByRole('link', { name: authMethodName }).click();
|
|
await loginPage.login(username, newPassword);
|
|
await expect(
|
|
page
|
|
.getByRole('navigation', { name: 'breadcrumbs' })
|
|
.getByText('Projects'),
|
|
).toBeVisible();
|
|
} finally {
|
|
await boundaryCli.authenticateBoundary(
|
|
baseURL,
|
|
adminAuthMethodId,
|
|
adminLoginName,
|
|
adminPassword,
|
|
);
|
|
|
|
// There is an issue with deleting an org that has an auth method unless you
|
|
// delete the auth method first
|
|
if (authMethodName) {
|
|
const authMethods = JSON.parse(
|
|
execSync('boundary auth-methods list --recursive -format json'),
|
|
);
|
|
const authMethod = authMethods.items.filter(
|
|
(obj) => obj.name == authMethodName,
|
|
)[0];
|
|
if (authMethod) {
|
|
try {
|
|
execSync('boundary auth-methods delete -id=' + authMethod.id);
|
|
} catch (e) {
|
|
console.log(`${e.stderr}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (orgName) {
|
|
const orgId = await boundaryCli.getOrgIdFromName(orgName);
|
|
if (orgId) {
|
|
await boundaryCli.deleteScope(orgId);
|
|
}
|
|
}
|
|
}
|
|
});
|