middleware test

This commit is contained in:
2026-01-03 22:05:00 +01:00
parent c589b3c3fe
commit bc7cb2e20a
7 changed files with 680 additions and 78 deletions

View File

@@ -3,7 +3,7 @@ import { WebsiteRouteManager } from '../../shared/website/WebsiteRouteManager';
import { WebsiteAuthManager } from '../../shared/website/WebsiteAuthManager';
import { ConsoleErrorCapture } from '../../shared/website/ConsoleErrorCapture';
const API_BASE_URL = process.env.API_URL || 'http://localhost:3101';
const WEBSITE_BASE_URL = process.env.PLAYWRIGHT_BASE_URL || 'http://localhost:3000';
test.describe('Website Pages - TypeORM Integration', () => {
let routeManager: WebsiteRouteManager;
@@ -12,13 +12,13 @@ test.describe('Website Pages - TypeORM Integration', () => {
routeManager = new WebsiteRouteManager();
});
test('verify Docker and TypeORM are running', async ({ page }) => {
const response = await page.goto(`${API_BASE_URL}/health`);
test('website loads and connects to API', async ({ page }) => {
// Test that the website loads
const response = await page.goto(WEBSITE_BASE_URL);
expect(response?.ok()).toBe(true);
const healthData = await response?.json().catch(() => null);
expect(healthData).toBeTruthy();
expect(healthData.database).toBe('connected');
// Check that the page renders (body is visible)
await expect(page.locator('body')).toBeVisible();
});
test('all routes from RouteConfig are discoverable', async () => {
@@ -31,8 +31,9 @@ test.describe('Website Pages - TypeORM Integration', () => {
for (const route of publicRoutes) {
const path = routeManager.resolvePathTemplate(route.pathTemplate, route.params);
const response = await page.goto(`${API_BASE_URL}${path}`);
const response = await page.goto(`${WEBSITE_BASE_URL}${path}`);
// Should load successfully or show 404 page
expect(response?.ok() || response?.status() === 404).toBeTruthy();
}
});
@@ -43,7 +44,7 @@ test.describe('Website Pages - TypeORM Integration', () => {
for (const route of protectedRoutes) {
const path = routeManager.resolvePathTemplate(route.pathTemplate, route.params);
await page.goto(`${API_BASE_URL}${path}`);
await page.goto(`${WEBSITE_BASE_URL}${path}`);
const currentUrl = new URL(page.url());
expect(currentUrl.pathname).toBe('/auth/login');
@@ -51,57 +52,71 @@ test.describe('Website Pages - TypeORM Integration', () => {
}
});
test('admin routes require admin role', async ({ page, browser }) => {
test('admin routes require admin role', async ({ browser, request }) => {
const routes = routeManager.getWebsiteRouteInventory();
const adminRoutes = routes.filter(r => r.access === 'admin').slice(0, 2);
for (const route of adminRoutes) {
const path = routeManager.resolvePathTemplate(route.pathTemplate, route.params);
// Regular auth user should be blocked
await WebsiteAuthManager.createAuthContext(browser, 'auth');
await page.goto(`${API_BASE_URL}${path}`);
expect(page.url().includes('login')).toBeTruthy();
{
const auth = await WebsiteAuthManager.createAuthContext(browser, request, 'auth');
await auth.page.goto(`${WEBSITE_BASE_URL}${path}`);
expect(auth.page.url().includes('login')).toBeTruthy();
await auth.context.close();
}
// Admin user should have access
await WebsiteAuthManager.createAuthContext(browser, 'admin');
await page.goto(`${API_BASE_URL}${path}`);
expect(page.url().includes(path)).toBeTruthy();
{
const admin = await WebsiteAuthManager.createAuthContext(browser, request, 'admin');
await admin.page.goto(`${WEBSITE_BASE_URL}${path}`);
expect(admin.page.url().includes(path)).toBeTruthy();
await admin.context.close();
}
}
});
test('sponsor routes require sponsor role', async ({ page, browser }) => {
test('sponsor routes require sponsor role', async ({ browser, request }) => {
const routes = routeManager.getWebsiteRouteInventory();
const sponsorRoutes = routes.filter(r => r.access === 'sponsor').slice(0, 2);
for (const route of sponsorRoutes) {
const path = routeManager.resolvePathTemplate(route.pathTemplate, route.params);
// Regular auth user should be blocked
await WebsiteAuthManager.createAuthContext(browser, 'auth');
await page.goto(`${API_BASE_URL}${path}`);
expect(page.url().includes('login')).toBeTruthy();
{
const auth = await WebsiteAuthManager.createAuthContext(browser, request, 'auth');
await auth.page.goto(`${WEBSITE_BASE_URL}${path}`);
expect(auth.page.url().includes('login')).toBeTruthy();
await auth.context.close();
}
// Sponsor user should have access
await WebsiteAuthManager.createAuthContext(browser, 'sponsor');
await page.goto(`${API_BASE_URL}${path}`);
expect(page.url().includes(path)).toBeTruthy();
{
const sponsor = await WebsiteAuthManager.createAuthContext(browser, request, 'sponsor');
await sponsor.page.goto(`${WEBSITE_BASE_URL}${path}`);
expect(sponsor.page.url().includes(path)).toBeTruthy();
await sponsor.context.close();
}
}
});
test('auth routes redirect authenticated users away', async ({ page, browser }) => {
test('auth routes redirect authenticated users away', async ({ browser, request }) => {
const routes = routeManager.getWebsiteRouteInventory();
const authRoutes = routes.filter(r => r.access === 'auth').slice(0, 2);
for (const route of authRoutes) {
const path = routeManager.resolvePathTemplate(route.pathTemplate, route.params);
await WebsiteAuthManager.createAuthContext(browser, 'auth');
await page.goto(`${API_BASE_URL}${path}`);
const auth = await WebsiteAuthManager.createAuthContext(browser, request, 'auth');
await auth.page.goto(`${WEBSITE_BASE_URL}${path}`);
// Should redirect to dashboard or stay on the page
const currentUrl = page.url();
const currentUrl = auth.page.url();
expect(currentUrl.includes('dashboard') || currentUrl.includes(path)).toBeTruthy();
await auth.context.close();
}
});
@@ -110,7 +125,7 @@ test.describe('Website Pages - TypeORM Integration', () => {
for (const route of edgeCases) {
const path = routeManager.resolvePathTemplate(route.pathTemplate, route.params);
const response = await page.goto(`${API_BASE_URL}${path}`);
const response = await page.goto(`${WEBSITE_BASE_URL}${path}`);
if (route.allowNotFound) {
expect(response?.status() === 404 || response?.status() === 500).toBeTruthy();
@@ -125,7 +140,7 @@ test.describe('Website Pages - TypeORM Integration', () => {
const capture = new ConsoleErrorCapture(page);
const path = routeManager.resolvePathTemplate(route.pathTemplate, route.params);
await page.goto(`${API_BASE_URL}${path}`);
await page.goto(`${WEBSITE_BASE_URL}${path}`);
await page.waitForTimeout(500);
const errors = capture.getErrors();
@@ -139,7 +154,7 @@ test.describe('Website Pages - TypeORM Integration', () => {
for (const route of testRoutes) {
const path = routeManager.resolvePathTemplate(route.pathTemplate, route.params);
const response = await page.goto(`${API_BASE_URL}${path}`);
const response = await page.goto(`${WEBSITE_BASE_URL}${path}`);
expect(response?.ok() || response?.status() === 404).toBeTruthy();
}
@@ -152,7 +167,7 @@ test.describe('Website Pages - TypeORM Integration', () => {
const path = routeManager.resolvePathTemplate(route.pathTemplate, route.params);
// Try accessing protected route without auth
await page.goto(`${API_BASE_URL}${path}`);
await page.goto(`${WEBSITE_BASE_URL}${path}`);
const currentUrl = page.url();
expect(currentUrl.includes('login') || currentUrl.includes('auth')).toBeTruthy();
@@ -167,7 +182,7 @@ test.describe('Website Pages - TypeORM Integration', () => {
];
for (const route of invalidRoutes) {
const response = await page.goto(`${API_BASE_URL}${route}`);
const response = await page.goto(`${WEBSITE_BASE_URL}${route}`);
const status = response?.status();
const url = page.url();