Initial commit: breakpilot-compliance - Compliance SDK Platform
Services: Admin-Compliance, Backend-Compliance, AI-Compliance-SDK, Consent-SDK, Developer-Portal, PCA-Platform, DSMS Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
160
admin-compliance/e2e/utils/test-helpers.ts
Normal file
160
admin-compliance/e2e/utils/test-helpers.ts
Normal file
@@ -0,0 +1,160 @@
|
||||
import { Page, expect } from '@playwright/test'
|
||||
|
||||
/**
|
||||
* E2E Test Helpers for SDK Testing
|
||||
*/
|
||||
|
||||
// Wait for page to be fully loaded
|
||||
export async function waitForPageLoad(page: Page) {
|
||||
await page.waitForLoadState('networkidle')
|
||||
}
|
||||
|
||||
// Handle role selection screen if present
|
||||
async function handleRoleSelection(page: Page) {
|
||||
// Check if role selection screen is visible
|
||||
const roleScreen = page.locator('text=Willkommen im Admin Center')
|
||||
if (await roleScreen.isVisible({ timeout: 2000 }).catch(() => false)) {
|
||||
// Click on DSB (Datenschutzbeauftragter) role for DSR testing
|
||||
const dsbButton = page.locator('button:has-text("DSB")')
|
||||
if (await dsbButton.isVisible()) {
|
||||
await dsbButton.click()
|
||||
await page.waitForTimeout(500)
|
||||
await waitForPageLoad(page)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Navigate to SDK page and wait for load
|
||||
export async function navigateToSDK(page: Page, path: string) {
|
||||
const targetUrl = `/sdk${path}`
|
||||
|
||||
// First navigate to the page
|
||||
await page.goto(targetUrl)
|
||||
await waitForPageLoad(page)
|
||||
|
||||
// Handle role selection if it appears
|
||||
await handleRoleSelection(page)
|
||||
|
||||
// Always navigate again after role selection to ensure we reach the target
|
||||
const currentUrl = page.url()
|
||||
if (!currentUrl.includes('/sdk/dsr')) {
|
||||
await page.goto(targetUrl)
|
||||
await waitForPageLoad(page)
|
||||
}
|
||||
}
|
||||
|
||||
// Check if element is visible
|
||||
export async function isVisible(page: Page, selector: string): Promise<boolean> {
|
||||
const element = page.locator(selector)
|
||||
return await element.isVisible()
|
||||
}
|
||||
|
||||
// Click and wait for navigation
|
||||
export async function clickAndWait(page: Page, selector: string) {
|
||||
await page.click(selector)
|
||||
await waitForPageLoad(page)
|
||||
}
|
||||
|
||||
// Fill form field
|
||||
export async function fillField(page: Page, selector: string, value: string) {
|
||||
await page.fill(selector, value)
|
||||
}
|
||||
|
||||
// Select dropdown option
|
||||
export async function selectOption(page: Page, selector: string, value: string) {
|
||||
await page.selectOption(selector, value)
|
||||
}
|
||||
|
||||
// Get text content of element
|
||||
export async function getText(page: Page, selector: string): Promise<string> {
|
||||
const element = page.locator(selector)
|
||||
return await element.textContent() || ''
|
||||
}
|
||||
|
||||
// Count elements
|
||||
export async function countElements(page: Page, selector: string): Promise<number> {
|
||||
const elements = page.locator(selector)
|
||||
return await elements.count()
|
||||
}
|
||||
|
||||
// Wait for element to appear
|
||||
export async function waitForElement(page: Page, selector: string, timeout = 10000) {
|
||||
await page.waitForSelector(selector, { timeout })
|
||||
}
|
||||
|
||||
// Check page title contains text
|
||||
export async function checkTitleContains(page: Page, text: string) {
|
||||
await expect(page).toHaveTitle(new RegExp(text, 'i'))
|
||||
}
|
||||
|
||||
// Check URL contains path
|
||||
export async function checkUrlContains(page: Page, path: string) {
|
||||
await expect(page).toHaveURL(new RegExp(path))
|
||||
}
|
||||
|
||||
// Take screenshot with timestamp
|
||||
export async function takeScreenshot(page: Page, name: string) {
|
||||
const timestamp = new Date().toISOString().replace(/[:.]/g, '-')
|
||||
await page.screenshot({ path: `e2e/screenshots/${name}-${timestamp}.png` })
|
||||
}
|
||||
|
||||
// Check for console errors
|
||||
export function setupConsoleErrorListener(page: Page): string[] {
|
||||
const errors: string[] = []
|
||||
page.on('console', msg => {
|
||||
if (msg.type() === 'error') {
|
||||
errors.push(msg.text())
|
||||
}
|
||||
})
|
||||
return errors
|
||||
}
|
||||
|
||||
// Wait for API response
|
||||
export async function waitForAPI(page: Page, urlPattern: string | RegExp) {
|
||||
await page.waitForResponse(response =>
|
||||
response.url().match(urlPattern) !== null && response.status() === 200
|
||||
)
|
||||
}
|
||||
|
||||
// SDK specific helpers
|
||||
export const SDK_PAGES = {
|
||||
// Phase 1
|
||||
useCaseWorkshop: '/advisory-board',
|
||||
screening: '/screening',
|
||||
modules: '/modules',
|
||||
requirements: '/requirements',
|
||||
controls: '/controls',
|
||||
evidence: '/evidence',
|
||||
auditChecklist: '/audit-checklist',
|
||||
risks: '/risks',
|
||||
// Phase 2
|
||||
aiAct: '/ai-act',
|
||||
obligations: '/obligations',
|
||||
dsfa: '/dsfa',
|
||||
tom: '/tom',
|
||||
einwilligungen: '/einwilligungen',
|
||||
loeschfristen: '/loeschfristen',
|
||||
vvt: '/vvt',
|
||||
consent: '/consent',
|
||||
cookieBanner: '/cookie-banner',
|
||||
dsr: '/dsr',
|
||||
escalations: '/escalations',
|
||||
}
|
||||
|
||||
// DSR specific helpers
|
||||
export const DSR_TYPES = {
|
||||
access: 'Art. 15',
|
||||
rectification: 'Art. 16',
|
||||
erasure: 'Art. 17',
|
||||
restriction: 'Art. 18',
|
||||
portability: 'Art. 20',
|
||||
objection: 'Art. 21',
|
||||
}
|
||||
|
||||
export const DSR_STATUSES = {
|
||||
intake: 'Eingang',
|
||||
identity_verification: 'ID-Pruefung',
|
||||
processing: 'In Bearbeitung',
|
||||
completed: 'Abgeschlossen',
|
||||
rejected: 'Abgelehnt',
|
||||
}
|
||||
Reference in New Issue
Block a user