mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-08-19 09:30:21 +00:00
test(ui): add Vercel provider E2E tests (#11598)
Co-authored-by: Pablo F.G <pablo.fernandez@prowler.com>
This commit is contained in:
co-authored by
Pablo F.G
parent
e690e5e86b
commit
c2d7187a0b
@@ -77,6 +77,8 @@ jobs:
|
||||
E2E_ALIBABACLOUD_ACCESS_KEY_ID: ${{ secrets.E2E_ALIBABACLOUD_ACCESS_KEY_ID }}
|
||||
E2E_ALIBABACLOUD_ACCESS_KEY_SECRET: ${{ secrets.E2E_ALIBABACLOUD_ACCESS_KEY_SECRET }}
|
||||
E2E_ALIBABACLOUD_ROLE_ARN: ${{ secrets.E2E_ALIBABACLOUD_ROLE_ARN }}
|
||||
E2E_VERCEL_TEAM_ID: ${{ secrets.E2E_VERCEL_TEAM_ID }}
|
||||
E2E_VERCEL_API_TOKEN: ${{ secrets.E2E_VERCEL_API_TOKEN }}
|
||||
# Pass E2E paths from impact analysis
|
||||
E2E_TEST_PATHS: ${{ needs.impact-analysis.outputs.ui-e2e }}
|
||||
RUN_ALL_TESTS: ${{ needs.impact-analysis.outputs.run-all }}
|
||||
|
||||
@@ -224,6 +224,27 @@ export interface AlibabaCloudProviderCredential {
|
||||
roleSessionName?: string;
|
||||
}
|
||||
|
||||
// Vercel provider data
|
||||
export interface VercelProviderData {
|
||||
teamId: string;
|
||||
alias?: string;
|
||||
}
|
||||
|
||||
// Vercel credential options
|
||||
export const VERCEL_CREDENTIAL_OPTIONS = {
|
||||
VERCEL_API_TOKEN: "api_token",
|
||||
} as const;
|
||||
|
||||
// Vercel credential type
|
||||
type VercelCredentialType =
|
||||
(typeof VERCEL_CREDENTIAL_OPTIONS)[keyof typeof VERCEL_CREDENTIAL_OPTIONS];
|
||||
|
||||
// Vercel provider credential
|
||||
export interface VercelProviderCredential {
|
||||
type: VercelCredentialType;
|
||||
apiToken: string;
|
||||
}
|
||||
|
||||
// Providers page
|
||||
export class ProvidersPage extends BasePage {
|
||||
readonly wizardModal: Locator;
|
||||
@@ -252,6 +273,11 @@ export class ProvidersPage extends BasePage {
|
||||
readonly googleworkspaceServiceAccountJsonInput: Locator;
|
||||
readonly googleworkspaceDelegatedUserInput: Locator;
|
||||
|
||||
// Vercel provider form elements
|
||||
readonly vercelProviderRadio: Locator;
|
||||
readonly vercelTeamIdInput: Locator;
|
||||
readonly vercelApiTokenInput: Locator;
|
||||
|
||||
// AWS provider form elements
|
||||
readonly accountIdInput: Locator;
|
||||
readonly nextButton: Locator;
|
||||
@@ -496,6 +522,14 @@ export class ProvidersPage extends BasePage {
|
||||
name: /Delegated User Email/i,
|
||||
});
|
||||
|
||||
// Vercel
|
||||
this.vercelProviderRadio = page.getByRole("option", {
|
||||
name: /Vercel/i,
|
||||
});
|
||||
this.vercelTeamIdInput = page.getByRole("textbox", { name: "Team ID" });
|
||||
// API Token is a type="password" field (no textbox role); target by label.
|
||||
this.vercelApiTokenInput = page.getByLabel(/API Token/i);
|
||||
|
||||
// Alias input
|
||||
this.aliasInput = page.getByRole("textbox", {
|
||||
name: "Provider alias (optional)",
|
||||
@@ -1288,6 +1322,37 @@ export class ProvidersPage extends BasePage {
|
||||
await expect(this.googleworkspaceDelegatedUserInput).toBeVisible();
|
||||
}
|
||||
|
||||
async selectVercelProvider(): Promise<void> {
|
||||
await this.selectProviderRadio(this.vercelProviderRadio);
|
||||
}
|
||||
|
||||
async fillVercelProviderDetails(data: VercelProviderData): Promise<void> {
|
||||
// Fill the Vercel provider details (Team ID is the provider UID)
|
||||
|
||||
await this.vercelTeamIdInput.fill(data.teamId);
|
||||
|
||||
if (data.alias) {
|
||||
await this.aliasInput.fill(data.alias);
|
||||
}
|
||||
}
|
||||
|
||||
async fillVercelCredentials(
|
||||
credentials: VercelProviderCredential,
|
||||
): Promise<void> {
|
||||
// Fill the Vercel credentials form
|
||||
|
||||
if (credentials.apiToken) {
|
||||
await this.vercelApiTokenInput.fill(credentials.apiToken);
|
||||
}
|
||||
}
|
||||
|
||||
async verifyVercelCredentialsPageLoaded(): Promise<void> {
|
||||
// Verify the Vercel credentials page is loaded
|
||||
|
||||
await this.verifyPageHasProwlerTitle();
|
||||
await expect(this.vercelApiTokenInput).toBeVisible();
|
||||
}
|
||||
|
||||
async verifyPageLoaded(): Promise<void> {
|
||||
// Verify the providers page is loaded
|
||||
|
||||
@@ -1309,6 +1374,7 @@ export class ProvidersPage extends BasePage {
|
||||
await expect(this.githubProviderRadio).toBeVisible();
|
||||
await expect(this.alibabacloudProviderRadio).toBeVisible();
|
||||
await expect(this.googleworkspaceProviderRadio).toBeVisible();
|
||||
await expect(this.vercelProviderRadio).toBeVisible();
|
||||
}
|
||||
|
||||
async verifyCredentialsPageLoaded(): Promise<void> {
|
||||
|
||||
@@ -1012,3 +1012,62 @@
|
||||
- Provider cleanup performed before each test to ensure clean state
|
||||
- Requires valid Google Workspace account with Service Account having domain-wide delegation enabled
|
||||
- Service Account must have appropriate Google Workspace API scopes for security scanning
|
||||
|
||||
---
|
||||
|
||||
## Test Case: `PROVIDER-E2E-018` - Add Vercel Provider with API Token
|
||||
|
||||
**Priority:** `critical`
|
||||
|
||||
**Tags:**
|
||||
|
||||
- type → @e2e, @serial
|
||||
- feature → @providers
|
||||
- provider → @vercel
|
||||
|
||||
**Description/Objective:** Validates the complete flow of adding a new Vercel provider using API Token authentication, with a Team ID as the provider UID.
|
||||
|
||||
**Preconditions:**
|
||||
|
||||
- Admin user authentication required (admin.auth.setup setup)
|
||||
- Environment variables configured: E2E_VERCEL_TEAM_ID, E2E_VERCEL_API_TOKEN
|
||||
- Remove any existing provider with the same Team ID before starting the test
|
||||
- This test must be run serially and never in parallel with other tests, as it requires the Team ID not to be already registered beforehand.
|
||||
|
||||
### Flow Steps
|
||||
|
||||
1. Navigate to providers page
|
||||
2. Click "Add Provider" button
|
||||
3. Select Vercel provider type
|
||||
4. Fill provider details (team ID and alias)
|
||||
5. Verify Vercel credentials page is loaded
|
||||
6. Fill Vercel credentials (API token)
|
||||
7. Launch initial scan
|
||||
8. Verify redirect to Scans page
|
||||
9. Verify scheduled scan status in Scans table (provider exists and scan name is "scheduled scan")
|
||||
|
||||
### Expected Result
|
||||
|
||||
- Vercel provider successfully added with API Token credentials
|
||||
- Initial scan launched successfully
|
||||
- User redirected to Scans page
|
||||
- Scheduled scan appears in Scans table with correct provider and scan name
|
||||
|
||||
### Key verification points
|
||||
|
||||
- Provider page loads correctly
|
||||
- Connect account page displays Vercel option
|
||||
- Provider details form accepts team ID and alias
|
||||
- Credentials page loads with the API Token field
|
||||
- API Token is properly filled in the correct (masked) field
|
||||
- Launch scan page appears
|
||||
- Successful redirect to Scans page after scan launch
|
||||
- Provider exists in Scans table (verified by team ID)
|
||||
- Scan name field contains "scheduled scan"
|
||||
|
||||
### Notes
|
||||
|
||||
- Test uses environment variables for the Vercel Team ID and API Token
|
||||
- API Token is a masked (password) field; the only credential required for Vercel
|
||||
- Provider cleanup performed before each test to ensure clean state
|
||||
- Requires a valid Vercel API Token with read permissions to the resources to assess
|
||||
|
||||
@@ -30,6 +30,9 @@ import {
|
||||
GoogleWorkspaceProviderData,
|
||||
GoogleWorkspaceProviderCredential,
|
||||
GOOGLEWORKSPACE_CREDENTIAL_OPTIONS,
|
||||
VercelProviderData,
|
||||
VercelProviderCredential,
|
||||
VERCEL_CREDENTIAL_OPTIONS,
|
||||
} from "./providers-page";
|
||||
import { ScansPage } from "../scans/scans-page";
|
||||
import fs from "fs";
|
||||
@@ -1435,6 +1438,85 @@ test.describe("Add Provider", () => {
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
test.describe.serial("Add Vercel Provider", () => {
|
||||
let providersPage: ProvidersPage;
|
||||
let scansPage: ScansPage;
|
||||
|
||||
// Test data from environment variables
|
||||
const teamId = process.env.E2E_VERCEL_TEAM_ID ?? "";
|
||||
const apiToken = process.env.E2E_VERCEL_API_TOKEN ?? "";
|
||||
|
||||
// Setup before each test
|
||||
test.beforeEach(async ({ page }) => {
|
||||
test.skip(!teamId || !apiToken, "Vercel E2E env vars are not set");
|
||||
providersPage = new ProvidersPage(page);
|
||||
await deleteProviderIfExists(providersPage, teamId!);
|
||||
});
|
||||
|
||||
// Use admin authentication for provider management
|
||||
test.use({ storageState: "playwright/.auth/admin_user.json" });
|
||||
|
||||
test(
|
||||
"should add a new Vercel provider with API token",
|
||||
{
|
||||
tag: [
|
||||
"@critical",
|
||||
"@e2e",
|
||||
"@providers",
|
||||
"@vercel",
|
||||
"@serial",
|
||||
"@PROVIDER-E2E-018",
|
||||
],
|
||||
},
|
||||
async ({ page }) => {
|
||||
// Prepare test data for Vercel provider (Team ID is the provider UID)
|
||||
const vercelProviderData: VercelProviderData = {
|
||||
teamId: teamId,
|
||||
alias: "Test E2E Vercel Account - API Token",
|
||||
};
|
||||
|
||||
// Prepare API token credentials
|
||||
const vercelCredentials: VercelProviderCredential = {
|
||||
type: VERCEL_CREDENTIAL_OPTIONS.VERCEL_API_TOKEN,
|
||||
apiToken: apiToken,
|
||||
};
|
||||
|
||||
// Navigate to providers page
|
||||
await providersPage.goto();
|
||||
await providersPage.verifyPageLoaded();
|
||||
|
||||
// Start adding new provider
|
||||
await providersPage.clickAddProvider();
|
||||
await providersPage.verifyConnectAccountPageLoaded();
|
||||
|
||||
// Select Vercel provider
|
||||
await providersPage.selectVercelProvider();
|
||||
|
||||
// Fill provider details (team ID and alias)
|
||||
await providersPage.fillVercelProviderDetails(vercelProviderData);
|
||||
await providersPage.clickNext();
|
||||
|
||||
// Verify credentials page is loaded
|
||||
await providersPage.verifyVercelCredentialsPageLoaded();
|
||||
|
||||
// Fill credentials (API token)
|
||||
await providersPage.fillVercelCredentials(vercelCredentials);
|
||||
await providersPage.clickNext();
|
||||
|
||||
// Launch scan
|
||||
await providersPage.verifyLaunchScanPageLoaded();
|
||||
await providersPage.clickNext();
|
||||
|
||||
// Wait for redirect to scan page
|
||||
scansPage = new ScansPage(page);
|
||||
await scansPage.verifyPageLoaded();
|
||||
|
||||
// Verify scan status is "Scheduled scan"
|
||||
await scansPage.verifyScheduledScanStatus(teamId);
|
||||
},
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
test.describe("Update Provider Credentials", () => {
|
||||
|
||||
Vendored
+4
@@ -118,6 +118,10 @@ declare global {
|
||||
E2E_GOOGLEWORKSPACE_CUSTOMER_ID?: string;
|
||||
E2E_GOOGLEWORKSPACE_SERVICE_ACCOUNT_JSON?: string;
|
||||
E2E_GOOGLEWORKSPACE_DELEGATED_USER?: string;
|
||||
|
||||
// E2E Vercel
|
||||
E2E_VERCEL_TEAM_ID?: string;
|
||||
E2E_VERCEL_API_TOKEN?: string;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user