Как выполнить модульное тестирование Auth Guard в Angular - PullRequest
0 голосов
/ 19 июня 2020

Как я могу проверить функцию canActivate для angular, которая возвращает функцию, которая, в свою очередь, возвращает логическое значение?.

Authgurad.ts: import {Injectable, OnInit, EventEmitter, Output, Directive} from ' @ angular / core '; импортировать {CanActivate, ActivatedRouteSnapshot, Router, RouterStateSnapshot} из '@ angular / router'; import {Observable} из 'rx js'; импортировать {среду} из '../../environments/environment'; импортировать {HttpService} из '../services/http.service'; import {OAuthService} из 'angular -oauth2-oid c'; импортировать {OAuth2OdicService} из '../services/oauth2-odic.service'; импортировать {SessionStorageService} из '../services/session.storage.service';

@Directive({
  selector: '[AuthGuard]',
  host: {},
  providers: []
})


@Injectable()
export class AuthGuard implements CanActivate {
  public accessToken: string;

  @Output() valueChange = new EventEmitter();

  constructor(
    private sessionStorageService: SessionStorageService,
    private oauthService: OAuth2OdicService,
    private router: Router,
    private httpService: HttpService) {
  }

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot) {

    return new Promise<boolean>((resolve, reject) => {
     const canAuthenticate = (route.fragment !== null && !!route.fragment);
      if (!canAuthenticate && !sessionStorage.getItem('id_token')) {
         this.login();
        reject(false);
      } else {
        const accessToken = this.getQueryParam(route.fragment, 'access_token');
        const idToken = this.getQueryParam(route.fragment, 'id_token');
        const tokenType = this.getQueryParam(route.fragment, 'token_type');
        if (accessToken && idToken && tokenType) {
          this.sessionStorageService.setItem('id_token', idToken);
          this.sessionStorageService.setItem('access_token', accessToken);
          this.sessionStorageService.setItem('token_type', tokenType);
          resolve(true);
          this.router.navigate(['/search']);
        } else {
          if (sessionStorage.getItem('access_token') && sessionStorage.getItem('id_token')) {
            resolve(true);
            this.router.navigate(['/search']);
          }
        }
      }
    });

  }

  private login() {
    this.httpService.getConfigurations().subscribe(data => {
      const redirectUri = window.location.origin;
      const clientId = data.clientId;
      const loginUrl = data.authenticationUrl ;
      const accessToken = this.oauthService.initImplicitFlow(loginUrl + '?', clientId, redirectUri + '/');
     });
  }

  private getQueryParam(queryString: string, paramName: string) {
    if (queryString && paramName) {
      const expression = new RegExp(`${paramName}=([^&]*)`);
      const results = queryString.match(expression);
      return results[1] ? results[1] : '';
    }
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...