I have an AuthGuard
service responsible for detecting if a user is logged in. If not logged in, I redirect the user to our oauth provider url.
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { environment } from './../../environments/environment';
import { Session } from './../core/security/session.service';
@Injectable()
export class AuthGuard implements CanActivate {
/**
* Class constructor.
* @constructor
*
* @param {Session} - Instance of session.
*/
constructor(private session: Session) {}
/**
* Method to implements from CanActivate interface.
* Check if a user is authenticated.
*
* @return {boolean}
*/
canActivate(): boolean {
if (this.session.isActive()) {
return true;
}
this.redirectToProvider();
return false;
}
/**
* Redirect to Identity unauthorized url.
*/
private redirectToProvider() {
const unauthorizeUrl = environment.api.identity.unauthorizeUrl;
window.location.href = unauthorizeUrl;
}
}
I would like to know if window.location.href
has been called when a Session does not exists. Here is what I did so far:
import { TestBed, async, inject } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AuthGuard } from './auth-guard.service';
import { Session } from './../core/security/session.service';
describe('AuthGuard', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
AuthGuard,
Session
],
imports: [RouterTestingModule]
});
});
describe('.canActivate', () => {
describe('active session', () => {
it('returns true',
async(inject([AuthGuard, Session], (guard, session) => {
session.set({ name: 'user' });
expect(guard.canActivate()).toBeTruthy();
})
));
});
describe('no session', () => {
it('redirects the user',
async(inject([AuthGuard, Session], (guard, session) => {
spyOn(window.location, 'href');
session.destroy();
expect(guard.canActivate()).toBeFalsy();
expect(window.location.href).toHaveBeenCalled();
})
));
});
})
});
but it gives me the following error:
Failed: <spyOn> : href is not declared writable or has no setter
Is there a way to mock the window object to achieve this or do I need to rely on some special class to handle such redirection so I can inject them in test?
Any solution?
RépondreSupprimer