From 7b321c8cd1d35699ceb8a93265232c2ccec4f1c3 Mon Sep 17 00:00:00 2001 From: StylusFrost Date: Mon, 20 Oct 2025 17:00:42 +0200 Subject: [PATCH] test(ui): enhance M365 provider management E2E tests - Added support for certificate-based authentication in M365 provider management. - Updated the ProvidersPage interface to include fields for certificate credentials. - Enhanced E2E tests to validate the complete flow of adding a new M365 provider with certificate credentials. - Included necessary environment variable checks for certificate content and updated test steps accordingly. --- .github/workflows/ui-e2e-tests.yml | 1 + ui/tests/providers/providers-page.ts | 61 ++- ui/tests/providers/providers.md | 60 ++- ui/tests/providers/providers.spec.ts | 635 ++++++++++++++++----------- 4 files changed, 484 insertions(+), 273 deletions(-) diff --git a/.github/workflows/ui-e2e-tests.yml b/.github/workflows/ui-e2e-tests.yml index dfa58341b7..39b430073a 100644 --- a/.github/workflows/ui-e2e-tests.yml +++ b/.github/workflows/ui-e2e-tests.yml @@ -32,6 +32,7 @@ jobs: E2E_M365_CLIENT_ID: ${{ secrets.E2E_M365_CLIENT_ID }} E2E_M365_SECRET_ID: ${{ secrets.E2E_M365_SECRET_ID }} E2E_M365_TENANT_ID: ${{ secrets.E2E_M365_TENANT_ID }} + E2E_M365_CERTIFICATE_CONTENT: ${{ secrets.E2E_M365_CERTIFICATE_CONTENT }} steps: - name: Checkout repository diff --git a/ui/tests/providers/providers-page.ts b/ui/tests/providers/providers-page.ts index f395cf5eda..8be6d3e0e3 100644 --- a/ui/tests/providers/providers-page.ts +++ b/ui/tests/providers/providers-page.ts @@ -55,7 +55,8 @@ export interface AZUREProviderCredential { // M365 credential options export const M365_CREDENTIAL_OPTIONS = { - M365_CREDENTIALS: "credentials" + M365_CREDENTIALS: "credentials", + M365_CERTIFICATE_CREDENTIALS: "certificate" } as const; // M365 credential type @@ -65,8 +66,9 @@ type M365CredentialType = (typeof M365_CREDENTIAL_OPTIONS)[keyof typeof M365_CRE export interface M365ProviderCredential { type: M365CredentialType; clientId:string; - clientSecret:string; + clientSecret?:string; tenantId:string; + certificateContent?:string; } @@ -97,6 +99,10 @@ export class ProvidersPage extends BasePage { readonly roleCredentialsRadio: Locator; readonly staticCredentialsRadio: Locator; + // M365 credentials type selection + readonly m365StaticCredentialsRadio: Locator; + readonly m365CertificateCredentialsRadio: Locator; + // AWS role credentials form readonly roleArnInput: Locator; readonly externalIdInput: Locator; @@ -116,6 +122,7 @@ export class ProvidersPage extends BasePage { readonly m365ClientIdInput: Locator; readonly m365ClientSecretInput: Locator; readonly m365TenantIdInput: Locator; + readonly m365CertificateContentInput: Locator; // Delete button readonly deleteProviderConfirmationButton: Locator; @@ -163,6 +170,7 @@ export class ProvidersPage extends BasePage { this.m365ClientIdInput = page.getByLabel("Client ID"); this.m365ClientSecretInput = page.getByLabel("Client Secret"); this.m365TenantIdInput = page.getByLabel("Tenant ID"); + this.m365CertificateContentInput = page.getByLabel("Certificate Content"); // Alias input this.aliasInput = page.getByLabel("Provider alias (optional)"); @@ -190,6 +198,15 @@ export class ProvidersPage extends BasePage { name: /Connect via Credentials/i, }); + + // Radios for selecting M365 credentials method + this.m365StaticCredentialsRadio = page.getByRole("radio", { + name: /App Client Secret Credentials/i, + }); + this.m365CertificateCredentialsRadio = page.getByRole("radio", { + name: /App Certificate Credentials/i, + }); + // Inputs for IAM Role credentials this.roleArnInput = page.getByLabel("Role ARN"); this.externalIdInput = page.getByLabel("External ID"); @@ -353,6 +370,21 @@ export class ProvidersPage extends BasePage { await this.waitForPageLoad(); } + async selectM365CredentialsType(type: M365CredentialType): Promise { + // Ensure we are on the add-credentials page where the selector exists + + await expect(this.page).toHaveURL(/\/providers\/add-credentials/); + if (type === M365_CREDENTIAL_OPTIONS.M365_CREDENTIALS) { + await this.m365StaticCredentialsRadio.click({ force: true }); + } else if (type === M365_CREDENTIAL_OPTIONS.M365_CERTIFICATE_CREDENTIALS) { + await this.m365CertificateCredentialsRadio.click({ force: true }); + } else { + throw new Error(`Invalid M365 credential type: ${type}`); + } + // Wait for the page to load + await this.waitForPageLoad(); + } + async fillRoleCredentials(credentials: AWSProviderCredential): Promise { // Fill the role credentials form @@ -412,6 +444,21 @@ export class ProvidersPage extends BasePage { } } + async fillM365CertificateCredentials(credentials: M365ProviderCredential): Promise { + // Fill the m365 certificate credentials form + + if (credentials.clientId) { + await this.m365ClientIdInput.fill(credentials.clientId); + } + if (credentials.certificateContent) { + await this.m365CertificateContentInput.fill(credentials.certificateContent); + } + if (credentials.tenantId) { + await this.m365TenantIdInput.fill(credentials.tenantId); + } + } + + async verifyPageLoaded(): Promise { // Verify the providers page is loaded @@ -434,6 +481,16 @@ export class ProvidersPage extends BasePage { await expect(this.roleCredentialsRadio).toBeVisible(); } + async verifyM365CredentialsPageLoaded(): Promise { + // Verify the M365 credentials page is loaded + + await expect(this.page).toHaveTitle(/Prowler/); + await expect(this.m365StaticCredentialsRadio).toBeVisible(); + await expect(this.m365CertificateCredentialsRadio).toBeVisible(); + } + + + async verifyLaunchScanPageLoaded(): Promise { // Verify the launch scan page is loaded diff --git a/ui/tests/providers/providers.md b/ui/tests/providers/providers.md index 2acb6305db..7ed8a74755 100644 --- a/ui/tests/providers/providers.md +++ b/ui/tests/providers/providers.md @@ -187,9 +187,10 @@ 2. Click "Add Provider" button 3. Select M365 provider type 4. Fill provider details (domain ID and alias) -5. Fill M365 credentials (client ID, client secret, tenant ID) -6. Launch initial scan -7. Verify redirect to provider management page +5. Select static credentials type +6. Fill M365 credentials (client ID, client secret, tenant ID) +7. Launch initial scan +8. Verify redirect to provider management page ### Expected Result: @@ -211,3 +212,56 @@ - Provider cleanup performed before each test to ensure clean state - Requires valid Microsoft 365 tenant with appropriate permissions - Client credentials must have sufficient permissions for security scanning + +--- + +## Test Case: `PROVIDER-E2E-005` - Add M365 Provider with Certificate Credentials + +**Priority:** `critical` + +**Tags:** + +- type → @e2e, @serial +- feature → @providers +- provider → @m365 + +**Description/Objective:** Validates the complete flow of adding a new Microsoft 365 provider using certificate-based authentication (Client ID, Tenant ID, Certificate Content) tied to a Domain ID. + +**Preconditions:** + +- Admin user authentication required (admin.auth.setup setup) +- Environment variables configured: E2E_M365_DOMAIN_ID, E2E_M365_CLIENT_ID, E2E_M365_TENANT_ID, E2E_M365_CERTIFICATE_CONTENT +- Remove any existing provider with the same Domain ID before starting the test +- This test must be run serially and never in parallel with other tests, as it requires the Domain ID not to be already registered beforehand. + +### Flow Steps: + +1. Navigate to providers page +2. Click "Add Provider" button +3. Select M365 provider type +4. Fill provider details (domain ID and alias) +5. Select certificate credentials type +6. Fill M365 certificate credentials (client ID, tenant ID, certificate content) +7. Launch initial scan +8. Verify redirect to provider management page + +### Expected Result: + +- M365 provider successfully added with certificate credentials +- Initial scan launched successfully +- User redirected to provider details page + +### Key verification points: + +- Provider page loads correctly +- Connect account page displays M365 option +- Certificate credentials form accepts all required fields +- Launch scan page appears +- Successful redirect to provider page after scan launch + +### Notes: + +- Test uses environment variables for M365 certificate credentials +- Provider cleanup performed before each test to ensure clean state +- Requires valid Microsoft 365 tenant with certificate-based authentication +- Certificate must be properly configured and have sufficient permissions for security scanning diff --git a/ui/tests/providers/providers.spec.ts b/ui/tests/providers/providers.spec.ts index 39878e53b4..f906a7c8d5 100644 --- a/ui/tests/providers/providers.spec.ts +++ b/ui/tests/providers/providers.spec.ts @@ -10,318 +10,417 @@ import { AZURE_CREDENTIAL_OPTIONS, M365ProviderData, M365ProviderCredential, - M365_CREDENTIAL_OPTIONS + M365_CREDENTIAL_OPTIONS, } from "./providers-page"; +test.describe.serial("AddProvider", () => { + test.describe("Add AWS Provider", () => { + // Providers page object + let providersPage: ProvidersPage; -test.describe.serial("Add AWS Provider", () => { + // Test data from environment variables + const accountId = process.env.E2E_AWS_PROVIDER_ACCOUNT_ID; + const accessKey = process.env.E2E_AWS_PROVIDER_ACCESS_KEY; + const secretKey = process.env.E2E_AWS_PROVIDER_SECRET_KEY; + const roleArn = process.env.E2E_AWS_PROVIDER_ROLE_ARN; - // Providers page object - let providersPage: ProvidersPage; + // Validate required environment variables + if (!accountId) { + throw new Error( + "E2E_AWS_PROVIDER_ACCOUNT_ID environment variable is not set", + ); + } - // Test data from environment variables - const accountId = process.env.E2E_AWS_PROVIDER_ACCOUNT_ID; - const accessKey = process.env.E2E_AWS_PROVIDER_ACCESS_KEY; - const secretKey = process.env.E2E_AWS_PROVIDER_SECRET_KEY; - const roleArn = process.env.E2E_AWS_PROVIDER_ROLE_ARN; + // Setup before each test + test.beforeEach(async ({ page }) => { + providersPage = new ProvidersPage(page); + // Clean up existing provider to ensure clean test state + await helpers.deleteProviderIfExists(page, accountId); + }); - // Validate required environment variables - if (!accountId) { - throw new Error( - "E2E_AWS_PROVIDER_ACCOUNT_ID environment variable is not set", - ); - } + // Use admin authentication for provider management + test.use({ storageState: "playwright/.auth/admin_user.json" }); - // Setup before each test - test.beforeEach(async ({ page }) => { - providersPage = new ProvidersPage(page); - // Clean up existing provider to ensure clean test state - await helpers.deleteProviderIfExists(page, accountId); - }); + test( + "should add a new AWS provider with static credentials", + { + tag: [ + "@critical", + "@e2e", + "@providers", + "@aws", + "@serial", + "@PROVIDER-E2E-001", + ], + }, + async ({ page }) => { + // Validate required environment variables + if (!accountId || !accessKey || !secretKey) { + throw new Error( + "E2E_AWS_PROVIDER_ACCOUNT_ID, E2E_AWS_PROVIDER_ACCESS_KEY, and E2E_AWS_PROVIDER_SECRET_KEY environment variables are not set", + ); + } - // Use admin authentication for provider management - test.use({ storageState: "playwright/.auth/admin_user.json" }); + // Prepare test data for AWS provider + const awsProviderData: AWSProviderData = { + accountId: accountId, + alias: "Test E2E AWS Account - Credentials", + }; + // Prepare static credentials + const staticCredentials: AWSProviderCredential = { + type: AWS_CREDENTIAL_OPTIONS.AWS_CREDENTIALS, + accessKeyId: accessKey, + secretAccessKey: secretKey, + }; - test( - "should add a new AWS provider with static credentials", - { - tag: ["@critical", "@e2e", "@providers", "@aws", "@serial", "@PROVIDER-E2E-001"], - }, - async ({ page }) => { + // Navigate to providers page + await providersPage.goto(); + await providersPage.verifyPageLoaded(); - // Validate required environment variables - if (!accountId || !accessKey || !secretKey) { - throw new Error( - "E2E_AWS_PROVIDER_ACCOUNT_ID, E2E_AWS_PROVIDER_ACCESS_KEY, and E2E_AWS_PROVIDER_SECRET_KEY environment variables are not set", + // Start adding new provider + await providersPage.clickAddProvider(); + await providersPage.verifyConnectAccountPageLoaded(); + + // Select AWS provider + await providersPage.selectAWSProvider(); + + // Fill provider details + await providersPage.fillAWSProviderDetails(awsProviderData); + await providersPage.clickNext(); + + // Select static credentials type + await providersPage.selectCredentialsType( + AWS_CREDENTIAL_OPTIONS.AWS_CREDENTIALS, ); - } + await providersPage.verifyCredentialsPageLoaded(); - // Prepare test data for AWS provider - const awsProviderData: AWSProviderData = { - accountId: accountId, - alias: "Test E2E AWS Account - Credentials", - }; + // Fill static credentials + await providersPage.fillStaticCredentials(staticCredentials); + await providersPage.clickNext(); - // Prepare static credentials - const staticCredentials: AWSProviderCredential = { - type: AWS_CREDENTIAL_OPTIONS.AWS_CREDENTIALS, - accessKeyId: accessKey, - secretAccessKey: secretKey, - }; + // Launch scan + await providersPage.verifyLaunchScanPageLoaded(); + await providersPage.clickNext(); - // Navigate to providers page - await providersPage.goto(); - await providersPage.verifyPageLoaded(); + // Wait for redirect to provider page + await providersPage.verifyLoadProviderPageAfterNewProvider(); + }, + ); - // Start adding new provider - await providersPage.clickAddProvider(); - await providersPage.verifyConnectAccountPageLoaded(); + test( + "should add a new AWS provider with assume role credentials with Access Key and Secret Key", + { + tag: [ + "@critical", + "@e2e", + "@providers", + "@aws", + "@serial", + "@PROVIDER-E2E-002", + ], + }, + async ({ page }) => { + // Validate required environment variables + if (!accountId || !accessKey || !secretKey || !roleArn) { + throw new Error( + "E2E_AWS_PROVIDER_ACCOUNT_ID, E2E_AWS_PROVIDER_ACCESS_KEY, E2E_AWS_PROVIDER_SECRET_KEY, and E2E_AWS_PROVIDER_ROLE_ARN environment variables are not set", + ); + } - // Select AWS provider - await providersPage.selectAWSProvider(); + // Prepare test data for AWS provider + const awsProviderData: AWSProviderData = { + accountId: accountId, + alias: "Test E2E AWS Account - Credentials", + }; - // Fill provider details - await providersPage.fillAWSProviderDetails(awsProviderData); - await providersPage.clickNext(); + // Prepare role-based credentials + const roleCredentials: AWSProviderCredential = { + type: AWS_CREDENTIAL_OPTIONS.AWS_ROLE_ARN, + accessKeyId: accessKey, + secretAccessKey: secretKey, + roleArn: roleArn, + }; - // Select static credentials type - await providersPage.selectCredentialsType(AWS_CREDENTIAL_OPTIONS.AWS_CREDENTIALS); - await providersPage.verifyCredentialsPageLoaded(); + // Navigate to providers page + await providersPage.goto(); + await providersPage.verifyPageLoaded(); - // Fill static credentials - await providersPage.fillStaticCredentials(staticCredentials); - await providersPage.clickNext(); + // Start adding new provider + await providersPage.clickAddProvider(); + await providersPage.verifyConnectAccountPageLoaded(); - // Launch scan - await providersPage.verifyLaunchScanPageLoaded(); - await providersPage.clickNext(); + // Select AWS provider + await providersPage.selectAWSProvider(); - // Wait for redirect to provider page - await providersPage.verifyLoadProviderPageAfterNewProvider(); - } - ) + // Fill provider details + await providersPage.fillAWSProviderDetails(awsProviderData); + await providersPage.clickNext(); - test( - "should add a new AWS provider with assume role credentials with Access Key and Secret Key", - { - tag: ["@critical", "@e2e", "@providers", "@aws","@serial", "@PROVIDER-E2E-002"], - }, - async ({ page }) => { - - // Validate required environment variables - if (!accountId || !accessKey || !secretKey || !roleArn) { - throw new Error( - "E2E_AWS_PROVIDER_ACCOUNT_ID, E2E_AWS_PROVIDER_ACCESS_KEY, E2E_AWS_PROVIDER_SECRET_KEY, and E2E_AWS_PROVIDER_ROLE_ARN environment variables are not set", + // Select role credentials type + await providersPage.selectCredentialsType( + AWS_CREDENTIAL_OPTIONS.AWS_ROLE_ARN, ); - } + await providersPage.verifyCredentialsPageLoaded(); - // Prepare test data for AWS provider - const awsProviderData: AWSProviderData = { - accountId: accountId, - alias: "Test E2E AWS Account - Credentials", - }; + // Fill role credentials + await providersPage.fillRoleCredentials(roleCredentials); + await providersPage.clickNext(); - // Prepare role-based credentials - const roleCredentials: AWSProviderCredential = { - type: AWS_CREDENTIAL_OPTIONS.AWS_ROLE_ARN, - accessKeyId: accessKey, - secretAccessKey: secretKey, - roleArn: roleArn, - }; + // Launch scan + await providersPage.verifyLaunchScanPageLoaded(); + await providersPage.clickNext(); - // Navigate to providers page - await providersPage.goto(); - await providersPage.verifyPageLoaded(); - - // Start adding new provider - await providersPage.clickAddProvider(); - await providersPage.verifyConnectAccountPageLoaded(); - - // Select AWS provider - await providersPage.selectAWSProvider(); - - // Fill provider details - await providersPage.fillAWSProviderDetails(awsProviderData); - await providersPage.clickNext(); - - // Select role credentials type - await providersPage.selectCredentialsType(AWS_CREDENTIAL_OPTIONS.AWS_ROLE_ARN); - await providersPage.verifyCredentialsPageLoaded(); - - // Fill role credentials - await providersPage.fillRoleCredentials(roleCredentials); - await providersPage.clickNext(); - - // Launch scan - await providersPage.verifyLaunchScanPageLoaded(); - await providersPage.clickNext(); - - // Wait for redirect to provider page - await providersPage.verifyLoadProviderPageAfterNewProvider(); - } - ); -}); - - -test.describe.serial("Add AZURE Provider", () => { - - // Providers page object - let providersPage: ProvidersPage; - - // Test data from environment variables - const subscriptionId= process.env.E2E_AZURE_SUBSCRIPTION_ID; - const clientId= process.env.E2E_AZURE_CLIENT_ID - const clientSecret= process.env.E2E_AZURE_SECRET_ID - const tenantId= process.env.E2E_AZURE_TENANT_ID - - // Validate required environment variables - if (!subscriptionId || !clientId || !clientSecret || !tenantId) { - throw new Error( - "E2E_AZURE_SUBSCRIPTION_ID, E2E_AZURE_CLIENT_ID, E2E_AZURE_SECRET_ID, and E2E_AZURE_TENANT_ID environment variables are not set", + // Wait for redirect to provider page + await providersPage.verifyLoadProviderPageAfterNewProvider(); + }, ); - } - - // Setup before each test - test.beforeEach(async ({ page }) => { - providersPage = new ProvidersPage(page); - // Clean up existing provider to ensure clean test state - await helpers.deleteProviderIfExists(page, subscriptionId); }); - // Use admin authentication for provider management - test.use({ storageState: "playwright/.auth/admin_user.json" }); + test.describe("Add AZURE Provider", () => { + // Providers page object + let providersPage: ProvidersPage; + // Test data from environment variables + const subscriptionId = process.env.E2E_AZURE_SUBSCRIPTION_ID; + const clientId = process.env.E2E_AZURE_CLIENT_ID; + const clientSecret = process.env.E2E_AZURE_SECRET_ID; + const tenantId = process.env.E2E_AZURE_TENANT_ID; - test( - "should add a new Azure provider with static credentials", - { - tag: ["@critical", "@e2e", "@providers", "@azure", "@serial", "@PROVIDER-E2E-003"], - }, - async ({ page }) => { - - // Prepare test data for AZURE provider - const azureProviderData: AZUREProviderData = { - subscriptionId:subscriptionId, - alias: "Test E2E AZURE Account - Credentials", - }; - - // Prepare static credentials - const azureCredentials: AZUREProviderCredential = { - type: AZURE_CREDENTIAL_OPTIONS.AZURE_CREDENTIALS, - clientId: clientId, - clientSecret: clientSecret, - tenantId: tenantId, - }; - - // Navigate to providers page - await providersPage.goto(); - await providersPage.verifyPageLoaded(); - - // Start adding new provider - await providersPage.clickAddProvider(); - await providersPage.verifyConnectAccountPageLoaded(); - - // Select AZURE provider - await providersPage.selectAZUREProvider(); - - // Fill provider details - await providersPage.fillAZUREProviderDetails(azureProviderData); - await providersPage.clickNext(); - - // Fill static credentials details - await providersPage.fillAZURECredentials(azureCredentials); - await providersPage.clickNext(); - - // Launch scan - await providersPage.verifyLaunchScanPageLoaded(); - await providersPage.clickNext(); - - // Wait for redirect to provider page - await providersPage.verifyLoadProviderPageAfterNewProvider(); + // Validate required environment variables + if (!subscriptionId || !clientId || !clientSecret || !tenantId) { + throw new Error( + "E2E_AZURE_SUBSCRIPTION_ID, E2E_AZURE_CLIENT_ID, E2E_AZURE_SECRET_ID, and E2E_AZURE_TENANT_ID environment variables are not set", + ); } - ) -}); + // Setup before each test + test.beforeEach(async ({ page }) => { + providersPage = new ProvidersPage(page); + // Clean up existing provider to ensure clean test state + await helpers.deleteProviderIfExists(page, subscriptionId); + }); -test.describe.serial("Add M365 Provider", () => { + // Use admin authentication for provider management + test.use({ storageState: "playwright/.auth/admin_user.json" }); - // Providers page object - let providersPage: ProvidersPage; + test( + "should add a new Azure provider with static credentials", + { + tag: [ + "@critical", + "@e2e", + "@providers", + "@azure", + "@serial", + "@PROVIDER-E2E-003", + ], + }, + async ({ page }) => { + // Prepare test data for AZURE provider + const azureProviderData: AZUREProviderData = { + subscriptionId: subscriptionId, + alias: "Test E2E AZURE Account - Credentials", + }; - // Test data from environment variables - const domainId= process.env.E2E_M365_DOMAIN_ID; - const clientId= process.env.E2E_M365_CLIENT_ID - const clientSecret= process.env.E2E_M365_SECRET_ID - const tenantId= process.env.E2E_M365_TENANT_ID + // Prepare static credentials + const azureCredentials: AZUREProviderCredential = { + type: AZURE_CREDENTIAL_OPTIONS.AZURE_CREDENTIALS, + clientId: clientId, + clientSecret: clientSecret, + tenantId: tenantId, + }; - // Validate required environment variables - if (!domainId || !clientId || !clientSecret || !tenantId) { - throw new Error( - "E2E_M365_DOMAIN_ID, E2E_M365_CLIENT_ID, E2E_M365_SECRET_ID, and E2E_M365_TENANT_ID environment variables are not set", + // Navigate to providers page + await providersPage.goto(); + await providersPage.verifyPageLoaded(); + + // Start adding new provider + await providersPage.clickAddProvider(); + await providersPage.verifyConnectAccountPageLoaded(); + + // Select AZURE provider + await providersPage.selectAZUREProvider(); + + // Fill provider details + await providersPage.fillAZUREProviderDetails(azureProviderData); + await providersPage.clickNext(); + + // Fill static credentials details + await providersPage.fillAZURECredentials(azureCredentials); + await providersPage.clickNext(); + + // Launch scan + await providersPage.verifyLaunchScanPageLoaded(); + await providersPage.clickNext(); + + // Wait for redirect to provider page + await providersPage.verifyLoadProviderPageAfterNewProvider(); + }, ); - } - - // Setup before each test - test.beforeEach(async ({ page }) => { - providersPage = new ProvidersPage(page); - // Clean up existing provider to ensure clean test state - await helpers.deleteProviderIfExists(page, domainId); }); - // Use admin authentication for provider management - test.use({ storageState: "playwright/.auth/admin_user.json" }); + test.describe("Add M365 Provider", () => { + // Providers page object + let providersPage: ProvidersPage; + // Test data from environment variables + const domainId = process.env.E2E_M365_DOMAIN_ID; + const clientId = process.env.E2E_M365_CLIENT_ID; + const tenantId = process.env.E2E_M365_TENANT_ID; - test( - "should add a new M365 provider with static credentials", - { - tag: ["@critical", "@e2e", "@providers", "@m365", "@serial", "@PROVIDER-E2E-004"], - }, - async ({ page }) => { - - // Prepare test data for M365 provider - const m365ProviderData: M365ProviderData = { - domainId:domainId, - alias: "Test E2E M365 Account - Credentials", - }; - - // Prepare static credentials - const m365Credentials: M365ProviderCredential = { - type: M365_CREDENTIAL_OPTIONS.M365_CREDENTIALS, - clientId: clientId, - clientSecret: clientSecret, - tenantId: tenantId, - }; - - // Navigate to providers page - await providersPage.goto(); - await providersPage.verifyPageLoaded(); - - // Start adding new provider - await providersPage.clickAddProvider(); - await providersPage.verifyConnectAccountPageLoaded(); - - // Select M365 provider - await providersPage.selectM365Provider(); - - // Fill provider details - await providersPage.fillM365ProviderDetails(m365ProviderData); - await providersPage.clickNext(); - - // Fill static credentials details - await providersPage.fillM365Credentials(m365Credentials); - await providersPage.clickNext(); - - // Launch scan - await providersPage.verifyLaunchScanPageLoaded(); - await providersPage.clickNext(); - - // Wait for redirect to provider page - await providersPage.verifyLoadProviderPageAfterNewProvider(); + // Validate required environment variables + if (!domainId || !clientId || !tenantId) { + throw new Error( + "E2E_M365_DOMAIN_ID, E2E_M365_CLIENT_ID, and E2E_M365_TENANT_ID environment variables are not set", + ); } - ) + // Setup before each test + test.beforeEach(async ({ page }) => { + providersPage = new ProvidersPage(page); + // Clean up existing provider to ensure clean test state + await helpers.deleteProviderIfExists(page, domainId); + }); -}); + // Use admin authentication for provider management + test.use({ storageState: "playwright/.auth/admin_user.json" }); + test( + "should add a new M365 provider with static credentials", + { + tag: [ + "@critical", + "@e2e", + "@providers", + "@m365", + "@serial", + "@PROVIDER-E2E-004", + ], + }, + async ({ page }) => { + // Validate required environment variables + const clientSecret = process.env.E2E_M365_SECRET_ID; + + if (!clientSecret) { + throw new Error("E2E_M365_SECRET_ID environment variable is not set"); + } + // Prepare test data for M365 provider + const m365ProviderData: M365ProviderData = { + domainId: domainId, + alias: "Test E2E M365 Account - Credentials", + }; + + // Prepare static credentials + const m365Credentials: M365ProviderCredential = { + type: M365_CREDENTIAL_OPTIONS.M365_CREDENTIALS, + clientId: clientId, + clientSecret: clientSecret, + tenantId: tenantId, + }; + + // Navigate to providers page + await providersPage.goto(); + await providersPage.verifyPageLoaded(); + + // Start adding new provider + await providersPage.clickAddProvider(); + await providersPage.verifyConnectAccountPageLoaded(); + + // Select M365 provider + await providersPage.selectM365Provider(); + + // Fill provider details + await providersPage.fillM365ProviderDetails(m365ProviderData); + await providersPage.clickNext(); + + // Select static credentials type + await providersPage.selectM365CredentialsType( + M365_CREDENTIAL_OPTIONS.M365_CREDENTIALS, + ); + await providersPage.verifyM365CredentialsPageLoaded(); + + // Fill static credentials details + await providersPage.fillM365Credentials(m365Credentials); + await providersPage.clickNext(); + + // Launch scan + await providersPage.verifyLaunchScanPageLoaded(); + await providersPage.clickNext(); + + // Wait for redirect to provider page + await providersPage.verifyLoadProviderPageAfterNewProvider(); + }, + ); + + test( + "should add a new M365 provider with certificate", + { + tag: [ + "@critical", + "@e2e", + "@providers", + "@m365", + "@serial", + "@PROVIDER-E2E-005", + ], + }, + async ({ page }) => { + // Validate required environment variables + const certificateContent = process.env.E2E_M365_CERTIFICATE_CONTENT; + + if (!certificateContent) { + throw new Error( + "E2E_M365_CERTIFICATE_CONTENT environment variable is not set", + ); + } + + // Prepare test data for M365 provider + const m365ProviderData: M365ProviderData = { + domainId: domainId, + alias: "Test E2E M365 Account - Certificate", + }; + + // Prepare static credentials + const m365Credentials: M365ProviderCredential = { + type: M365_CREDENTIAL_OPTIONS.M365_CERTIFICATE_CREDENTIALS, + clientId: clientId, + tenantId: tenantId, + certificateContent: certificateContent, + }; + + // Navigate to providers page + await providersPage.goto(); + await providersPage.verifyPageLoaded(); + + // Start adding new provider + await providersPage.clickAddProvider(); + await providersPage.verifyConnectAccountPageLoaded(); + + // Select M365 provider + await providersPage.selectM365Provider(); + + // Fill provider details + await providersPage.fillM365ProviderDetails(m365ProviderData); + await providersPage.clickNext(); + + // Select static credentials type + await providersPage.selectM365CredentialsType( + M365_CREDENTIAL_OPTIONS.M365_CERTIFICATE_CREDENTIALS, + ); + await providersPage.verifyM365CredentialsPageLoaded(); + + // Fill static credentials details + await providersPage.fillM365CertificateCredentials(m365Credentials); + await providersPage.clickNext(); + + // Launch scan + await providersPage.verifyLaunchScanPageLoaded(); + await providersPage.clickNext(); + + // Wait for redirect to provider page + await providersPage.verifyLoadProviderPageAfterNewProvider(); + }, + ); + }); +});