如何在Angular中对Auth Guard进行单元测试

时间:2020-06-18 22:07:30

标签: angularjs auth-guard

我该如何测试canActivate函数的角度返回函数 哪个会返回布尔值?。

Authgurad.ts: 从'@ angular / core'导入{Injectable,OnInit,EventEmitter,Output,Directive}; 从'@ angular / router'导入{CanActivate,ActivatedRouteSnapshot,Router,RouterStateSnapshot}; 从'rxjs'导入{Observable}; 从“ ../../environments/environment”导入{环境}; 从“ ../services/http.service”导入{HttpService}; 从'angular-oauth2-oidc'导入{OAuthService}; 从“ ../services/oauth2-odic.service”导入{OAuth2OdicService}; 从“ ../services/session.storage.service”导入{SessionStorageService};

@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] : '';
    }
  }

}

0 个答案:

没有答案