]>
Commit | Line | Data |
---|---|---|
11fdf7f2 | 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; |
9f95a23c | 2 | import { By } from '@angular/platform-browser'; |
11fdf7f2 | 3 | |
9f95a23c TL |
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'; | |
92f5a8d4 | 9 | import { AuthStorageService } from '../../../shared/services/auth-storage.service'; |
9f95a23c TL |
10 | import { |
11 | Features, | |
12 | FeatureTogglesMap, | |
13 | FeatureTogglesService | |
14 | } from '../../../shared/services/feature-toggles.service'; | |
e306af50 | 15 | import { PrometheusAlertService } from '../../../shared/services/prometheus-alert.service'; |
9f95a23c TL |
16 | import { SummaryService } from '../../../shared/services/summary.service'; |
17 | import { NavigationModule } from '../navigation.module'; | |
11fdf7f2 TL |
18 | import { NavigationComponent } from './navigation.component'; |
19 | ||
9f95a23c TL |
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 | ||
11fdf7f2 TL |
48 | describe('NavigationComponent', () => { |
49 | let component: NavigationComponent; | |
50 | let fixture: ComponentFixture<NavigationComponent>; | |
51 | ||
9f95a23c TL |
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() } }, | |
e306af50 TL |
65 | { provide: FeatureTogglesService, useValue: { get: jest.fn() } }, |
66 | { provide: PrometheusAlertService, useValue: { alerts: [] } } | |
9f95a23c TL |
67 | ] |
68 | }); | |
11fdf7f2 TL |
69 | }); |
70 | ||
71 | beforeEach(() => { | |
72 | fixture = TestBed.createComponent(NavigationComponent); | |
73 | component = fixture.componentInstance; | |
11fdf7f2 TL |
74 | }); |
75 | ||
9f95a23c TL |
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 | } | |
92f5a8d4 TL |
136 | }); |
137 | ||
9f95a23c TL |
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(); | |
92f5a8d4 | 177 | |
9f95a23c TL |
178 | fixture.detectChanges(); |
179 | for (const selector of selectors) { | |
180 | expect(fixture.debugElement.query(By.css(selector))).toBeTruthy(); | |
181 | } | |
182 | }); | |
183 | } | |
11fdf7f2 TL |
184 | }); |
185 | }); |