Skip to content

Commit be0c5db

Browse files
feat(guards): add functional guards
1 parent 2ef9133 commit be0c5db

8 files changed

Lines changed: 83 additions & 91 deletions

File tree

src/app/modules/auth/auth.routes.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
import { Route } from '@angular/router';
22
import { authPaths } from '~modules/auth/shared/auth-routes';
33
import { LogInPageComponent } from '~modules/auth/pages/log-in-page/log-in-page.component';
4-
import { NoAuthGuard } from '~modules/shared/guards/no-auth.guard';
54
import { appPaths } from '../../app-routes';
65
import { RegisterPageComponent } from '~modules/auth/pages/register-page/register-page.component';
76
import { LogoutPageComponent } from '~modules/auth/pages/logout-page/logout-page.component';
7+
import { noAuthenticationGuard } from '~modules/shared/guards/no-authentication.guard';
88

99
export const AUTH_ROUTES: Route[] = [
10-
{ path: authPaths.logIn, component: LogInPageComponent, canActivate: [NoAuthGuard] },
11-
{ path: authPaths.register, component: RegisterPageComponent, canActivate: [NoAuthGuard] },
10+
{ path: authPaths.logIn, component: LogInPageComponent, canActivate: [noAuthenticationGuard()] },
11+
{
12+
path: authPaths.register,
13+
component: RegisterPageComponent,
14+
canActivate: [noAuthenticationGuard()],
15+
},
1216
{
1317
path: authPaths.logout,
1418
component: LogoutPageComponent,

src/app/modules/shared/guards/auth.guard.spec.ts

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/app/modules/shared/guards/auth.guard.ts

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { TestBed } from '@angular/core/testing';
2+
import { lastValueFrom, of } from 'rxjs';
3+
import { Router } from '@angular/router';
4+
import { AuthRepository } from '~modules/auth/store/auth.repository';
5+
import { authenticationGuard } from '~modules/shared/guards/authentication.guard';
6+
7+
// eslint-disable-next-line max-lines-per-function
8+
describe('AuthenticationGuard', () => {
9+
const mockRouter = jasmine.createSpyObj<Router>(['navigate']);
10+
mockRouter.navigate.and.returnValue(lastValueFrom(of(true)));
11+
12+
const setup = (authRepositoryMock: unknown) => {
13+
TestBed.configureTestingModule({
14+
providers: [
15+
authenticationGuard,
16+
{ provide: AuthRepository, useValue: authRepositoryMock },
17+
{ provide: Router, useValue: mockRouter },
18+
],
19+
});
20+
21+
return TestBed.runInInjectionContext(authenticationGuard);
22+
};
23+
24+
it('should allow to continue', () => {
25+
const mockDomainService: unknown = {
26+
isLoggedInValue: () => true,
27+
};
28+
const guard = setup(mockDomainService);
29+
expect(guard).toBe(true);
30+
});
31+
32+
it('should redirect to /', () => {
33+
const mockDomainService: unknown = {
34+
isLoggedInValue: () => false,
35+
};
36+
const guard = setup(mockDomainService);
37+
expect(guard).toBe(false);
38+
expect(mockRouter.navigate).toHaveBeenCalledWith(['/']);
39+
});
40+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { inject } from '@angular/core';
2+
import { Router } from '@angular/router';
3+
import { appRoutes } from '../../../app-routes';
4+
import { AuthRepository } from '~modules/auth/store/auth.repository';
5+
6+
export const authenticationGuard = () => {
7+
const authRepository: AuthRepository = inject(AuthRepository);
8+
if (authRepository.isLoggedInValue()) {
9+
return true;
10+
} else {
11+
const router: Router = inject(Router);
12+
router.navigate([appRoutes.home]);
13+
return false;
14+
}
15+
};

src/app/modules/shared/guards/no-auth.guard.ts

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { userRoutes } from '~modules/user/shared/user-routes';
2+
import { inject } from '@angular/core';
3+
import { CanActivateFn, Router } from '@angular/router';
4+
import { AuthRepository } from '~modules/auth/store/auth.repository';
5+
6+
export function noAuthenticationGuard(): CanActivateFn {
7+
return () => {
8+
const authRepository: AuthRepository = inject(AuthRepository);
9+
if (!authRepository.isLoggedInValue()) {
10+
return true;
11+
} else {
12+
const router: Router = inject(Router);
13+
router.navigate([userRoutes.dashboard]);
14+
return false;
15+
}
16+
};
17+
}

src/app/modules/user/user.routes.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,25 @@ import { Route } from '@angular/router';
22
import { appPaths } from '../../app-routes';
33
import { userPaths } from '~modules/user/shared/user-routes';
44
import { DashboardPageComponent } from '~modules/user/pages/dashboard/dashboard-page.component';
5-
import { AuthGuard } from '~modules/shared/guards/auth.guard';
65
import { MyAccountComponent } from '~modules/user/pages/my-account/my-account.component';
76
import { MyHeroesPageComponent } from '~modules/user/pages/my-heroes/my-heroes-page.component';
7+
import { authenticationGuard } from '~modules/shared/guards/authentication.guard';
88

99
export const USER_ROUTES: Route[] = [
1010
{
1111
path: userPaths.dashboard,
1212
component: DashboardPageComponent,
13-
canActivate: [AuthGuard],
13+
canActivate: [authenticationGuard()],
1414
},
1515
{
1616
path: userPaths.myHeroes,
1717
component: MyHeroesPageComponent,
18-
canActivate: [AuthGuard],
18+
canActivate: [authenticationGuard()],
1919
},
2020
{
2121
path: userPaths.myAccount,
2222
component: MyAccountComponent,
23-
canActivate: [AuthGuard],
23+
canActivate: [authenticationGuard()],
2424
},
2525
{ path: '**', redirectTo: appPaths.error404 },
2626
];

0 commit comments

Comments
 (0)