Files
threshold-ui/e2e-tests/global-setup.js
T
hashiccandZhihe Li b42ecbff36 Add api client for playwright e2e tests (#2901)
* chore: 🤖 add @openapitools/openapi-generator-cli

* chore: 🤖 Add @nestjs/core and @openapitools/openapi-generator-cli to ignoredBuiltDependencies

These packages use postinstall for a opencollective notice

* chore: 🤖 add package.json scripts for open-api client gen

* chore: 🤖 add openapi generated files

* chore: 🤖 add boundary api client fixture

* chore: 🤖 incorporate api client fixture with base fixture

* chore: 🤖 migrate existing test to use boundary api fixture

* refactor: 💡 remove org cleanup from test

* refactor: 💡 update sorting e2e test to use api client

* refactor: 💡 clean up api client resource clean up logging

* docs: ✏️ update jsdoc links for domain clients

* chore: 🤖 avoid adding copywright headers to generated api

* Add missing copyright headers

* chore: 🤖 remove fetch argument from api client class

The hope was to use request.fetch but playwright's fetch is a
non-standard fetch which causes the generated api client to fail when
using .clone() on the response

* chore: 🤖 add optional OPENAPI_SWAGGER_URL_OR_FILE for openapi-client
generation

The OPENAPI_SWAGGER_URL_OR_FILE env var can be used to specify the
-i flag the generate:api-client script with either:
* a relative path
* an absolute path
* a url like: https://raw.githubusercontent.com/hashicorp/boundary/refs/heads/main/internal/gen/controller.swagger.json

* refactor: 💡 clean up and refactor boundary-api-client fixture

* chore: 🤖 add extra doc links and delete methods

* test: 💍 add test to ensure that api-client fixture works

* test: 💍 update existing e2e test examples with api-client

* docs: ✏️ add comment for api-client e2e test

* docs: ✏️ add additional links to service docs for api clients

* refactor: 💡 cleanup api-client and corresponding test

* docs: ✏️ add api client fixture docs to e2e README

* fix: 🐛 fix regex

* remove unnecessary capture group
* add "-" to regex to allow for url segments like "storage-buckets" in
  "/v1/storage-buckets"

* docs: ✏️ comment potential edge case in e2e api client cleanup

* docs: ✏️ fix comment typo

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>

* docs: ✏️ remove auth flag for generating e2e client

* docs: ✏️ add mention that java is required for generate:api

* chore: 🤖 implement pr feedback

* chore: 🤖 Clean up api client and add more extensive test

* chore: 🤖 fix casing in api-client test

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>

---------

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
2025-08-12 18:08:35 -04:00

105 lines
3.6 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
import { chromium, test as baseTest, mergeTests } from '@playwright/test';
import { checkEnv } from './helpers/general.js';
import { boundaryApiClientTest } from './helpers/boundary-api-client.js';
import { LoginPage } from './admin/pages/login.js';
import path from 'path';
import dotenv from 'dotenv';
const __dirname = import.meta.dirname;
// Import environment variables from .env file if available
dotenv.config({ path: path.resolve(__dirname, './.env') });
async function globalSetup() {
await checkEnv([
'BOUNDARY_ADDR',
'E2E_PASSWORD_ADMIN_LOGIN_NAME',
'E2E_PASSWORD_ADMIN_PASSWORD',
'E2E_PASSWORD_AUTH_METHOD_ID',
]);
await authenticateToBoundary();
}
const authenticateToBoundary = async () => {
// Log in and save the authenticated state to reuse in tests
const browser = await chromium.launch();
const browserContext = await browser.newContext();
const page = await browserContext.newPage();
await page.goto(baseUrl);
const loginPage = new LoginPage(page);
await loginPage.login(
process.env.E2E_PASSWORD_ADMIN_LOGIN_NAME,
process.env.E2E_PASSWORD_ADMIN_PASSWORD,
);
const storageState = await browserContext.storageState({
path: authenticatedState,
});
const state = JSON.parse(storageState.origins[0].localStorage[0].value);
// Set the token in the environment for use in API requests
process.env.E2E_TOKEN = state.authenticated.token;
await browserContext.close();
await browser.close();
};
export default globalSetup;
export const baseUrl =
process.env.BOUNDARY_ADDR_BRANCH ?? process.env.BOUNDARY_ADDR;
export const authenticatedState = path.resolve(
__dirname,
'./.auth/authenticated-state.json',
);
// Centralized location for environment variables used in tests
export const base = baseTest.extend({
adminAuthMethodId: process.env.E2E_PASSWORD_AUTH_METHOD_ID,
adminLoginName: process.env.E2E_PASSWORD_ADMIN_LOGIN_NAME,
adminPassword: process.env.E2E_PASSWORD_ADMIN_PASSWORD,
awsAccessKeyId: process.env.E2E_AWS_ACCESS_KEY_ID,
awsBucketName: process.env.E2E_AWS_BUCKET_NAME,
awsHostSetFilter: process.env.E2E_AWS_HOST_SET_FILTER,
awsHostSetIps: process.env.E2E_AWS_HOST_SET_IPS,
awsRegion: process.env.E2E_AWS_REGION,
awsSecretAccessKey: process.env.E2E_AWS_SECRET_ACCESS_KEY,
controllerAddr: process.env.BOUNDARY_ADDR,
bucketAccessKeyId: process.env.E2E_BUCKET_ACCESS_KEY_ID,
bucketEndpointUrl: process.env.E2E_BUCKET_ENDPOINT_URL,
bucketName: process.env.E2E_BUCKET_NAME,
bucketSecretAccessKey: process.env.E2E_BUCKET_SECRET_ACCESS_KEY,
ldapAddr: process.env.E2E_LDAP_ADDR,
ldapAdminDn: process.env.E2E_LDAP_ADMIN_DN,
ldapAdminPassword: process.env.E2E_LDAP_ADMIN_PASSWORD,
ldapDomainDn: process.env.E2E_LDAP_DOMAIN_DN,
ldapGroupName: process.env.E2E_LDAP_GROUP_NAME,
ldapUserName: process.env.E2E_LDAP_USER_NAME,
ldapUserPassword: process.env.E2E_LDAP_USER_PASSWORD,
region: process.env.E2E_REGION,
sshCaKey: process.env.E2E_SSH_CA_KEY,
sshCaKeyPublic: process.env.E2E_SSH_CA_KEY_PUBLIC,
sshKeyPath: process.env.E2E_SSH_KEY_PATH,
sshUser: process.env.E2E_SSH_USER,
targetAddress: process.env.E2E_TARGET_ADDRESS,
targetPort: process.env.E2E_TARGET_PORT,
vaultAddr: process.env.E2E_VAULT_ADDR_PUBLIC,
vaultAddrPrivate: process.env.E2E_VAULT_ADDR_PRIVATE,
workerTagEgress: process.env.E2E_WORKER_TAG_EGRESS,
request: async ({ playwright }, use) => {
const request = await playwright.request.newContext({
baseURL: process.env.BOUNDARY_ADDR,
});
await use(request);
},
});
export const test = mergeTests(base, boundaryApiClientTest);