Files
teamwallet/myteamwallet_frontend_modern/src/app/app.routes.spec.ts
2026-08-02 09:22:16 +02:00

80 lines
3.0 KiB
TypeScript

import { TestBed } from '@angular/core/testing';
import { provideRouter, Router } from '@angular/router';
import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting } from '@angular/common/http/testing';
import { routes } from './app.routes';
import { AuthStore } from './core/auth/auth-store';
describe('app routing', () => {
let router: Router;
let authStore: AuthStore;
beforeEach(() => {
localStorage.clear();
TestBed.configureTestingModule({
providers: [provideRouter(routes), provideHttpClient(), provideHttpClientTesting()],
});
router = TestBed.inject(Router);
authStore = TestBed.inject(AuthStore);
});
it('redirects the root path to login when logged out', async () => {
await router.navigateByUrl('/');
expect(router.url).toBe('/auth/login');
});
it('redirects a protected team route to login when logged out', async () => {
await router.navigateByUrl('/team/1/overview');
expect(router.url).toBe('/auth/login');
});
it('redirects the protected users route to login when logged out', async () => {
await router.navigateByUrl('/users');
expect(router.url).toBe('/auth/login');
});
it('allows an authenticated user to open the users route', async () => {
authStore.setSession('token', { id: 1, email: 'a@b.de', firstName: 'A', lastName: 'B' });
await router.navigateByUrl('/users');
expect(router.url).toBe('/users');
});
it('redirects the root path to team-select when logged in', async () => {
authStore.setSession('token', { id: 1, email: 'a@b.de', firstName: 'A', lastName: 'B' });
await router.navigateByUrl('/');
expect(router.url).toBe('/team-select');
});
it('redirects the bare team route to its overview child', async () => {
authStore.setSession('token', { id: 1, email: 'a@b.de', firstName: 'A', lastName: 'B' });
await router.navigateByUrl('/team/1');
expect(router.url).toBe('/team/1/overview');
});
it('falls back to the not-found route for unknown paths', async () => {
await router.navigateByUrl('/does-not-exist');
expect(router.url).toBe('/does-not-exist');
});
it('allows public team routes without a session', async () => {
await router.navigateByUrl('/t/team-a');
expect(router.url).toBe('/t/team-a');
});
it('registers public access management below the protected team shell', () => {
const teamRoute = routes.find((route) => route.path === 'team/:id');
expect(teamRoute?.children?.some((route) => route.path === 'more/public-access')).toBe(true);
});
it('registers the guide below the protected team shell', () => {
const teamRoute = routes.find((route) => route.path === 'team/:id');
expect(teamRoute?.children?.some((route) => route.path === 'more/guide')).toBe(true);
});
it('accepts the password reset URL generated by the backend', async () => {
expect(routes.some((route) => route.path === 'password-change/:hash')).toBe(true);
await router.navigateByUrl('/password-change/reset-hash');
expect(router.url).toBe('/password-change/reset-hash');
});
});