]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/frontend/src/app/core/navigation/navigation/navigation.component.spec.ts
import 15.2.4
[ceph.git] / ceph / src / pybind / mgr / dashboard / frontend / src / app / core / navigation / navigation / navigation.component.spec.ts
1 import { ComponentFixture, TestBed } from '@angular/core/testing';
2 import { By } from '@angular/platform-browser';
3
4 import { configureTestSuite } from 'ng-bullet';
5 import { MockModule } from 'ng-mocks';
6 import { of } from 'rxjs';
7
8 import { Permission, Permissions } from '../../../shared/models/permissions';
9 import { AuthStorageService } from '../../../shared/services/auth-storage.service';
10 import {
11 Features,
12 FeatureTogglesMap,
13 FeatureTogglesService
14 } from '../../../shared/services/feature-toggles.service';
15 import { PrometheusAlertService } from '../../../shared/services/prometheus-alert.service';
16 import { SummaryService } from '../../../shared/services/summary.service';
17 import { NavigationModule } from '../navigation.module';
18 import { NavigationComponent } from './navigation.component';
19
20 function everythingPermittedExcept(disabledPermissions: string[] = []): any {
21 const permissions: Permissions = new Permissions({});
22 Object.keys(permissions).forEach(
23 (key) => (permissions[key] = new Permission(disabledPermissions.includes(key) ? [] : ['read']))
24 );
25 return permissions;
26 }
27
28 function onlyPermitted(enabledPermissions: string[] = []): any {
29 const permissions: Permissions = new Permissions({});
30 enabledPermissions.forEach((key) => (permissions[key] = new Permission(['read'])));
31 return permissions;
32 }
33
34 function everythingEnabledExcept(features: Features[] = []): FeatureTogglesMap {
35 const featureTogglesMap: FeatureTogglesMap = new FeatureTogglesMap();
36 features.forEach((key) => (featureTogglesMap[key] = false));
37 return featureTogglesMap;
38 }
39
40 function onlyEnabled(features: Features[] = []): FeatureTogglesMap {
41 const featureTogglesMap: FeatureTogglesMap = new FeatureTogglesMap();
42 Object.keys(featureTogglesMap).forEach(
43 (key) => (featureTogglesMap[key] = features.includes(<Features>key))
44 );
45 return featureTogglesMap;
46 }
47
48 describe('NavigationComponent', () => {
49 let component: NavigationComponent;
50 let fixture: ComponentFixture<NavigationComponent>;
51
52 configureTestSuite(() => {
53 TestBed.configureTestingModule({
54 declarations: [NavigationComponent],
55 imports: [MockModule(NavigationModule)],
56 providers: [
57 {
58 provide: AuthStorageService,
59 useValue: {
60 getPermissions: jest.fn(),
61 isPwdDisplayed$: { subscribe: jest.fn() }
62 }
63 },
64 { provide: SummaryService, useValue: { subscribe: jest.fn() } },
65 { provide: FeatureTogglesService, useValue: { get: jest.fn() } },
66 { provide: PrometheusAlertService, useValue: { alerts: [] } }
67 ]
68 });
69 });
70
71 beforeEach(() => {
72 fixture = TestBed.createComponent(NavigationComponent);
73 component = fixture.componentInstance;
74 });
75
76 describe('Test Permissions', () => {
77 const testCases: [string[], string[]][] = [
78 [
79 ['hosts'],
80 [
81 '.tc_submenuitem_hosts',
82 '.tc_submenuitem_cluster_inventory',
83 '.tc_submenuitem_cluster_services'
84 ]
85 ],
86 [['monitor'], ['.tc_submenuitem_cluster_monitor']],
87 [['osd'], ['.tc_submenuitem_osds', '.tc_submenuitem_crush']],
88 [['configOpt'], ['.tc_submenuitem_configuration', '.tc_submenuitem_modules']],
89 [['log'], ['.tc_submenuitem_log']],
90 [['prometheus'], ['.tc_submenuitem_monitoring']],
91 [['pool'], ['.tc_menuitem_pool']],
92 [['rbdImage'], ['.tc_submenuitem_block_images']],
93 [['rbdMirroring'], ['.tc_submenuitem_block_mirroring']],
94 [['iscsi'], ['.tc_submenuitem_block_iscsi']],
95 [['rbdImage', 'rbdMirroring', 'iscsi'], ['.tc_menuitem_block']],
96 [['nfs'], ['.tc_menuitem_nfs']],
97 [['cephfs'], ['.tc_menuitem_cephfs']],
98 [
99 ['rgw'],
100 [
101 '.tc_menuitem_rgw',
102 '.tc_submenuitem_rgw_daemons',
103 '.tc_submenuitem_rgw_buckets',
104 '.tc_submenuitem_rgw_users'
105 ]
106 ]
107 ];
108
109 for (const [disabledPermissions, selectors] of testCases) {
110 it(`When disabled permissions: ${JSON.stringify(
111 disabledPermissions
112 )} => hidden: "${selectors}"`, () => {
113 component.permissions = everythingPermittedExcept(disabledPermissions);
114 component.enabledFeature$ = of(everythingEnabledExcept());
115
116 fixture.detectChanges();
117 for (const selector of selectors) {
118 expect(fixture.debugElement.query(By.css(selector))).toBeFalsy();
119 }
120 });
121 }
122
123 for (const [enabledPermissions, selectors] of testCases) {
124 it(`When enabled permissions: ${JSON.stringify(
125 enabledPermissions
126 )} => visible: "${selectors}"`, () => {
127 component.permissions = onlyPermitted(enabledPermissions);
128 component.enabledFeature$ = of(everythingEnabledExcept());
129
130 fixture.detectChanges();
131 for (const selector of selectors) {
132 expect(fixture.debugElement.query(By.css(selector))).toBeTruthy();
133 }
134 });
135 }
136 });
137
138 describe('Test FeatureToggles', () => {
139 const testCases: [Features[], string[]][] = [
140 [['rbd'], ['.tc_submenuitem_block_images']],
141 [['mirroring'], ['.tc_submenuitem_block_mirroring']],
142 [['iscsi'], ['.tc_submenuitem_block_iscsi']],
143 [['rbd', 'mirroring', 'iscsi'], ['.tc_menuitem_block']],
144 [['nfs'], ['.tc_menuitem_nfs']],
145 [['cephfs'], ['.tc_menuitem_cephfs']],
146 [
147 ['rgw'],
148 [
149 '.tc_menuitem_rgw',
150 '.tc_submenuitem_rgw_daemons',
151 '.tc_submenuitem_rgw_buckets',
152 '.tc_submenuitem_rgw_users'
153 ]
154 ]
155 ];
156
157 for (const [disabledFeatures, selectors] of testCases) {
158 it(`When disabled features: ${JSON.stringify(
159 disabledFeatures
160 )} => hidden: "${selectors}"`, () => {
161 component.enabledFeature$ = of(everythingEnabledExcept(disabledFeatures));
162 component.permissions = everythingPermittedExcept();
163
164 fixture.detectChanges();
165 for (const selector of selectors) {
166 expect(fixture.debugElement.query(By.css(selector))).toBeFalsy();
167 }
168 });
169 }
170
171 for (const [enabledFeatures, selectors] of testCases) {
172 it(`When enabled features: ${JSON.stringify(
173 enabledFeatures
174 )} => visible: "${selectors}"`, () => {
175 component.enabledFeature$ = of(onlyEnabled(enabledFeatures));
176 component.permissions = everythingPermittedExcept();
177
178 fixture.detectChanges();
179 for (const selector of selectors) {
180 expect(fixture.debugElement.query(By.css(selector))).toBeTruthy();
181 }
182 });
183 }
184 });
185 });