256 lines
7.5 KiB
TypeScript
256 lines
7.5 KiB
TypeScript
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('protected.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');
|
|
});
|
|
});
|
|
}); |