Skip to content

Commit 1f91e5e

Browse files
committed
[NAE-2125] Remove URI service usage from admin and menu items
- Added unit tests for `AbstractBreadcrumbsComponent` to validate redirection logic and error handling. - Enhanced test coverage for `AbstractNavigationDoubleDrawerComponent` by adding tests for menu state, sorting, and resize handling. - Updated `MockUriResourceService` with consistent root path conventions. - Extended `MockUserService` with logout and empty user functionality.
1 parent 62c3763 commit 1f91e5e

File tree

4 files changed

+167
-15
lines changed

4 files changed

+167
-15
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import { TestBed } from '@angular/core/testing';
2+
import { Router } from '@angular/router';
3+
import { LoggerService } from '../../logger/services/logger.service';
4+
import { PathService } from '../service/path.service';
5+
import { CaseResourceService } from '../../resources/engine-endpoint/case-resource.service';
6+
import { ActivatedRoute } from '@angular/router';
7+
import { DynamicNavigationRouteProviderService } from '../../routing/dynamic-navigation-route-provider/dynamic-navigation-route-provider.service';
8+
import { TranslateService } from '@ngx-translate/core';
9+
import {AbstractBreadcrumbsComponent} from "./abstract-breadcrumbs.component";
10+
11+
class TestBreadcrumbsComponent extends AbstractBreadcrumbsComponent {
12+
constructor(
13+
pathService,
14+
caseResourceService,
15+
activatedRoute,
16+
router,
17+
dynamicRoutingService,
18+
translateService,
19+
logger
20+
) {
21+
super(
22+
pathService,
23+
caseResourceService,
24+
activatedRoute,
25+
router,
26+
dynamicRoutingService,
27+
translateService,
28+
logger
29+
);
30+
}
31+
public setRedirectUrls(map: Map<string, Array<string>>) {
32+
(this as any).redirectUrls = map;
33+
}
34+
}
35+
36+
37+
describe('AbstractBreadcrumbsComponent', () => {
38+
let component: TestBreadcrumbsComponent;
39+
let mockRouter: any;
40+
let mockPathService: any;
41+
let mockLogger: any;
42+
43+
beforeEach(() => {
44+
mockRouter = jasmine.createSpyObj('Router', ['navigate']);
45+
mockRouter.navigate.and.returnValue(Promise.resolve(true));
46+
47+
mockPathService = {
48+
activePath: '/test',
49+
splitPath: jasmine.createSpy('splitPath').and.returnValue(['', 'test']),
50+
reset: jasmine.createSpy('reset')
51+
};
52+
mockLogger = jasmine.createSpyObj('LoggerService', ['error']);
53+
const mockCaseResourceService = { searchCases: jasmine.createSpy('searchCases') };
54+
const mockActivatedRoute = { snapshot: { params: { filterCaseId: 'filter1' } } };
55+
const mockDynamicRoutingService = { route: '/dummy-route' };
56+
const mockTranslateService = { currentLang: 'en-US' };
57+
58+
TestBed.configureTestingModule({
59+
providers: [
60+
{ provide: Router, useValue: mockRouter },
61+
{ provide: PathService, useValue: mockPathService },
62+
{ provide: LoggerService, useValue: mockLogger },
63+
{ provide: CaseResourceService, useValue: mockCaseResourceService },
64+
{ provide: ActivatedRoute, useValue: mockActivatedRoute },
65+
{ provide: DynamicNavigationRouteProviderService, useValue: mockDynamicRoutingService },
66+
{ provide: TranslateService, useValue: mockTranslateService },
67+
]
68+
});
69+
70+
component = new TestBreadcrumbsComponent(
71+
TestBed.inject(PathService),
72+
TestBed.inject(CaseResourceService),
73+
TestBed.inject(ActivatedRoute),
74+
TestBed.inject(Router),
75+
TestBed.inject(DynamicNavigationRouteProviderService),
76+
TestBed.inject(TranslateService),
77+
TestBed.inject(LoggerService)
78+
);
79+
80+
component.setRedirectUrls(new Map());
81+
component.redirectOnClick = true;
82+
});
83+
84+
85+
it('should navigate to target if redirect target exists', () => {
86+
component.setRedirectUrls(new Map([['/test', ['/somewhere']]]));
87+
component.redirect();
88+
expect(mockRouter.navigate).toHaveBeenCalledWith(['/somewhere']);
89+
expect(mockLogger.error).not.toHaveBeenCalled();
90+
});
91+
92+
it('should log error if redirect target does not exist', () => {
93+
component.setRedirectUrls(new Map());
94+
component.redirect();
95+
expect(mockRouter.navigate).not.toHaveBeenCalled();
96+
expect(mockLogger.error).toHaveBeenCalledWith("Missing required data for redirecting breadcrumbs.");
97+
});
98+
99+
it('should not navigate if redirectOnClick is false', () => {
100+
component.redirectOnClick = false;
101+
component.setRedirectUrls(new Map([['/test', ['/somewhere']]]));
102+
component.redirect();
103+
expect(mockRouter.navigate).not.toHaveBeenCalled();
104+
expect(mockLogger.error).not.toHaveBeenCalled();
105+
});
106+
});

