test(ui): add Vercel provider E2E tests (#11598)

Co-authored-by: Pablo F.G <pablo.fernandez@prowler.com>
This commit is contained in:
Pablo Fernandez Guerra (PFE)
2026-06-16 14:40:41 +02:00
committed by GitHub
co-authored by Pablo F.G
parent e690e5e86b
commit c2d7187a0b
5 changed files with 213 additions and 0 deletions
+2
View File
@@ -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 }}
+66
View File
@@ -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> {
+59
View File
@@ -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
+82
View File
@@ -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", () => {
+4
View File
@@ -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;
}
}
}