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>
210 lines
6.9 KiB
TypeScript
210 lines
6.9 KiB
TypeScript
/**
|
|
* E2E Tests: SDK Workflow
|
|
*
|
|
* Tests for completing the full compliance workflow,
|
|
* including checkpoints and state persistence.
|
|
*/
|
|
|
|
import { test, expect, selectors, navigateToStep, waitForSDKInit } from '../fixtures/sdk-fixtures'
|
|
|
|
test.describe('Use Case Workshop', () => {
|
|
test('can create a new use case', async ({ sdkPage }) => {
|
|
await navigateToStep(sdkPage, 'use-case-workshop')
|
|
|
|
// Click add use case button
|
|
const addButton = sdkPage.locator(selectors.addUseCaseButton)
|
|
if (await addButton.isVisible()) {
|
|
await addButton.click()
|
|
|
|
// Fill in use case form
|
|
const form = sdkPage.locator(selectors.useCaseForm)
|
|
if (await form.isVisible()) {
|
|
await sdkPage.fill('[name="name"]', 'E2E Test Use Case')
|
|
await sdkPage.fill('[name="description"]', 'This is a test use case created by E2E tests')
|
|
|
|
// Submit form
|
|
await sdkPage.click('button[type="submit"]')
|
|
|
|
// Verify use case was created
|
|
await expect(sdkPage.locator('text=E2E Test Use Case')).toBeVisible()
|
|
}
|
|
}
|
|
})
|
|
|
|
test('displays use cases with demo data', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'use-case-workshop')
|
|
|
|
// With demo data, should show existing use cases
|
|
const useCaseCards = withDemoData.locator('[data-testid^="use-case-card"]')
|
|
const count = await useCaseCards.count()
|
|
expect(count).toBeGreaterThan(0)
|
|
})
|
|
})
|
|
|
|
test.describe('Risk Matrix', () => {
|
|
test('displays risk matrix', async ({ sdkPage }) => {
|
|
await navigateToStep(sdkPage, 'risks')
|
|
|
|
// Page should load without errors
|
|
await expect(sdkPage).toHaveURL('/sdk/risks')
|
|
})
|
|
|
|
test('shows risks with demo data', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'risks')
|
|
|
|
// With demo data, should show risk cards
|
|
const riskCards = withDemoData.locator('[data-testid^="risk-card"]')
|
|
const count = await riskCards.count()
|
|
expect(count).toBeGreaterThan(0)
|
|
})
|
|
|
|
test('can filter risks by severity', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'risks')
|
|
|
|
// Look for severity filter
|
|
const filterSelect = withDemoData.locator('[data-testid="severity-filter"]')
|
|
if (await filterSelect.isVisible()) {
|
|
await filterSelect.selectOption('CRITICAL')
|
|
|
|
// Verify filtered results
|
|
const riskCards = withDemoData.locator('[data-testid^="risk-card"]')
|
|
const visibleCards = riskCards.filter({ hasText: 'CRITICAL' })
|
|
const count = await visibleCards.count()
|
|
expect(count).toBeGreaterThanOrEqual(0)
|
|
}
|
|
})
|
|
})
|
|
|
|
test.describe('Controls', () => {
|
|
test('displays controls grid', async ({ sdkPage }) => {
|
|
await navigateToStep(sdkPage, 'controls')
|
|
|
|
await expect(sdkPage).toHaveURL('/sdk/controls')
|
|
})
|
|
|
|
test('shows controls with demo data', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'controls')
|
|
|
|
const controlCards = withDemoData.locator('[data-testid^="control-card"]')
|
|
const count = await controlCards.count()
|
|
expect(count).toBeGreaterThan(0)
|
|
})
|
|
|
|
test('can view control details', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'controls')
|
|
|
|
// Click on first control card
|
|
const firstControl = withDemoData.locator('[data-testid^="control-card"]').first()
|
|
if (await firstControl.isVisible()) {
|
|
await firstControl.click()
|
|
|
|
// Should show control details (modal or expanded view)
|
|
const detailView = withDemoData.locator('[data-testid="control-details"]')
|
|
if (await detailView.isVisible({ timeout: 2000 })) {
|
|
await expect(detailView).toBeVisible()
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
test.describe('DSFA', () => {
|
|
test('displays DSFA page', async ({ sdkPage }) => {
|
|
await navigateToStep(sdkPage, 'dsfa')
|
|
|
|
await expect(sdkPage).toHaveURL('/sdk/dsfa')
|
|
})
|
|
|
|
test('shows DSFA content with demo data', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'dsfa')
|
|
|
|
// Demo data includes a DSFA with sections
|
|
const dsfaSections = withDemoData.locator('[data-testid^="dsfa-section"]')
|
|
const count = await dsfaSections.count()
|
|
expect(count).toBeGreaterThan(0)
|
|
})
|
|
})
|
|
|
|
test.describe('TOMs', () => {
|
|
test('displays TOMs page', async ({ sdkPage }) => {
|
|
await navigateToStep(sdkPage, 'tom')
|
|
|
|
await expect(sdkPage).toHaveURL('/sdk/tom')
|
|
})
|
|
|
|
test('shows TOMs with demo data', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'tom')
|
|
|
|
const tomCards = withDemoData.locator('[data-testid^="tom-card"]')
|
|
const count = await tomCards.count()
|
|
expect(count).toBeGreaterThan(0)
|
|
})
|
|
})
|
|
|
|
test.describe('VVT (Verarbeitungsverzeichnis)', () => {
|
|
test('displays VVT page', async ({ sdkPage }) => {
|
|
await navigateToStep(sdkPage, 'vvt')
|
|
|
|
await expect(sdkPage).toHaveURL('/sdk/vvt')
|
|
})
|
|
|
|
test('shows processing activities with demo data', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'vvt')
|
|
|
|
const activityCards = withDemoData.locator('[data-testid^="processing-activity"]')
|
|
const count = await activityCards.count()
|
|
expect(count).toBeGreaterThan(0)
|
|
})
|
|
})
|
|
|
|
test.describe('Checkpoint Validation', () => {
|
|
test('validates use case checkpoint', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'use-case-workshop')
|
|
|
|
// Look for checkpoint validation button
|
|
const validateButton = withDemoData.locator('[data-testid="validate-checkpoint"]')
|
|
if (await validateButton.isVisible()) {
|
|
await validateButton.click()
|
|
|
|
// With demo data, checkpoint should pass
|
|
const successIndicator = withDemoData.locator('[data-testid="checkpoint-passed"]')
|
|
await expect(successIndicator).toBeVisible({ timeout: 5000 })
|
|
}
|
|
})
|
|
|
|
test('shows checkpoint errors when requirements not met', async ({ sdkPage }) => {
|
|
await navigateToStep(sdkPage, 'use-case-workshop')
|
|
|
|
// Without demo data, checkpoint should fail
|
|
const validateButton = sdkPage.locator('[data-testid="validate-checkpoint"]')
|
|
if (await validateButton.isVisible()) {
|
|
await validateButton.click()
|
|
|
|
// Should show error
|
|
const errorIndicator = sdkPage.locator('[data-testid="checkpoint-failed"]')
|
|
if (await errorIndicator.isVisible({ timeout: 5000 })) {
|
|
await expect(errorIndicator).toBeVisible()
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
test.describe('State Persistence', () => {
|
|
test('persists state after page reload', async ({ withDemoData }) => {
|
|
await navigateToStep(withDemoData, 'use-case-workshop')
|
|
|
|
// Get current use case count
|
|
const useCaseCards = withDemoData.locator('[data-testid^="use-case-card"]')
|
|
const initialCount = await useCaseCards.count()
|
|
|
|
// Reload page
|
|
await withDemoData.reload()
|
|
await waitForSDKInit(withDemoData)
|
|
|
|
// Count should be same after reload
|
|
const afterReloadCards = withDemoData.locator('[data-testid^="use-case-card"]')
|
|
const afterReloadCount = await afterReloadCards.count()
|
|
|
|
expect(afterReloadCount).toBe(initialCount)
|
|
})
|
|
})
|