projects/netgrif-components-core/src/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.spec.ts

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ import {AbstractNavigationDoubleDrawerComponent} from './abstract-navigation-dou
3838
import {TranslateService} from "@ngx-translate/core";
3939
import {CaseResourceService} from "../../resources/engine-endpoint/case-resource.service";
4040
import {MockCaseResourceService} from "../../utility/tests/mocks/mock-case-resource.service";
41+
import {MenuOrder} from "../model/navigation-configs";
42+
import {MockUserService} from "../../utility/tests/mocks/mock-user.service";
4143

42-
xdescribe('AbstractNavigationDoubleDrawerComponent', () => {
44+
describe('AbstractNavigationDoubleDrawerComponent', () => {
4345
let component: TestDrawerComponent;
4446
let fixture: ComponentFixture<TestDrawerComponent>;
4547

@@ -66,13 +68,14 @@ xdescribe('AbstractNavigationDoubleDrawerComponent', () => {
6668
{provide: UserPreferenceService, useClass: MockUserPreferenceService},
6769
{provide: CaseResourceService, useClass: MockCaseResourceService},
6870
{provide: UriResourceService, useClass: MockUriResourceService},
71+
{provide: UserService, useClass: MockUserService},
6972
],
7073
schemas: [CUSTOM_ELEMENTS_SCHEMA],
7174
}).compileComponents();
7275
fixture = TestBed.createComponent(TestDrawerComponent);
7376
component = fixture.componentInstance;
74-
spyOn(component, 'toggleLeftMenu');
75-
spyOn(component, 'toggleRightMenu');
77+
spyOn(component, 'toggleLeftMenu').and.callThrough();
78+
spyOn(component, 'toggleRightMenu').and.callThrough();
7679
fixture.detectChanges();
7780
}));
7881

