This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/texera.git
The following commit(s) were added to refs/heads/main by this push:
new 3b0b1dba15 test(frontend): add spec for AuthGuardService (#5459)
3b0b1dba15 is described below
commit 3b0b1dba154671da9172833b2b0722c5c54b82df
Author: Meng Wang <[email protected]>
AuthorDate: Tue Jun 16 15:29:21 2026 -0700
test(frontend): add spec for AuthGuardService (#5459)
### What changes were proposed in this PR?
Adds a unit spec for `AuthGuardService`, which previously had none.
Covers `canActivate()`:
- logged-in user → returns `true`, no redirect
- logged-out user at the root url → returns `false`, redirects to
`ABOUT` with `returnUrl: null`
- logged-out user at a deep link → returns `false`, redirects to `ABOUT`
preserving the `returnUrl`
Follows `frontend/TESTING.md` (Vitest): reuses `StubUserService` for
`UserService`, spreads `commonTestProviders` for `GuiConfigService`, and
mocks `Router` inline.
### Any related issues, documentation, discussions?
Closes #5453.
### How was this PR tested?
`yarn test --include='**/auth-guard.service.spec.ts'` → 3 passed.
`prettier --check` clean.
### Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (claude-opus-4-7)
---
.../common/service/user/auth-guard.service.spec.ts | 70 ++++++++++++++++++++++
1 file changed, 70 insertions(+)
diff --git a/frontend/src/app/common/service/user/auth-guard.service.spec.ts
b/frontend/src/app/common/service/user/auth-guard.service.spec.ts
new file mode 100644
index 0000000000..482d8db4ac
--- /dev/null
+++ b/frontend/src/app/common/service/user/auth-guard.service.spec.ts
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { TestBed } from "@angular/core/testing";
+import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from
"@angular/router";
+
+import { AuthGuardService } from "./auth-guard.service";
+import { UserService } from "./user.service";
+import { MOCK_USER, StubUserService } from "./stub-user.service";
+import { ABOUT } from "../../../app-routing.constant";
+import { commonTestProviders } from "../../testing/test-utils";
+
+describe("AuthGuardService", () => {
+ let guard: AuthGuardService;
+ let userService: StubUserService;
+ let routerSpy: { navigate: ReturnType<typeof vi.fn> };
+
+ const route = {} as ActivatedRouteSnapshot;
+ const stateAt = (url: string): RouterStateSnapshot => ({ url }) as
RouterStateSnapshot;
+
+ beforeEach(() => {
+ routerSpy = { navigate: vi.fn() };
+ TestBed.configureTestingModule({
+ providers: [
+ AuthGuardService,
+ { provide: UserService, useClass: StubUserService },
+ { provide: Router, useValue: routerSpy },
+ ...commonTestProviders,
+ ],
+ });
+ guard = TestBed.inject(AuthGuardService);
+ userService = TestBed.inject(UserService) as unknown as StubUserService;
+ });
+
+ it("allows navigation and does not redirect when the user is logged in", ()
=> {
+ userService.user = MOCK_USER;
+ expect(guard.canActivate(route,
stateAt("/dashboard/user/workflow/42"))).toBe(true);
+ expect(routerSpy.navigate).not.toHaveBeenCalled();
+ });
+
+ it("blocks navigation and redirects to ABOUT with a null returnUrl from the
root url", () => {
+ userService.user = undefined;
+ expect(guard.canActivate(route, stateAt("/"))).toBe(false);
+ expect(routerSpy.navigate).toHaveBeenCalledWith([ABOUT], { queryParams: {
returnUrl: null } });
+ });
+
+ it("blocks navigation and preserves the return url for a deep link", () => {
+ userService.user = undefined;
+ expect(guard.canActivate(route,
stateAt("/dashboard/user/workflow/42"))).toBe(false);
+ expect(routerSpy.navigate).toHaveBeenCalledWith([ABOUT], {
+ queryParams: { returnUrl: "/dashboard/user/workflow/42" },
+ });
+ });
+});