75 lines
2.8 KiB
TypeScript
75 lines
2.8 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('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');
|
|
});
|
|
});
|