Testing angular guards
Sat Jun 24 2023 10:10:33 GMT+0000 (Coordinated Universal Time)
Saved by @mtommasi
// authentication.guard.spec.ts
----------- example 1 -------------------------------------
@Component({ standalone: true, template: "" })
class DashboardComponent {}
describe("AuthenticationGuard", () => {
let routes: Route[];
beforeEach(() => {
routes = [
{
path: "dashboard",
canActivate: [AuthenticationGuard()],
component: DashboardComponent,
},
];
});
it("should initiate the login flow if there is no valid token", async () => {
const mockOAuthService = {
hasValidAccessToken: jest.fn().mockReturnValue(false),
initCodeFlow: jest.fn(),
};
const mockAuthRedirectService = { saveRoute: jest.fn() };
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
{ provide: OAuthService, useValue: mockOAuthService },
{ provide: AuthRedirectService, useValue: mockAuthRedirectService },
provideRouter(routes),
],
});
await RouterTestingHarness.create("/dashboard");
expect(mockOAuthService.initCodeFlow).toHaveBeenCalled();
expect(mockAuthRedirectService.saveRoute).toHaveBeenCalledWith(
"/dashboard"
);
});
it("should allow access to the dashboard if the token is valid", async () => {
const mockOAuthService = {
hasValidAccessToken: jest.fn().mockReturnValue(true),
initCodeFlow: jest.fn(),
};
const mockAuthRedirectService = { saveRoute: jest.fn() };
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
{ provide: OAuthService, useValue: mockOAuthService },
{ provide: AuthRedirectService, useValue: mockAuthRedirectService },
provideRouter(routes),
],
});
await RouterTestingHarness.create("/dashboard");
expect(TestBed.inject(Router).url).toEqual("/dashboard");
});
it("should allow access to the dashboard if the token is not valid but there is a code query param", async () => {
const mockOAuthService = {
hasValidAccessToken: jest.fn().mockReturnValue(false),
initCodeFlow: jest.fn(),
};
const mockAuthRedirectService = { saveRoute: jest.fn() };
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
{ provide: OAuthService, useValue: mockOAuthService },
{ provide: AuthRedirectService, useValue: mockAuthRedirectService },
provideRouter(routes),
],
});
await RouterTestingHarness.create("/dashboard?code=1234");
expect(TestBed.inject(Router).url).toEqual("/dashboard?code=1234");
});
});
------------------- EXAMPLE 2 --------------------------
@Component({ standalone: true, template: "" })
class AdminComponent {}
@Component({ standalone: true, template: "" })
class LoginComponent {}
describe("FeatureFlagGuard", () => {
let routes: Route[];
let httpMock: HttpTestingController;
beforeEach(() => {
routes = [
{
path: "test",
canActivate: [FeatureFlagGuard("test", "/")],
component: AdminComponent,
},
{ path: "home", component: LoginComponent },
];
});
it("should route back to the home route if the flag is not present and it defaults to off", async () => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
SharedUtilitiesFeatureFlagsModule.forRoot({
defaultToFlagOff: true,
jsonUrl: "/assets/test.config.json",
}),
],
providers: [provideRouter(routes)],
});
httpMock = TestBed.inject(HttpTestingController);
const mockRequest = httpMock.expectOne("/assets/test.config.json");
mockRequest.flush({});
await RouterTestingHarness.create("/test");
expect(TestBed.inject(Router).url).toEqual("/");
});
it("should route to the test route if the flag is not present and it does not default to off", async () => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
SharedUtilitiesFeatureFlagsModule.forRoot({
defaultToFlagOff: false,
jsonUrl: "/assets/test.config.json",
}),
],
providers: [provideRouter(routes)],
});
httpMock = TestBed.inject(HttpTestingController);
const mockRequest = httpMock.expectOne("/assets/test.config.json");
mockRequest.flush({});
await RouterTestingHarness.create("/test");
expect(TestBed.inject(Router).url).toEqual("/test");
});
it("should route to the test route if the flag is turned on", async () => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
SharedUtilitiesFeatureFlagsModule.forRoot({
defaultToFlagOff: true,
jsonUrl: "/assets/test.config.json",
}),
],
providers: [provideRouter(routes)],
});
httpMock = TestBed.inject(HttpTestingController);
const mockRequest = httpMock.expectOne("/assets/test.config.json");
mockRequest.flush({ test: true });
await RouterTestingHarness.create("/test");
expect(TestBed.inject(Router).url).toEqual("/test");
});
it("should not route to the test route if the flag is turned off", async () => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
SharedUtilitiesFeatureFlagsModule.forRoot({
defaultToFlagOff: true,
jsonUrl: "/assets/test.config.json",
}),
],
providers: [provideRouter(routes)],
});
httpMock = TestBed.inject(HttpTestingController);
const mockRequest = httpMock.expectOne("/assets/test.config.json");
mockRequest.flush({ test: false });
await RouterTestingHarness.create("/test");
expect(TestBed.inject(Router).url).toEqual("/");
});
});



Comments