Add complete integration test suite

Backend Integration Tests:
- Create IntegrationTestBase class with WebApplicationFactory
- AuthIntegrationTests: Registration, login, validation tests (5 tests)
- EventsIntegrationTests: CRUD operations, authorization tests (8 tests)

Frontend-Backend Integration (E2E):
- Install Playwright with Chromium
- Create playwright.config.ts with configuration
- Auth E2E tests: login/register page visibility, navigation
- Event List E2E tests: page display
- Navigation E2E tests: main page navigation flow

Total Integration Tests:
- Backend: 13 tests covering Auth and Events
- E2E: 6 tests covering UI flows
This commit is contained in:
Denis Urs Rudolph
2026-04-08 20:37:51 +02:00
parent 3421818d41
commit 13c9c8aa68
9 changed files with 1138 additions and 4 deletions
+62
View File
@@ -0,0 +1,62 @@
import { test, expect } from '@playwright/test';
test.describe('Authentication E2E Tests', () => {
test('should display login page', async ({ page }) => {
await page.goto('/login');
// Check that login form is visible
await expect(page.getByRole('heading', { name: /login/i })).toBeVisible();
await expect(page.getByLabel(/email/i)).toBeVisible();
await expect(page.getByLabel(/password/i)).toBeVisible();
await expect(page.getByRole('button', { name: /login/i })).toBeVisible();
});
test('should display register page', async ({ page }) => {
await page.goto('/register');
// Check that register form is visible
await expect(page.getByRole('heading', { name: /register/i })).toBeVisible();
await expect(page.getByLabel(/full name/i)).toBeVisible();
await expect(page.getByLabel(/email/i)).toBeVisible();
await expect(page.getByLabel(/password/i)).toBeVisible();
await expect(page.getByRole('button', { name: /register/i })).toBeVisible();
});
test('should navigate from login to register', async ({ page }) => {
await page.goto('/login');
// Click on register link
await page.getByRole('link', { name: /register/i }).click();
// Should be on register page
await expect(page).toHaveURL(/.*register/);
await expect(page.getByRole('heading', { name: /register/i })).toBeVisible();
});
});
test.describe('Event List E2E Tests', () => {
test('should display events page', async ({ page }) => {
await page.goto('/events');
// Check that events list is visible
await expect(page.getByRole('heading', { name: /events/i })).toBeVisible();
// Check for filters
await expect(page.getByRole('combobox').first()).toBeVisible();
});
});
test.describe('Navigation E2E Tests', () => {
test('should navigate through main pages', async ({ page }) => {
// Start at home
await page.goto('/');
// Navigate to events
await page.getByRole('link', { name: /events/i }).first().click();
await expect(page).toHaveURL(/.*events/);
// Navigate to login
await page.getByRole('link', { name: /login/i }).click();
await expect(page).toHaveURL(/.*login/);
});
});
@@ -0,0 +1,25 @@
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: '.',
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : undefined,
reporter: 'list',
use: {
baseURL: 'http://localhost:3000',
trace: 'on-first-retry',
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
],
webServer: {
command: 'cd ../../frontend && npm run dev',
url: 'http://localhost:3000',
reuseExistingServer: !process.env.CI,
},
});