Skip to content

Commit e50504e

Browse files
committed
commit
1 parent 0dfa029 commit e50504e

File tree

2 files changed

+145
-1
lines changed

2 files changed

+145
-1
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import { TestBed } from '@angular/core/testing';
2+
import { AuthGuard } from './auth.guard';
3+
import { Router, UrlTree } from '@angular/router';
4+
import { AccountService } from '@shared/services/account/account.service';
5+
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
6+
import { AccountVO } from '@models/account-vo';
7+
import { ArchiveVO } from '@models/index';
8+
9+
describe('AuthGuard', () => {
10+
let guard: AuthGuard;
11+
let accountServiceSpy: jasmine.SpyObj<AccountService>;
12+
let routerSpy: jasmine.SpyObj<Router>;
13+
14+
beforeEach(() => {
15+
accountServiceSpy = jasmine.createSpyObj('AccountService', [
16+
'getAccount',
17+
'hasOwnArchives',
18+
]);
19+
20+
routerSpy = jasmine.createSpyObj('Router', ['createUrlTree', 'parseUrl']);
21+
22+
TestBed.configureTestingModule({
23+
providers: [
24+
AuthGuard,
25+
{ provide: AccountService, useValue: accountServiceSpy },
26+
{ provide: Router, useValue: routerSpy },
27+
],
28+
});
29+
30+
guard = TestBed.inject(AuthGuard);
31+
});
32+
33+
function createMockRouteSnapshot(
34+
query: Record<string, string> = {},
35+
): ActivatedRouteSnapshot {
36+
return {
37+
queryParamMap: {
38+
get: (key: string) => query[key] ?? null,
39+
},
40+
} as any;
41+
}
42+
43+
it('should allow access if no account is found', () => {
44+
accountServiceSpy.getAccount.and.returnValue(null);
45+
const result = guard.canActivate(createMockRouteSnapshot(), {
46+
url: '/signup',
47+
} as RouterStateSnapshot);
48+
expect(result).toBeTrue();
49+
});
50+
51+
it('should redirect to /app/dialog:archives/pending if on /signup with invite params', () => {
52+
accountServiceSpy.getAccount.and.returnValue(
53+
new AccountVO({ accountId: 1 }),
54+
);
55+
56+
const query = {
57+
inviteCode: 'xyz',
58+
fullName: 'Test User',
59+
primaryEmail: '[email protected]',
60+
};
61+
62+
const expectedTree = {} as UrlTree;
63+
routerSpy.createUrlTree.and.returnValue(expectedTree);
64+
65+
const result = guard.canActivate(createMockRouteSnapshot(query), {
66+
url: '/signup',
67+
} as RouterStateSnapshot);
68+
69+
expect(routerSpy.createUrlTree).toHaveBeenCalledWith([
70+
'/app',
71+
{ outlets: { primary: 'private', dialog: 'archives/pending' } },
72+
]);
73+
expect(result).toBe(expectedTree);
74+
});
75+
76+
it('should redirect to /app/private if account has own archives', async () => {
77+
accountServiceSpy.getAccount.and.returnValue(
78+
new AccountVO({ accountId: 1 }),
79+
);
80+
accountServiceSpy.hasOwnArchives.and.returnValue(Promise.resolve(true));
81+
82+
const expectedUrl = {} as UrlTree;
83+
routerSpy.parseUrl.and.returnValue(expectedUrl);
84+
85+
const result = await guard.canActivate(createMockRouteSnapshot(), {
86+
url: '/app/anything',
87+
} as RouterStateSnapshot);
88+
89+
expect(accountServiceSpy.hasOwnArchives).toHaveBeenCalled();
90+
expect(result).toBe(expectedUrl);
91+
expect(routerSpy.parseUrl).toHaveBeenCalledWith('/app/private');
92+
});
93+
94+
it('should redirect to /app/onboarding if account has no own archives', async () => {
95+
accountServiceSpy.getAccount.and.returnValue(
96+
new AccountVO({ accountId: 1 }),
97+
);
98+
accountServiceSpy.hasOwnArchives.and.returnValue(Promise.resolve(false));
99+
100+
const expectedUrl = {} as UrlTree;
101+
routerSpy.parseUrl.and.returnValue(expectedUrl);
102+
103+
const result = await guard.canActivate(createMockRouteSnapshot(), {
104+
url: '/app/anything',
105+
} as RouterStateSnapshot);
106+
107+
expect(accountServiceSpy.hasOwnArchives).toHaveBeenCalled();
108+
expect(result).toBe(expectedUrl);
109+
expect(routerSpy.parseUrl).toHaveBeenCalledWith('/app/onboarding');
110+
});
111+
});

src/app/core/components/my-archives-dialog/my-archives-dialog.component.spec.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,40 @@ describe('MyArchivesDialogComponent', () => {
109109

110110
it('should close dialog onDoneClick', () => {
111111
component.onDoneClick();
112-
112+
113113
expect(dialogRefSpy.close).toHaveBeenCalled();
114114
});
115+
116+
it('should initialize and separate pending/regular archives correctly', async () => {
117+
const mockAccount = new AccountVO({ defaultArchiveId: '111' });
118+
const mockCurrentArchive = new ArchiveVO({ archiveId: '111', fullName: 'Current Archive' });
119+
120+
const pending = new ArchiveVO({
121+
archiveId: '222',
122+
fullName: 'Pending Archive',
123+
status: 'status.generic.pending',
124+
});
125+
126+
const active = new ArchiveVO({
127+
archiveId: '333',
128+
fullName: 'Active Archive',
129+
status: 'status.generic.ok',
130+
});
131+
132+
accountServiceSpy.refreshArchives.and.returnValue(Promise.resolve([new ArchiveVO({})]));
133+
accountServiceSpy.getAccount.and.returnValue(mockAccount);
134+
accountServiceSpy.getArchive.and.returnValue(mockCurrentArchive);
135+
accountServiceSpy.getArchives.and.returnValue([pending, active]);
136+
137+
await component.ngOnInit();
138+
139+
expect(accountServiceSpy.refreshArchives).toHaveBeenCalled();
140+
expect(component.account).toEqual(mockAccount);
141+
expect(component.currentArchive).toEqual(mockCurrentArchive);
142+
expect(component.pendingArchives.length).toBe(1);
143+
expect(component.archives.length).toBe(1);
144+
expect(component.pendingArchives[0].archiveId).toBe('222');
145+
expect(component.archives[0].archiveId).toBe('333');
146+
});
147+
115148
});

0 commit comments

Comments
 (0)