]> 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.0 Octopus source
[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 { SummaryService } from '../../../shared/services/summary.service';
16 import { NavigationModule } from '../navigation.module';
17 import { NavigationComponent } from './navigation.component';
18
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']))
23 );
24 return permissions;
25 }
26
27 function onlyPermitted(enabledPermissions: string[] = []): any {
28 const permissions: Permissions = new Permissions({});
29 enabledPermissions.forEach((key) => (permissions[key] = new Permission(['read'])));
30 return permissions;
31 }
32
33 function everythingEnabledExcept(features: Features[] = []): FeatureTogglesMap {
34 const featureTogglesMap: FeatureTogglesMap = new FeatureTogglesMap();
35 features.forEach((key) => (featureTogglesMap[key] = false));
36 return featureTogglesMap;
37 }
38
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))
43 );
44 return featureTogglesMap;
45 }
46
47 describe('NavigationComponent', () => {
48 let component: NavigationComponent;
49 let fixture: ComponentFixture<NavigationComponent>;
50
51 configureTestSuite(() => {
52 TestBed.configureTestingModule({
53 declarations: [NavigationComponent],
54 imports: [MockModule(NavigationModule)],
55 providers: [
56 {
57 provide: AuthStorageService,
58 useValue: {
59 getPermissions: jest.fn(),
60 isPwdDisplayed$: { subscribe: jest.fn() }
61 }
62 },
63 { provide: SummaryService, useValue: { subscribe: jest.fn() } },
64 { provide: FeatureTogglesService, useValue: { get: jest.fn() } }
65 ]
66 });
67 });
68
69 beforeEach(() => {
70 fixture = TestBed.createComponent(NavigationComponent);
71 component = fixture.componentInstance;
72 });
73
74 describe('Test Permissions', () => {
75 const testCases: [string[], string[]][] = [
76 [
77 ['hosts'],
78 [
79 '.tc_submenuitem_hosts',
80 '.tc_submenuitem_cluster_inventory',
81 '.tc_submenuitem_cluster_services'
82 ]
83 ],
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']],
96 [
97 ['rgw'],
98 [
99 '.tc_menuitem_rgw',
100 '.tc_submenuitem_rgw_daemons',
101 '.tc_submenuitem_rgw_buckets',
102 '.tc_submenuitem_rgw_users'
103 ]
104 ]
105 ];
106
107 for (const [disabledPermissions, selectors] of testCases) {
108 it(`When disabled permissions: ${JSON.stringify(
109 disabledPermissions
110 )} => hidden: "${selectors}"`, () => {
111 component.permissions = everythingPermittedExcept(disabledPermissions);
112 component.enabledFeature$ = of(everythingEnabledExcept());
113
114 fixture.detectChanges();
115 for (const selector of selectors) {
116 expect(fixture.debugElement.query(By.css(selector))).toBeFalsy();
117 }
118 });
119 }
120
121 for (const [enabledPermissions, selectors] of testCases) {
122 it(`When enabled permissions: ${JSON.stringify(
123 enabledPermissions
124 )} => visible: "${selectors}"`, () => {
125 component.permissions = onlyPermitted(enabledPermissions);
126 component.enabledFeature$ = of(everythingEnabledExcept());
127
128 fixture.detectChanges();
129 for (const selector of selectors) {
130 expect(fixture.debugElement.query(By.css(selector))).toBeTruthy();
131 }
132 });
133 }
134 });
135
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']],
144 [
145 ['rgw'],
146 [
147 '.tc_menuitem_rgw',
148 '.tc_submenuitem_rgw_daemons',
149 '.tc_submenuitem_rgw_buckets',
150 '.tc_submenuitem_rgw_users'
151 ]
152 ]
153 ];
154
155 for (const [disabledFeatures, selectors] of testCases) {
156 it(`When disabled features: ${JSON.stringify(
157 disabledFeatures
158 )} => hidden: "${selectors}"`, () => {
159 component.enabledFeature$ = of(everythingEnabledExcept(disabledFeatures));
160 component.permissions = everythingPermittedExcept();
161
162 fixture.detectChanges();
163 for (const selector of selectors) {
164 expect(fixture.debugElement.query(By.css(selector))).toBeFalsy();
165 }
166 });
167 }
168
169 for (const [enabledFeatures, selectors] of testCases) {
170 it(`When enabled features: ${JSON.stringify(
171 enabledFeatures
172 )} => visible: "${selectors}"`, () => {
173 component.enabledFeature$ = of(onlyEnabled(enabledFeatures));
174 component.permissions = everythingPermittedExcept();
175
176 fixture.detectChanges();
177 for (const selector of selectors) {
178 expect(fixture.debugElement.query(By.css(selector))).toBeTruthy();
179 }
180 });
181 }
182 });
183 });