clean routes
This commit is contained in:
256
apps/website/lib/auth/RouteAccessPolicy.test.ts
Normal file
256
apps/website/lib/auth/RouteAccessPolicy.test.ts
Normal file
@@ -0,0 +1,256 @@
|
||||
import { RouteAccessPolicy } from './RouteAccessPolicy';
|
||||
import { RouteCatalog } from './RouteCatalog';
|
||||
|
||||
describe('RouteAccessPolicy', () => {
|
||||
let policy: RouteAccessPolicy;
|
||||
let catalog: RouteCatalog;
|
||||
|
||||
beforeEach(() => {
|
||||
catalog = new RouteCatalog();
|
||||
policy = new RouteAccessPolicy(catalog);
|
||||
});
|
||||
|
||||
describe('isPublic', () => {
|
||||
it('should return true for public routes', () => {
|
||||
const publicRoutes = [
|
||||
'/',
|
||||
'/leagues',
|
||||
'/drivers',
|
||||
'/teams',
|
||||
'/leaderboards',
|
||||
'/races',
|
||||
'/sponsor/signup',
|
||||
'/auth/login',
|
||||
'/auth/signup',
|
||||
'/auth/forgot-password',
|
||||
'/auth/reset-password',
|
||||
'/404',
|
||||
'/500',
|
||||
];
|
||||
|
||||
publicRoutes.forEach(route => {
|
||||
expect(policy.isPublic(route)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
it('should return false for protected routes', () => {
|
||||
const protectedRoutes = [
|
||||
'/dashboard',
|
||||
'/onboarding',
|
||||
'/profile',
|
||||
'/profile/settings',
|
||||
'/sponsor/dashboard',
|
||||
'/sponsor/billing',
|
||||
'/admin/users',
|
||||
'/leagues/create',
|
||||
];
|
||||
|
||||
protectedRoutes.forEach(route => {
|
||||
expect(policy.isPublic(route)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle wildcard patterns', () => {
|
||||
// These should match patterns from RouteCatalog
|
||||
expect(policy.isPublic('/leagues/123')).toBe(true);
|
||||
expect(policy.isPublic('/drivers/456')).toBe(true);
|
||||
expect(policy.isPublic('/teams/789')).toBe(true);
|
||||
expect(policy.isPublic('/races/123')).toBe(true);
|
||||
expect(policy.isPublic('/races/all')).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isAuthPage', () => {
|
||||
it('should return true for auth pages', () => {
|
||||
const authRoutes = [
|
||||
'/auth/login',
|
||||
'/auth/signup',
|
||||
'/auth/forgot-password',
|
||||
'/auth/reset-password',
|
||||
];
|
||||
|
||||
authRoutes.forEach(route => {
|
||||
expect(policy.isAuthPage(route)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
it('should return false for non-auth pages', () => {
|
||||
const nonAuthRoutes = [
|
||||
'/',
|
||||
'/dashboard',
|
||||
'/leagues',
|
||||
'/sponsor/dashboard',
|
||||
'/admin/users',
|
||||
];
|
||||
|
||||
nonAuthRoutes.forEach(route => {
|
||||
expect(policy.isAuthPage(route)).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('requiredRoles', () => {
|
||||
it('should return null for public routes', () => {
|
||||
const publicRoutes = [
|
||||
'/',
|
||||
'/leagues',
|
||||
'/drivers',
|
||||
'/auth/login',
|
||||
];
|
||||
|
||||
publicRoutes.forEach(route => {
|
||||
expect(policy.requiredRoles(route)).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
it('should return null for auth-only routes (no specific role)', () => {
|
||||
const authRoutes = [
|
||||
'/dashboard',
|
||||
'/onboarding',
|
||||
'/profile',
|
||||
'/profile/settings',
|
||||
'/profile/leagues',
|
||||
];
|
||||
|
||||
authRoutes.forEach(route => {
|
||||
expect(policy.requiredRoles(route)).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
it('should return sponsor role for sponsor routes', () => {
|
||||
const sponsorRoutes = [
|
||||
'/sponsor',
|
||||
'/sponsor/dashboard',
|
||||
'/sponsor/billing',
|
||||
'/sponsor/campaigns',
|
||||
'/sponsor/leagues',
|
||||
'/sponsor/settings',
|
||||
];
|
||||
|
||||
sponsorRoutes.forEach(route => {
|
||||
expect(policy.requiredRoles(route)).toEqual(['sponsor']);
|
||||
});
|
||||
});
|
||||
|
||||
it('should return admin roles for admin routes', () => {
|
||||
const adminRoutes = [
|
||||
'/admin',
|
||||
'/admin/users',
|
||||
'/leagues/123/schedule/admin',
|
||||
'/leagues/123/roster/admin',
|
||||
'/leagues/123/stewarding',
|
||||
'/leagues/123/wallet',
|
||||
];
|
||||
|
||||
adminRoutes.forEach(route => {
|
||||
expect(policy.requiredRoles(route)).toEqual(['system-owner', 'super-admin', 'league-admin']);
|
||||
});
|
||||
});
|
||||
|
||||
it('should return steward roles for race stewarding routes', () => {
|
||||
const stewardRoutes = [
|
||||
'/races/456/stewarding',
|
||||
];
|
||||
|
||||
stewardRoutes.forEach(route => {
|
||||
expect(policy.requiredRoles(route)).toEqual(['system-owner', 'super-admin', 'league-steward']);
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle league-specific admin routes', () => {
|
||||
const result = policy.requiredRoles('/leagues/abc-123/settings');
|
||||
expect(result).toEqual(['system-owner', 'super-admin', 'league-admin']);
|
||||
});
|
||||
|
||||
it('should handle race-specific stewarding routes', () => {
|
||||
const result = policy.requiredRoles('/races/xyz-789/stewarding');
|
||||
expect(result).toEqual(['system-owner', 'super-admin', 'league-steward']);
|
||||
});
|
||||
});
|
||||
|
||||
describe('roleHome', () => {
|
||||
it('should return correct home path for driver role', () => {
|
||||
const result = policy.roleHome('driver');
|
||||
expect(result).toBe('/dashboard');
|
||||
});
|
||||
|
||||
it('should return correct home path for sponsor role', () => {
|
||||
const result = policy.roleHome('sponsor');
|
||||
expect(result).toBe('/sponsor/dashboard');
|
||||
});
|
||||
|
||||
it('should return correct home path for league-admin role', () => {
|
||||
const result = policy.roleHome('league-admin');
|
||||
expect(result).toBe('/admin');
|
||||
});
|
||||
|
||||
it('should return correct home path for league-steward role', () => {
|
||||
const result = policy.roleHome('league-steward');
|
||||
expect(result).toBe('/admin');
|
||||
});
|
||||
|
||||
it('should return correct home path for league-owner role', () => {
|
||||
const result = policy.roleHome('league-owner');
|
||||
expect(result).toBe('/admin');
|
||||
});
|
||||
|
||||
it('should return correct home path for system-owner role', () => {
|
||||
const result = policy.roleHome('system-owner');
|
||||
expect(result).toBe('/admin');
|
||||
});
|
||||
|
||||
it('should return correct home path for super-admin role', () => {
|
||||
const result = policy.roleHome('super-admin');
|
||||
expect(result).toBe('/admin');
|
||||
});
|
||||
|
||||
it('should handle unknown roles gracefully', () => {
|
||||
const result = policy.roleHome('unknown');
|
||||
// Should return a sensible default (dashboard)
|
||||
expect(result).toBe('/dashboard');
|
||||
});
|
||||
});
|
||||
|
||||
describe('roleHomeRouteId', () => {
|
||||
it('should return correct route ID for driver role', () => {
|
||||
const result = policy.roleHomeRouteId('driver');
|
||||
expect(result).toBe('dashboard');
|
||||
});
|
||||
|
||||
it('should return correct route ID for sponsor role', () => {
|
||||
const result = policy.roleHomeRouteId('sponsor');
|
||||
expect(result).toBe('sponsor.dashboard');
|
||||
});
|
||||
|
||||
it('should return correct route ID for admin roles', () => {
|
||||
const adminRoles = ['league-admin', 'league-steward', 'league-owner', 'system-owner', 'super-admin'];
|
||||
|
||||
adminRoles.forEach(role => {
|
||||
const result = policy.roleHomeRouteId(role);
|
||||
expect(result).toBe('admin');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('integration scenarios', () => {
|
||||
it('should correctly classify common user journey paths', () => {
|
||||
// Public user browsing
|
||||
expect(policy.isPublic('/leagues')).toBe(true);
|
||||
expect(policy.requiredRoles('/leagues')).toBeNull();
|
||||
|
||||
// Authenticated user
|
||||
expect(policy.isPublic('/dashboard')).toBe(false);
|
||||
expect(policy.requiredRoles('/dashboard')).toBeNull();
|
||||
|
||||
// Sponsor user
|
||||
expect(policy.isPublic('/sponsor/dashboard')).toBe(false);
|
||||
expect(policy.requiredRoles('/sponsor/dashboard')).toEqual(['sponsor']);
|
||||
expect(policy.roleHome('sponsor')).toBe('/sponsor/dashboard');
|
||||
|
||||
// Admin user
|
||||
expect(policy.isPublic('/admin/users')).toBe(false);
|
||||
expect(policy.requiredRoles('/admin/users')).toEqual(['system-owner', 'super-admin', 'league-admin']);
|
||||
expect(policy.roleHome('league-admin')).toBe('/admin');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user