Skip to content

Commit 6c9ffff

Browse files
Merge pull request #1174 from marklagendijk/can-activate-child
Implemented CanActivateChild interface for auto-login guards
2 parents bdd023d + 0114041 commit 6c9ffff

File tree

4 files changed

+80
-4
lines changed

4 files changed

+80
-4
lines changed

projects/angular-auth-oidc-client/src/lib/auto-login/auto-login-all-routes.guard.spec.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,40 @@ describe(`AutoLoginAllRoutesGuard`, () => {
105105
);
106106
});
107107

108+
describe('canActivateChild', () => {
109+
it(
110+
'should save current route and call `login` if not authenticated already',
111+
waitForAsync(() => {
112+
spyOn(checkAuthService, 'checkAuth').and.returnValue(of({ isAuthenticated: false } as LoginResponse));
113+
const checkSavedRedirectRouteAndNavigateSpy = spyOn(autoLoginService, 'checkSavedRedirectRouteAndNavigate');
114+
const saveRedirectRouteSpy = spyOn(autoLoginService, 'saveRedirectRoute');
115+
const loginSpy = spyOn(loginService, 'login');
116+
117+
autoLoginAllRoutesGuard.canActivateChild(null, { url: 'some-url1' } as RouterStateSnapshot).subscribe(() => {
118+
expect(saveRedirectRouteSpy).toHaveBeenCalledOnceWith('configId', 'some-url1');
119+
expect(loginSpy).toHaveBeenCalledOnceWith('configId');
120+
expect(checkSavedRedirectRouteAndNavigateSpy).not.toHaveBeenCalled();
121+
});
122+
})
123+
);
124+
125+
it(
126+
'should call `checkSavedRedirectRouteAndNavigate` if authenticated already',
127+
waitForAsync(() => {
128+
spyOn(checkAuthService, 'checkAuth').and.returnValue(of({ isAuthenticated: true } as LoginResponse));
129+
const checkSavedRedirectRouteAndNavigateSpy = spyOn(autoLoginService, 'checkSavedRedirectRouteAndNavigate');
130+
const saveRedirectRouteSpy = spyOn(autoLoginService, 'saveRedirectRoute');
131+
const loginSpy = spyOn(loginService, 'login');
132+
133+
autoLoginAllRoutesGuard.canActivateChild(null, { url: 'some-url1' } as RouterStateSnapshot).subscribe(() => {
134+
expect(saveRedirectRouteSpy).not.toHaveBeenCalled();
135+
expect(loginSpy).not.toHaveBeenCalled();
136+
expect(checkSavedRedirectRouteAndNavigateSpy).toHaveBeenCalledOnceWith('configId');
137+
});
138+
})
139+
);
140+
});
141+
108142
describe('canLoad', () => {
109143
it(
110144
'should save current route (empty) and call `login` if not authenticated already',

projects/angular-auth-oidc-client/src/lib/auto-login/auto-login-all-routes.guard.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Injectable } from '@angular/core';
2-
import { ActivatedRouteSnapshot, CanActivate, CanLoad, Route, RouterStateSnapshot, UrlSegment } from '@angular/router';
2+
import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, CanLoad, Route, RouterStateSnapshot, UrlSegment } from '@angular/router';
33
import { Observable } from 'rxjs';
44
import { map, take } from 'rxjs/operators';
55
import { CheckAuthService } from '../check-auth.service';
@@ -8,7 +8,7 @@ import { LoginService } from '../login/login.service';
88
import { AutoLoginService } from './auto-login.service';
99

1010
@Injectable({ providedIn: 'root' })
11-
export class AutoLoginAllRoutesGuard implements CanActivate, CanLoad {
11+
export class AutoLoginAllRoutesGuard implements CanActivate, CanActivateChild, CanLoad {
1212
constructor(
1313
private autoLoginService: AutoLoginService,
1414
private checkAuthService: CheckAuthService,
@@ -26,6 +26,10 @@ export class AutoLoginAllRoutesGuard implements CanActivate, CanLoad {
2626
return this.checkAuth(state.url);
2727
}
2828

29+
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
30+
return this.checkAuth(state.url);
31+
}
32+
2933
private checkAuth(url: string): Observable<boolean> {
3034
const configId = this.getId();
3135

projects/angular-auth-oidc-client/src/lib/auto-login/auto-login-partial-routes.guard.spec.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,40 @@ describe(`AutoLoginPartialRoutesGuard`, () => {
102102
);
103103
});
104104

105+
describe('canActivateChild', () => {
106+
it(
107+
'should save current route and call `login` if not authenticated already',
108+
waitForAsync(() => {
109+
spyOn(authStateService, 'areAuthStorageTokensValid').and.returnValue(false);
110+
const checkSavedRedirectRouteAndNavigateSpy = spyOn(autoLoginService, 'checkSavedRedirectRouteAndNavigate');
111+
const saveRedirectRouteSpy = spyOn(autoLoginService, 'saveRedirectRoute');
112+
const loginSpy = spyOn(loginService, 'login');
113+
114+
autoLoginPartialRoutesGuard.canActivateChild(null, { url: 'some-url1' } as RouterStateSnapshot);
115+
116+
expect(saveRedirectRouteSpy).toHaveBeenCalledOnceWith('configId', 'some-url1');
117+
expect(loginSpy).toHaveBeenCalledOnceWith('configId');
118+
expect(checkSavedRedirectRouteAndNavigateSpy).not.toHaveBeenCalled();
119+
})
120+
);
121+
122+
it(
123+
'should call `checkSavedRedirectRouteAndNavigate` if authenticated already',
124+
waitForAsync(() => {
125+
spyOn(authStateService, 'areAuthStorageTokensValid').and.returnValue(true);
126+
const checkSavedRedirectRouteAndNavigateSpy = spyOn(autoLoginService, 'checkSavedRedirectRouteAndNavigate');
127+
const saveRedirectRouteSpy = spyOn(autoLoginService, 'saveRedirectRoute');
128+
const loginSpy = spyOn(loginService, 'login');
129+
130+
autoLoginPartialRoutesGuard.canActivateChild(null, { url: 'some-url1' } as RouterStateSnapshot);
131+
132+
expect(saveRedirectRouteSpy).not.toHaveBeenCalled();
133+
expect(loginSpy).not.toHaveBeenCalled();
134+
expect(checkSavedRedirectRouteAndNavigateSpy).toHaveBeenCalledOnceWith('configId');
135+
})
136+
);
137+
});
138+
105139
describe('canLoad', () => {
106140
it(
107141
'should save current route (empty) and call `login` if not authenticated already',

projects/angular-auth-oidc-client/src/lib/auto-login/auto-login-partial-routes.guard.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { Injectable } from '@angular/core';
2-
import { ActivatedRouteSnapshot, CanActivate, CanLoad, Route, RouterStateSnapshot, UrlSegment } from '@angular/router';
2+
import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, CanLoad, Route, RouterStateSnapshot, UrlSegment } from '@angular/router';
33
import { AuthStateService } from '../auth-state/auth-state.service';
44
import { ConfigurationProvider } from '../config/provider/config.provider';
55
import { LoginService } from '../login/login.service';
66
import { AutoLoginService } from './auto-login.service';
77

88
@Injectable({ providedIn: 'root' })
9-
export class AutoLoginPartialRoutesGuard implements CanActivate, CanLoad {
9+
export class AutoLoginPartialRoutesGuard implements CanActivate, CanActivateChild, CanLoad {
1010
constructor(
1111
private autoLoginService: AutoLoginService,
1212
private authStateService: AuthStateService,
@@ -24,6 +24,10 @@ export class AutoLoginPartialRoutesGuard implements CanActivate, CanLoad {
2424
return this.checkAuth(state.url);
2525
}
2626

27+
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
28+
return this.checkAuth(state.url);
29+
}
30+
2731
private checkAuth(url: string): boolean {
2832
const configId = this.getId();
2933

0 commit comments

Comments
 (0)