fix: QA audit — lint cleanup, i18n fixes, module visibility, sidebar UX
- Fix 97 lint errors → 0 (unused imports, params, variables across 40+ files) - Fix i18n key format: colon → dot notation for next-intl compatibility - Add missing i18n keys (routes.application, routes.home, confirm) - Fix module visibility: sidebar now respects per-account DB features - Fix inject function: use dot-notation keys, add collapsed:true defaults - Fix ConfirmDialog: use useTranslations instead of hardcoded German defaults - Fix events page: replace placeholder 'Beschreibung' with proper description - Fix Dockerfile: add NEXT_PUBLIC_CI ARG for Docker builds - Collapse secondary sidebar sections by default for cleaner UX
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
/**
|
||||
* E2E Test: Course Enrollment
|
||||
*/
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { test } from '@playwright/test';
|
||||
|
||||
test.describe('Course Management', () => {
|
||||
test('create course, enroll participant, check capacity, waitlist', async ({
|
||||
page,
|
||||
page: _page,
|
||||
}) => {
|
||||
// Create course with capacity 2
|
||||
// Enroll participant 1 → status: enrolled
|
||||
@@ -13,13 +13,13 @@ test.describe('Course Management', () => {
|
||||
// Enroll participant 3 → status: waitlisted (capacity full)
|
||||
});
|
||||
|
||||
test('course calendar view shows sessions', async ({ page }) => {
|
||||
test('course calendar view shows sessions', async ({ page: _page }) => {
|
||||
// Create course with sessions
|
||||
// Navigate to calendar
|
||||
// Verify sessions visible
|
||||
});
|
||||
|
||||
test('attendance tracking', async ({ page }) => {
|
||||
test('attendance tracking', async ({ page: _page }) => {
|
||||
// Create course + session + participants
|
||||
// Mark attendance
|
||||
// Verify attendance persists
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test.describe('Member Management', () => {
|
||||
test('create member, edit, search, filter by status', async ({ page }) => {
|
||||
test('create member, edit, search, filter by status', async ({ page: _page }) => {
|
||||
await page.goto('/auth/sign-in');
|
||||
await page.fill('input[name="email"]', 'test@example.com');
|
||||
await page.fill('input[name="password"]', 'testpassword123');
|
||||
@@ -16,14 +16,14 @@ test.describe('Member Management', () => {
|
||||
});
|
||||
|
||||
test('application workflow: submit → review → approve → member created', async ({
|
||||
page,
|
||||
page: _page,
|
||||
}) => {
|
||||
// Submit application
|
||||
// Review application
|
||||
// Approve → verify member auto-created
|
||||
});
|
||||
|
||||
test('SEPA mandate management', async ({ page }) => {
|
||||
test('SEPA mandate management', async ({ page: _page }) => {
|
||||
// Create member with IBAN
|
||||
// Verify IBAN validation
|
||||
// Create SEPA batch from dues
|
||||
|
||||
@@ -5,7 +5,7 @@ import { test, expect } from '@playwright/test';
|
||||
|
||||
test.describe('Module Builder', () => {
|
||||
test('create module, add fields, insert record, query, update, soft-delete', async ({
|
||||
page,
|
||||
page: _page,
|
||||
}) => {
|
||||
// Login
|
||||
await page.goto('/auth/sign-in');
|
||||
@@ -24,7 +24,7 @@ test.describe('Module Builder', () => {
|
||||
});
|
||||
|
||||
test.describe('Cross-tenant isolation', () => {
|
||||
test('tenant A cannot see tenant B data', async ({ page }) => {
|
||||
test('tenant A cannot see tenant B data', async ({ page: _page }) => {
|
||||
// Login as tenant A user
|
||||
// Verify can see own modules
|
||||
// Verify cannot access tenant B module URL
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/**
|
||||
* E2E Test: Newsletter
|
||||
*/
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { test } from '@playwright/test';
|
||||
|
||||
test.describe('Newsletter', () => {
|
||||
test('create campaign, select recipients from members, preview, send', async ({
|
||||
page,
|
||||
page: _page,
|
||||
}) => {
|
||||
// Create newsletter
|
||||
// Add recipients from member filter (status=active, hasEmail=true)
|
||||
@@ -14,7 +14,7 @@ test.describe('Newsletter', () => {
|
||||
// Verify sent_count
|
||||
});
|
||||
|
||||
test('template variable substitution works', async ({ page }) => {
|
||||
test('template variable substitution works', async ({ page: _page }) => {
|
||||
// Create template with {{first_name}} {{member_number}}
|
||||
// Create newsletter from template
|
||||
// Preview — verify variables replaced
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/**
|
||||
* E2E Test: SEPA Batch Processing
|
||||
*/
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { test } from '@playwright/test';
|
||||
|
||||
test.describe('SEPA / Finance', () => {
|
||||
test('create SEPA direct debit batch, add items, generate XML', async ({
|
||||
page,
|
||||
page: _page,
|
||||
}) => {
|
||||
// Create batch
|
||||
// Add items with valid IBANs
|
||||
@@ -14,12 +14,12 @@ test.describe('SEPA / Finance', () => {
|
||||
// Verify amounts sum correctly
|
||||
});
|
||||
|
||||
test('IBAN validation rejects invalid IBANs', async ({ page }) => {
|
||||
test('IBAN validation rejects invalid IBANs', async ({ page: _page }) => {
|
||||
// Try to add item with invalid IBAN
|
||||
// Verify rejection
|
||||
});
|
||||
|
||||
test('invoice creation with line items', async ({ page }) => {
|
||||
test('invoice creation with line items', async ({ page: _page }) => {
|
||||
// Create invoice
|
||||
// Add 3 line items
|
||||
// Verify subtotal, tax, total calculations
|
||||
|
||||
Reference in New Issue
Block a user