1 import { ComponentFixture, TestBed } from '@angular/core/testing';
2 import { By } from '@angular/platform-browser';
4 import { configureTestSuite } from 'ng-bullet';
5 import { MockModule } from 'ng-mocks';
6 import { of } from 'rxjs';
8 import { Permission, Permissions } from '../../../shared/models/permissions';
9 import { AuthStorageService } from '../../../shared/services/auth-storage.service';
14 } from '../../../shared/services/feature-toggles.service';
15 import { SummaryService } from '../../../shared/services/summary.service';
16 import { NavigationModule } from '../navigation.module';
17 import { NavigationComponent } from './navigation.component';
19 function everythingPermittedExcept(disabledPermissions: string[] = []): any {
20 const permissions: Permissions = new Permissions({});
21 Object.keys(permissions).forEach(
22 (key) => (permissions[key] = new Permission(disabledPermissions.includes(key) ? [] : ['read']))
27 function onlyPermitted(enabledPermissions: string[] = []): any {
28 const permissions: Permissions = new Permissions({});
29 enabledPermissions.forEach((key) => (permissions[key] = new Permission(['read'])));
33 function everythingEnabledExcept(features: Features[] = []): FeatureTogglesMap {
34 const featureTogglesMap: FeatureTogglesMap = new FeatureTogglesMap();
35 features.forEach((key) => (featureTogglesMap[key] = false));
36 return featureTogglesMap;
39 function onlyEnabled(features: Features[] = []): FeatureTogglesMap {
40 const featureTogglesMap: FeatureTogglesMap = new FeatureTogglesMap();
41 Object.keys(featureTogglesMap).forEach(
42 (key) => (featureTogglesMap[key] = features.includes(<Features>key))
44 return featureTogglesMap;
47 describe('NavigationComponent', () => {
48 let component: NavigationComponent;
49 let fixture: ComponentFixture<NavigationComponent>;
51 configureTestSuite(() => {
52 TestBed.configureTestingModule({
53 declarations: [NavigationComponent],
54 imports: [MockModule(NavigationModule)],
57 provide: AuthStorageService,
59 getPermissions: jest.fn(),
60 isPwdDisplayed$: { subscribe: jest.fn() }
63 { provide: SummaryService, useValue: { subscribe: jest.fn() } },
64 { provide: FeatureTogglesService, useValue: { get: jest.fn() } }
70 fixture = TestBed.createComponent(NavigationComponent);
71 component = fixture.componentInstance;
74 describe('Test Permissions', () => {
75 const testCases: [string[], string[]][] = [
79 '.tc_submenuitem_hosts',
80 '.tc_submenuitem_cluster_inventory',
81 '.tc_submenuitem_cluster_services'
84 [['monitor'], ['.tc_submenuitem_cluster_monitor']],
85 [['osd'], ['.tc_submenuitem_osds', '.tc_submenuitem_crush']],
86 [['configOpt'], ['.tc_submenuitem_configuration', '.tc_submenuitem_modules']],
87 [['log'], ['.tc_submenuitem_log']],
88 [['prometheus'], ['.tc_submenuitem_monitoring']],
89 [['pool'], ['.tc_menuitem_pool']],
90 [['rbdImage'], ['.tc_submenuitem_block_images']],
91 [['rbdMirroring'], ['.tc_submenuitem_block_mirroring']],
92 [['iscsi'], ['.tc_submenuitem_block_iscsi']],
93 [['rbdImage', 'rbdMirroring', 'iscsi'], ['.tc_menuitem_block']],
94 [['nfs'], ['.tc_menuitem_nfs']],
95 [['cephfs'], ['.tc_menuitem_cephfs']],
100 '.tc_submenuitem_rgw_daemons',
101 '.tc_submenuitem_rgw_buckets',
102 '.tc_submenuitem_rgw_users'
107 for (const [disabledPermissions, selectors] of testCases) {
108 it(`When disabled permissions: ${JSON.stringify(
110 )} => hidden: "${selectors}"`, () => {
111 component.permissions = everythingPermittedExcept(disabledPermissions);
112 component.enabledFeature$ = of(everythingEnabledExcept());
114 fixture.detectChanges();
115 for (const selector of selectors) {
116 expect(fixture.debugElement.query(By.css(selector))).toBeFalsy();
121 for (const [enabledPermissions, selectors] of testCases) {
122 it(`When enabled permissions: ${JSON.stringify(
124 )} => visible: "${selectors}"`, () => {
125 component.permissions = onlyPermitted(enabledPermissions);
126 component.enabledFeature$ = of(everythingEnabledExcept());
128 fixture.detectChanges();
129 for (const selector of selectors) {
130 expect(fixture.debugElement.query(By.css(selector))).toBeTruthy();
136 describe('Test FeatureToggles', () => {
137 const testCases: [Features[], string[]][] = [
138 [['rbd'], ['.tc_submenuitem_block_images']],
139 [['mirroring'], ['.tc_submenuitem_block_mirroring']],
140 [['iscsi'], ['.tc_submenuitem_block_iscsi']],
141 [['rbd', 'mirroring', 'iscsi'], ['.tc_menuitem_block']],
142 [['nfs'], ['.tc_menuitem_nfs']],
143 [['cephfs'], ['.tc_menuitem_cephfs']],
148 '.tc_submenuitem_rgw_daemons',
149 '.tc_submenuitem_rgw_buckets',
150 '.tc_submenuitem_rgw_users'
155 for (const [disabledFeatures, selectors] of testCases) {
156 it(`When disabled features: ${JSON.stringify(
158 )} => hidden: "${selectors}"`, () => {
159 component.enabledFeature$ = of(everythingEnabledExcept(disabledFeatures));
160 component.permissions = everythingPermittedExcept();
162 fixture.detectChanges();
163 for (const selector of selectors) {
164 expect(fixture.debugElement.query(By.css(selector))).toBeFalsy();
169 for (const [enabledFeatures, selectors] of testCases) {
170 it(`When enabled features: ${JSON.stringify(
172 )} => visible: "${selectors}"`, () => {
173 component.enabledFeature$ = of(onlyEnabled(enabledFeatures));
174 component.permissions = everythingPermittedExcept();
176 fixture.detectChanges();
177 for (const selector of selectors) {
178 expect(fixture.debugElement.query(By.css(selector))).toBeTruthy();