@@ -123,8 +126,45 @@ xdescribe('AbstractNavigationDoubleDrawerComponent', () => {
123126

124127
it('should check the menu state', () => {
125128
expect(component.isOnZeroLevel()).toBeTruthy();
126-
expect(component.isLeftItemsEmpty).toBeTruthy();
127-
expect(component.isRightItemsEmpty).toBeTruthy();
129+
expect(component.isLeftItemsEmpty()).toBeTruthy();
130+
expect(component.isRightItemsEmpty()).toBeTruthy();
131+
});
132+
133+
it('should load more items', () => {
134+
component.moreItems = [{id: 'a'}, {id: 'b'}, {id: 'c'}] as any;
135+
component.rightItems = [];
136+
component.loadMoreItems();
137+
expect(component.rightItems.length).toBeGreaterThan(0);
138+
});
139+
140+
it('should switch order and change sorting', () => {
141+
component.rightItems = [
142+
{navigation: {title: 'Z'}, id: '1'} as any,
143+
{navigation: {title: 'A'}, id: '2'} as any
144+
];
145+
component.leftItems = [
146+
{navigation: {title: 'B'}, id: '3'} as any,
147+
{navigation: {title: 'C'}, id: '4'} as any
148+
];
149+
component.itemsOrder = MenuOrder.Ascending;
150+
component.switchOrder();
151+
console.log(MenuOrder);
152+
expect(component.itemsOrder).toBe(MenuOrder.Descending as any);
153+
});
154+
155+
156+
it('should return id in itemsTrackBy', () => {
157+
expect(component.itemsTrackBy(1, {id: 'test'} as any)).toBe('test');
158+
});
159+
160+
it('should return node path in uriNodeTrackBy', () => {
161+
expect(component.uriNodeTrackBy(2, {path: '/test'} as any)).toBe('/test');
162+
});
163+
164+
it('should handle resize event', () => {
165+
const event = {rectangle: {width: 420}} as any;
166+
component.onResizeEvent(event);
167+
expect(component.configRightMenu.width).toBe(420);
128168
});
129169

130170
});
@@ -152,5 +192,3 @@ class TestDrawerComponent extends AbstractNavigationDoubleDrawerComponent {
152192
_log, _config, _pathService, _caseResourceService, _impersonationUserSelect, _impersonation, _dynamicRouteProviderService);
153193
}
154194
}
155-
156-

projects/netgrif-components-core/src/lib/utility/tests/mocks/mock-uri-resource.service.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import {ResourceProvider} from '../../../resources/resource-provider.service';
99
export class MockUriResourceService extends UriResourceService {
1010

1111
static TEST1_ID = 'test1';
12-
static TEST1_PATH = 'root/test1';
12+
static TEST1_PATH = '/test1';
1313
static TEST2_ID = 'test2';
14-
static TEST2_PATH = 'root/test2';
14+
static TEST2_PATH = '/test2';
1515

1616
private _root: UriNodeResource = {
17-
id: 'root',
18-
path: 'root',
17+
id: '/',
18+
path: '/',
1919
name: 'root',
2020
parentId: null,
2121
parent: undefined,
@@ -28,7 +28,7 @@ export class MockUriResourceService extends UriResourceService {
2828
id: MockUriResourceService.TEST1_ID,
2929
path: MockUriResourceService.TEST1_PATH,
3030
name: MockUriResourceService.TEST1_ID,
31-
parentId: 'root',
31+
parentId: '/',
3232
parent: this._root,
3333
childrenId: undefined,
3434
children: undefined,
@@ -39,7 +39,7 @@ export class MockUriResourceService extends UriResourceService {
3939
id: MockUriResourceService.TEST2_ID,
4040
path: MockUriResourceService.TEST2_PATH,
4141
name: MockUriResourceService.TEST2_ID,
42-
parentId: 'root',
42+
parentId: '/',
4343
parent: this._root,
4444
childrenId: undefined,
4545
children: undefined,
@@ -61,7 +61,7 @@ export class MockUriResourceService extends UriResourceService {
6161
}
6262

6363
getNodesByParent(parentId: string): Observable<Array<UriNodeResource>> {
64-
if (parentId === 'root') return of([this._test1Node, this._test2Node]);
64+
if (parentId === '/') return of([this._test1Node, this._test2Node]);
6565
return of([this._root]);
6666
}
6767

projects/netgrif-components-core/src/lib/utility/tests/mocks/mock-user.service.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Injectable} from '@angular/core';
2-
import {Observable, ReplaySubject} from 'rxjs';
2+
import {Observable, of, ReplaySubject} from 'rxjs';
33
import {User} from '../../../user/models/user';
44

55
@Injectable()
@@ -50,4 +50,12 @@ export class MockUserService {
5050
return this.isUserEmpty(this.user)
5151
}
5252

53+
logout() {
54+
this._user = this.emptyUser()
55+
return of({});
56+
}
57+
58+
protected emptyUser() {
59+
return new User('', '', '', '', '', '', [], [], [], []);
60+
}
5361
}

0 commit comments

Comments
 (0)