@ieeesa-npm/tenants 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/.eslintrc.json +31 -0
  2. package/ng-package.json +8 -0
  3. package/package.json +12 -25
  4. package/src/lib/assets/constants.json +454 -0
  5. package/src/lib/assets/tenant-validations.ts +18 -0
  6. package/src/lib/assets/tenants-mock.ts +1240 -0
  7. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.html +15 -0
  8. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.scss +44 -0
  9. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.spec.ts +574 -0
  10. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.ts +602 -0
  11. package/src/lib/components/create-modify-role/create-modify-role.component.html +15 -0
  12. package/src/lib/components/create-modify-role/create-modify-role.component.scss +83 -0
  13. package/src/lib/components/create-modify-role/create-modify-role.component.spec.ts +346 -0
  14. package/src/lib/components/create-modify-role/create-modify-role.component.ts +321 -0
  15. package/src/lib/components/create-tenant-application/create-tenant-application.component.html +18 -0
  16. package/src/lib/components/create-tenant-application/create-tenant-application.component.scss +73 -0
  17. package/src/lib/components/create-tenant-application/create-tenant-application.component.spec.ts +775 -0
  18. package/src/lib/components/create-tenant-application/create-tenant-application.component.ts +638 -0
  19. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.html +22 -0
  20. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.scss +79 -0
  21. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.spec.ts +716 -0
  22. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.ts +504 -0
  23. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.html +44 -0
  24. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.scss +16 -0
  25. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.spec.ts +115 -0
  26. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.ts +109 -0
  27. package/src/lib/components/view-tenant-details/view-tenant-details.component.html +195 -0
  28. package/src/lib/components/view-tenant-details/view-tenant-details.component.scss +163 -0
  29. package/src/lib/components/view-tenant-details/view-tenant-details.component.spec.ts +1221 -0
  30. package/src/lib/components/view-tenant-details/view-tenant-details.component.ts +876 -0
  31. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.html +10 -0
  32. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.scss +44 -0
  33. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.spec.ts +410 -0
  34. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.ts +219 -0
  35. package/src/lib/components/view-tenants-list/view-tenants-list.component.html +32 -0
  36. package/src/lib/components/view-tenants-list/view-tenants-list.component.scss +35 -0
  37. package/src/lib/components/view-tenants-list/view-tenants-list.component.spec.ts +464 -0
  38. package/src/lib/components/view-tenants-list/view-tenants-list.component.ts +388 -0
  39. package/src/lib/models/app-type-config.model.ts +14 -0
  40. package/src/lib/models/app-type.model.ts +5 -0
  41. package/src/lib/models/create-group-type-config.model.ts +18 -0
  42. package/src/lib/models/create-group-type.model.ts +46 -0
  43. package/src/lib/models/feature-permission-id.model.ts +6 -0
  44. package/src/lib/models/features.model.ts +15 -0
  45. package/src/lib/models/form-status.model.ts +5 -0
  46. package/src/lib/models/permission-type.model.ts +9 -0
  47. package/src/lib/models/role-menu-action.model.ts +5 -0
  48. package/src/lib/models/role-type.model.ts +34 -0
  49. package/src/lib/models/roles-and-permissions-table-type.model.ts +5 -0
  50. package/src/lib/models/roles-and-permissions.model.ts +113 -0
  51. package/src/lib/models/route-config.model.ts +4 -0
  52. package/src/lib/models/table-column-schema-view-tenant-list.model.ts +21 -0
  53. package/src/lib/models/tenant-function-type.model.ts +10 -0
  54. package/src/lib/models/tenant.model.ts +47 -0
  55. package/src/lib/models/tenants-permission.model.ts +9 -0
  56. package/src/lib/models/update-tenant-status.model.ts +12 -0
  57. package/src/lib/models/view-tenant-group-types.model.ts +34 -0
  58. package/src/lib/services/tenant-applications.service.spec.ts +1245 -0
  59. package/src/lib/services/tenant-applications.service.ts +798 -0
  60. package/src/lib/services/tenant-permissions-map.service.spec.ts +25 -0
  61. package/src/lib/services/tenant-permissions-map.service.ts +28 -0
  62. package/src/lib/services/tenant-permissions.service.spec.ts +62 -0
  63. package/src/lib/services/tenant-permissions.service.ts +49 -0
  64. package/src/lib/tenant-applications.component.html +0 -0
  65. package/src/lib/tenant-applications.component.scss +0 -0
  66. package/src/lib/tenant-applications.component.spec.ts +28 -0
  67. package/src/lib/tenant-applications.component.ts +12 -0
  68. package/src/lib/tenant-applications.module.ts +8 -0
  69. package/{public-api.d.ts → src/public-api.ts} +40 -30
  70. package/tsconfig.lib.json +14 -0
  71. package/tsconfig.lib.prod.json +10 -0
  72. package/tsconfig.spec.json +14 -0
  73. package/esm2022/ieeesa-npm-tenants.mjs +0 -5
  74. package/esm2022/lib/assets/constants.json +0 -390
  75. package/esm2022/lib/assets/tenant-validations.mjs +0 -13
  76. package/esm2022/lib/components/create-modify-role/create-modify-role.component.mjs +0 -280
  77. package/esm2022/lib/components/create-tenant-application/create-tenant-application.component.mjs +0 -512
  78. package/esm2022/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.mjs +0 -391
  79. package/esm2022/lib/components/tenant-basic-details/tenant-basic-details.component.mjs +0 -95
  80. package/esm2022/lib/components/view-tenant-details/view-tenant-details.component.mjs +0 -708
  81. package/esm2022/lib/components/view-tenant-group-types/view-tenant-group-types.component.mjs +0 -174
  82. package/esm2022/lib/components/view-tenants-list/view-tenants-list.component.mjs +0 -334
  83. package/esm2022/lib/models/app-type-config.model.mjs +0 -2
  84. package/esm2022/lib/models/app-type.model.mjs +0 -7
  85. package/esm2022/lib/models/feature-permission-id.model.mjs +0 -8
  86. package/esm2022/lib/models/features.model.mjs +0 -2
  87. package/esm2022/lib/models/form-status.model.mjs +0 -7
  88. package/esm2022/lib/models/permission-type.model.mjs +0 -12
  89. package/esm2022/lib/models/role-menu-action.model.mjs +0 -7
  90. package/esm2022/lib/models/role-type.model.mjs +0 -2
  91. package/esm2022/lib/models/roles-and-permissions-table-type.model.mjs +0 -7
  92. package/esm2022/lib/models/roles-and-permissions.model.mjs +0 -2
  93. package/esm2022/lib/models/route-config.model.mjs +0 -2
  94. package/esm2022/lib/models/table-column-schema-view-tenant-list.model.mjs +0 -16
  95. package/esm2022/lib/models/tenant-function-type.model.mjs +0 -10
  96. package/esm2022/lib/models/tenant.model.mjs +0 -2
  97. package/esm2022/lib/models/tenants-permission.model.mjs +0 -2
  98. package/esm2022/lib/models/update-tenant-status.model.mjs +0 -2
  99. package/esm2022/lib/models/view-tenant-group-types.model.mjs +0 -9
  100. package/esm2022/lib/services/tenant-applications.service.mjs +0 -542
  101. package/esm2022/lib/services/tenant-permissions-map.service.mjs +0 -36
  102. package/esm2022/lib/services/tenant-permissions.service.mjs +0 -38
  103. package/esm2022/lib/tenant-applications.component.mjs +0 -14
  104. package/esm2022/lib/tenant-applications.module.mjs +0 -16
  105. package/esm2022/public-api.mjs +0 -34
  106. package/fesm2022/ieeesa-npm-tenants.mjs +0 -3565
  107. package/fesm2022/ieeesa-npm-tenants.mjs.map +0 -1
  108. package/index.d.ts +0 -5
  109. package/lib/assets/tenant-validations.d.ts +0 -11
  110. package/lib/components/create-modify-role/create-modify-role.component.d.ts +0 -103
  111. package/lib/components/create-tenant-application/create-tenant-application.component.d.ts +0 -128
  112. package/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.d.ts +0 -106
  113. package/lib/components/tenant-basic-details/tenant-basic-details.component.d.ts +0 -408
  114. package/lib/components/view-tenant-details/view-tenant-details.component.d.ts +0 -216
  115. package/lib/components/view-tenant-group-types/view-tenant-group-types.component.d.ts +0 -58
  116. package/lib/components/view-tenants-list/view-tenants-list.component.d.ts +0 -134
  117. package/lib/models/app-type-config.model.d.ts +0 -14
  118. package/lib/models/app-type.model.d.ts +0 -4
  119. package/lib/models/feature-permission-id.model.d.ts +0 -4
  120. package/lib/models/features.model.d.ts +0 -15
  121. package/lib/models/form-status.model.d.ts +0 -4
  122. package/lib/models/permission-type.model.d.ts +0 -8
  123. package/lib/models/role-menu-action.model.d.ts +0 -4
  124. package/lib/models/role-type.model.d.ts +0 -27
  125. package/lib/models/roles-and-permissions-table-type.model.d.ts +0 -4
  126. package/lib/models/roles-and-permissions.model.d.ts +0 -119
  127. package/lib/models/route-config.model.d.ts +0 -4
  128. package/lib/models/table-column-schema-view-tenant-list.model.d.ts +0 -20
  129. package/lib/models/tenant-function-type.model.d.ts +0 -7
  130. package/lib/models/tenant.model.d.ts +0 -51
  131. package/lib/models/tenants-permission.model.d.ts +0 -9
  132. package/lib/models/update-tenant-status.model.d.ts +0 -14
  133. package/lib/models/view-tenant-group-types.model.d.ts +0 -27
  134. package/lib/services/tenant-applications.service.d.ts +0 -357
  135. package/lib/services/tenant-permissions-map.service.d.ts +0 -13
  136. package/lib/services/tenant-permissions.service.d.ts +0 -22
  137. package/lib/tenant-applications.component.d.ts +0 -5
  138. package/lib/tenant-applications.module.d.ts +0 -6
@@ -0,0 +1,716 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { RolesAndPermissionsMappingComponent } from './roles-and-permissions-mapping.component';
3
+ import { HttpClientTestingModule } from '@angular/common/http/testing';
4
+ import { MatDialogModule } from '@angular/material/dialog';
5
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
6
+ import { FormBuilder } from '@angular/forms';
7
+ import {
8
+ FormControlType,
9
+ FormModel,
10
+ SelectOption,
11
+ SlideToggleOption,
12
+ } from '@ieeesa-npm/presentation';
13
+ import { TenantApplicationsService } from '../../services/tenant-applications.service';
14
+ import { TenantsMocks } from '../../assets/tenants-mock';
15
+ import { Observable } from 'rxjs';
16
+ import {
17
+ Permission,
18
+ RoleDetails,
19
+ RoleOrPermissionMapping,
20
+ } from '../../models/roles-and-permissions.model';
21
+ import { RoleAndPermissionsTableType } from '../../models/roles-and-permissions-table-type.model';
22
+ import { HttpErrorResponse } from '@angular/common/http';
23
+ import { AlertType, AlertsService } from '@ieeesa-npm/utility';
24
+ import { SharedService } from '@shared/services/shared.service';
25
+
26
+ describe('MapPermissionsRolesComponent', () => {
27
+ let component: RolesAndPermissionsMappingComponent;
28
+ let fixture: ComponentFixture<RolesAndPermissionsMappingComponent>;
29
+ let sharedService: SharedService;
30
+ let tenantAppService: TenantApplicationsService;
31
+ const formBuilder: FormBuilder = new FormBuilder();
32
+ const mockFormGroup = formBuilder.group({
33
+ role: [
34
+ { id: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8', name: 'Admin' },
35
+ ],
36
+ permission: [
37
+ {
38
+ id: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
39
+ name: 'View Groups',
40
+ },
41
+ ],
42
+ });
43
+ const mockFormModel: FormModel = {
44
+ formGroup: [
45
+ {
46
+ legend: '',
47
+ controls: [
48
+ {
49
+ type: FormControlType.SELECT,
50
+ controlName: 'role',
51
+ },
52
+ {
53
+ type: FormControlType.SELECT,
54
+ controlName: 'permission',
55
+ },
56
+ ],
57
+ },
58
+ ],
59
+ };
60
+ beforeEach(() => {
61
+ TestBed.configureTestingModule({
62
+ imports: [
63
+ RolesAndPermissionsMappingComponent,
64
+ HttpClientTestingModule,
65
+ MatDialogModule,
66
+ BrowserAnimationsModule,
67
+ ],
68
+ providers: [TenantApplicationsService, SharedService, AlertsService],
69
+ });
70
+ fixture = TestBed.createComponent(RolesAndPermissionsMappingComponent);
71
+ component = fixture.componentInstance;
72
+ sharedService = TestBed.inject(SharedService);
73
+ tenantAppService = TestBed.inject(TenantApplicationsService);
74
+ fixture.detectChanges();
75
+ });
76
+
77
+ it('should create', () => {
78
+ expect(component).toBeTruthy();
79
+ });
80
+ describe('#ngOnInit', () => {
81
+ it('should load all the page defaults', () => {
82
+ tenantAppService.setSelectedTenantInformation(
83
+ TenantsMocks?.tenantInfoMock
84
+ );
85
+ component.formGroup = mockFormModel;
86
+ component.ngOnInit();
87
+ expect(component.formGroup?.formGroup).toBeDefined();
88
+ expect(component.formGroup?.formGroup?.[0]?.controls?.length).toBe(2);
89
+ expect(component.appId).toBe(TenantsMocks?.tenantInfoMock?.appId);
90
+ });
91
+ it('should set focus to modal once all the alerts are closed', () => {
92
+ const isAlertClosedSpy = spyOn(sharedService.isAlertClosed, 'next')
93
+ .and.callThrough()
94
+ .and.returnValue(sharedService.isAlertClosed?.next(true));
95
+ const mockSelectElement = document.createElement('select');
96
+ component.elementRef.nativeElement = mockSelectElement;
97
+ const focusSpy = spyOn(component.elementRef.nativeElement, 'focus');
98
+ component.ngOnInit();
99
+ fixture.detectChanges();
100
+ sharedService.isAlertClosed?.asObservable().subscribe((response) => {
101
+ expect(response).toBe(true);
102
+ expect(focusSpy).toHaveBeenCalled();
103
+ });
104
+ expect(isAlertClosedSpy).toHaveBeenCalledWith(true);
105
+ });
106
+ });
107
+ describe('#onRoleOrPermissionSelected', () => {
108
+ it('should load permissions table based on the role selection.', () => {
109
+ const roleOrPermissionMapping: RoleOrPermissionMapping = {
110
+ roleOrPermissionName: 'View Groups',
111
+ roleOrPermissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
112
+ status: false,
113
+ };
114
+ mockFormGroup?.get('permission')?.setValue(null);
115
+ mockFormGroup?.get('role')?.setValue({
116
+ id: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
117
+ name: 'Admin',
118
+ });
119
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.callThrough();
120
+ component.onRoleOrPermissionSelected([mockFormGroup]);
121
+ component.tableColumnSchema[0].cellData(roleOrPermissionMapping);
122
+ expect(component.selectedRole).toEqual(TenantsMocks?.mockRoleInfo);
123
+ expect(component.tableHeading).toBe('Role: <strong>Admin</strong>');
124
+ expect(component.selectedPermission).toBeUndefined();
125
+ expect(component.tableColumnSchema?.[0]?.heading).toBe('Permission');
126
+ expect(tenantAppService.getRolePermissionMapping).toHaveBeenCalled();
127
+ });
128
+ it('should load roles table based on the permission selection.', () => {
129
+ const roleOrPermissionMapping: RoleOrPermissionMapping = {
130
+ roleOrPermissionName: 'View Groups',
131
+ roleOrPermissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
132
+ status: false,
133
+ };
134
+ mockFormGroup?.get('role')?.setValue(null);
135
+ mockFormGroup?.get('permission')?.setValue({
136
+ id: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
137
+ name: 'View Groups',
138
+ });
139
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.callThrough();
140
+ component.onRoleOrPermissionSelected([mockFormGroup]);
141
+ component.tableColumnSchema[0].cellData(roleOrPermissionMapping);
142
+ component.tableColumnSchema[1].cellData(roleOrPermissionMapping);
143
+ expect(component.selectedPermission).toEqual(
144
+ TenantsMocks?.permissionsSuccessResponse?.body[0]
145
+ );
146
+ expect(component.tableHeading).toBe(
147
+ 'Permission: <strong>View Groups</strong>'
148
+ );
149
+ expect(component.selectedRole).toBeUndefined();
150
+ expect(component.tableColumnSchema?.[0]?.heading).toBe('Role');
151
+ expect(tenantAppService.getRolePermissionMapping).toHaveBeenCalled();
152
+ });
153
+ it('should load permission table based on the role and permission selection.', () => {
154
+ mockFormGroup?.get('permission')?.setValue({
155
+ id: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
156
+ name: 'View Groups',
157
+ });
158
+ mockFormGroup?.get('role')?.setValue({
159
+ id: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
160
+ name: 'Admin',
161
+ });
162
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.callThrough();
163
+ component.onRoleOrPermissionSelected([mockFormGroup]);
164
+ fixture.detectChanges();
165
+ expect(component?.selectedRole).toEqual(TenantsMocks?.mockRoleInfo);
166
+ expect(component?.selectedPermission).toEqual(
167
+ TenantsMocks?.permissionsSuccessResponse?.body[0]
168
+ );
169
+ expect(component?.tableHeading).toBe(
170
+ 'Role: <strong>Admin</strong></br>Permission: <strong>View Groups</strong>'
171
+ );
172
+ expect(component?.tableColumnSchema?.[0]?.heading).toBe('Permission');
173
+ expect(tenantAppService.getRolePermissionMapping).toHaveBeenCalled();
174
+ });
175
+ });
176
+ describe('#getRoles', () => {
177
+ it('should call getRoles to load the roles dropdown options.', () => {
178
+ spyOn(tenantAppService, 'getRoles').and.returnValue(
179
+ new Observable((subscriber) => {
180
+ subscriber.next(TenantsMocks.mockUserRoles);
181
+ })
182
+ );
183
+ spyOn(
184
+ component['formUtilityService'],
185
+ 'updateFormControlOptions'
186
+ ).and.callThrough();
187
+ component.getRoles();
188
+ const mappedRoleOptions: SelectOption[] = [];
189
+ TenantsMocks.mockUserRoles?.body?.map((role) => {
190
+ mappedRoleOptions.push({
191
+ id: role.roleId,
192
+ name: role.roleName,
193
+ });
194
+ });
195
+ expect(component.roles).toEqual(mappedRoleOptions);
196
+ expect(
197
+ component['formUtilityService'].updateFormControlOptions
198
+ ).toHaveBeenCalledWith(
199
+ 'role',
200
+ 'dropdownOptions',
201
+ component.roles,
202
+ component.dynamicFormComponent
203
+ );
204
+ });
205
+ it('should return 3007 error code when fail to load the roles dropdown options.', () => {
206
+ const errorResponse = TenantsMocks.mockRolesErrorResponse;
207
+ spyOn(tenantAppService, 'getRoles').and.returnValue(
208
+ new Observable((subscriber) => {
209
+ subscriber.error(errorResponse);
210
+ })
211
+ );
212
+ spyOn(
213
+ component['formUtilityService'],
214
+ 'updateFormControlOptions'
215
+ ).and.callThrough();
216
+ spyOn(component['sharedService'], 'handleErrors').and.callThrough();
217
+ component.getRoles();
218
+ expect(component.roles).toEqual([]);
219
+ expect(
220
+ component['formUtilityService'].updateFormControlOptions
221
+ ).not.toHaveBeenCalled();
222
+ expect(component['sharedService'].handleErrors).toHaveBeenCalledWith(
223
+ errorResponse,
224
+ component?.mapRolesAndPermissionsScreenTexts?.errors
225
+ );
226
+ });
227
+ });
228
+ describe('#getPermissions', () => {
229
+ it('should call getPermissions to load the permission dropdown options.', () => {
230
+ spyOn(tenantAppService, 'getPermissions').and.returnValue(
231
+ new Observable((subscriber) => {
232
+ subscriber.next(TenantsMocks.permissionsSuccessResponse);
233
+ })
234
+ );
235
+ spyOn(
236
+ component['formUtilityService'],
237
+ 'updateFormControlOptions'
238
+ ).and.callThrough();
239
+ component.getPermissions();
240
+ const mappedPermissionOptions: SelectOption[] = [];
241
+ TenantsMocks.permissionsSuccessResponse?.body?.map((permission) => {
242
+ mappedPermissionOptions.push({
243
+ id: permission.permissionId,
244
+ name: permission.permissionName,
245
+ });
246
+ });
247
+ expect(component.permissions).toEqual(mappedPermissionOptions);
248
+ expect(
249
+ component['formUtilityService'].updateFormControlOptions
250
+ ).toHaveBeenCalledWith(
251
+ 'permission',
252
+ 'dropdownOptions',
253
+ component.permissions,
254
+ component.dynamicFormComponent
255
+ );
256
+ });
257
+ it('should return 3008 when fail to load the permission dropdown options.', () => {
258
+ const errorResponse =
259
+ TenantsMocks.permissionsFailureResponse;
260
+ spyOn(tenantAppService, 'getPermissions').and.returnValue(
261
+ new Observable((subscriber) => {
262
+ subscriber.error(errorResponse);
263
+ })
264
+ );
265
+ spyOn(
266
+ component['formUtilityService'],
267
+ 'updateFormControlOptions'
268
+ ).and.callThrough();
269
+ spyOn(component['sharedService'], 'handleErrors').and.callThrough();
270
+ component.getPermissions();
271
+ expect(component.permissions).toEqual([]);
272
+ expect(
273
+ component['formUtilityService'].updateFormControlOptions
274
+ ).not.toHaveBeenCalled();
275
+ expect(component['sharedService'].handleErrors).toHaveBeenCalledWith(
276
+ errorResponse,
277
+ component?.mapRolesAndPermissionsScreenTexts?.errors
278
+ );
279
+ });
280
+ });
281
+ describe('#getRolePermissionMapping', () => {
282
+ it('should retrieve the mapped permissions based on the role selection.', () => {
283
+ const permissionsResponse =
284
+ TenantsMocks.getPermissionsByRoleIdSuccessResponse;
285
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.returnValue(
286
+ new Observable((subscriber) => {
287
+ subscriber.next(permissionsResponse);
288
+ })
289
+ );
290
+ const payload = {
291
+ payload: {
292
+ appId: 'NESC',
293
+ permissionId: null,
294
+ roleId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
295
+ },
296
+ };
297
+ const mappedPermissionOptions: SelectOption[] = [];
298
+ permissionsResponse?.body?.map((permission) => {
299
+ mappedPermissionOptions.push({
300
+ id: permission.permissionId,
301
+ name: permission.permissionName,
302
+ });
303
+ });
304
+ component.permissions = mappedPermissionOptions;
305
+ spyOn(component, 'setTableData').and.callThrough();
306
+ component.getRolePermissionMapping(payload);
307
+ expect(component.setTableData).toHaveBeenCalledWith(
308
+ component.permissions,
309
+ permissionsResponse?.body as Permission[],
310
+ RoleAndPermissionsTableType.PERMISSION
311
+ );
312
+ });
313
+ it('should retrieve the mapped roles based on the permission selection.', () => {
314
+ const rolesResponse = TenantsMocks.getRolesByPermissionIdSuccessResponse;
315
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.returnValue(
316
+ new Observable((subscriber) => {
317
+ subscriber.next(rolesResponse);
318
+ })
319
+ );
320
+ const payload = {
321
+ payload: {
322
+ appId: 'NESC',
323
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
324
+ roleId: null,
325
+ },
326
+ };
327
+ const mappedRoleOptions: SelectOption[] = [];
328
+ rolesResponse?.body?.map((role) => {
329
+ mappedRoleOptions.push({
330
+ id: role.roleId,
331
+ name: role.roleName,
332
+ });
333
+ });
334
+ component.roles = mappedRoleOptions;
335
+ spyOn(component, 'setTableData').and.callThrough();
336
+ component.getRolePermissionMapping(payload);
337
+ expect(component.setTableData).toHaveBeenCalledWith(
338
+ component.roles,
339
+ rolesResponse?.body as RoleDetails[],
340
+ RoleAndPermissionsTableType.ROLE
341
+ );
342
+ });
343
+ it('should retrieve the mapped permissions based on the role and permission selection.', () => {
344
+ const permissionsResponse =
345
+ TenantsMocks.getPermissionsByRoleIdAndPermissionIdSuccessResponse;
346
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.returnValue(
347
+ new Observable((subscriber) => {
348
+ subscriber.next(permissionsResponse);
349
+ })
350
+ );
351
+ const payload = {
352
+ payload: {
353
+ appId: 'NESC',
354
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
355
+ roleId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
356
+ },
357
+ };
358
+ component.selectedPermission = {
359
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
360
+ permissionName: 'View Groups',
361
+ };
362
+ component.getRolePermissionMapping(payload);
363
+ expect(component?.tableData?.length).toBe(1);
364
+ expect(component?.tableData?.[0]?.roleOrPermissionId).toBe(
365
+ payload?.payload?.permissionId
366
+ );
367
+ expect(component?.tableData?.[0]?.status).toBeTruthy();
368
+ });
369
+ it('should return 3021 error code if there are no mapped permissions loaded for the role selection.', () => {
370
+ const errorCode3021Response =
371
+ TenantsMocks.getPermissionsByRoleIdFailureResponse;
372
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.returnValue(
373
+ new Observable((subscriber) => {
374
+ subscriber.error(errorCode3021Response);
375
+ })
376
+ );
377
+ const payload = {
378
+ payload: {
379
+ appId: 'NESC',
380
+ permissionId: null,
381
+ roleId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
382
+ },
383
+ };
384
+ spyOn(component, 'setTableData').and.callThrough();
385
+ component.getRolePermissionMapping(payload);
386
+ expect(component.setTableData).toHaveBeenCalledWith(
387
+ component.permissions,
388
+ [],
389
+ RoleAndPermissionsTableType.PERMISSION
390
+ );
391
+ });
392
+ it('should return 3020 error code if there are no mapped roles loaded for the permission selection.', () => {
393
+ const errorCode3020Response =
394
+ TenantsMocks.getRolesByPermissionIdFailureResponse;
395
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.returnValue(
396
+ new Observable((subscriber) => {
397
+ subscriber.error(errorCode3020Response);
398
+ })
399
+ );
400
+ const payload = {
401
+ payload: {
402
+ appId: 'NESC',
403
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
404
+ roleId: null,
405
+ },
406
+ };
407
+ spyOn(component, 'setTableData').and.callThrough();
408
+ component.getRolePermissionMapping(payload);
409
+ expect(component.setTableData).toHaveBeenCalledWith(
410
+ component.roles,
411
+ [],
412
+ RoleAndPermissionsTableType.ROLE
413
+ );
414
+ });
415
+ it('should return 3017 error code if role permission mapping does not exist for the role id.', () => {
416
+ const errorCode3017Response =
417
+ TenantsMocks.getPermissionsByRoleIdAndPermissionIdFailureResponse;
418
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.returnValue(
419
+ new Observable((subscriber) => {
420
+ subscriber.error(errorCode3017Response);
421
+ })
422
+ );
423
+ const payload = {
424
+ payload: {
425
+ appId: 'NESC',
426
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
427
+ roleId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
428
+ },
429
+ };
430
+ component.selectedPermission = {
431
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
432
+ permissionName: 'View Groups',
433
+ };
434
+ component.getRolePermissionMapping(payload);
435
+ fixture.detectChanges();
436
+ expect(component.tableData?.length).toBe(1);
437
+ expect(component.tableData?.[0]?.roleOrPermissionId).toBe(
438
+ payload.payload.permissionId
439
+ );
440
+ expect(component.tableData?.[0]?.status).toBeFalsy();
441
+ });
442
+ it('should return server error.', () => {
443
+ const errorResponse = new HttpErrorResponse({
444
+ error: {
445
+ status: false,
446
+ message: 'server error',
447
+ body: {
448
+ errorCodes: [],
449
+ },
450
+ },
451
+ status: 404,
452
+ });
453
+ spyOn(tenantAppService, 'getRolePermissionMapping').and.returnValue(
454
+ new Observable((subscriber) => {
455
+ subscriber.error(errorResponse);
456
+ })
457
+ );
458
+ const payload = {
459
+ payload: {
460
+ appId: 'NESC',
461
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
462
+ roleId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
463
+ },
464
+ };
465
+ spyOn(component['sharedService'], 'handleErrors').and.callThrough();
466
+ component.getRolePermissionMapping(payload);
467
+ expect(component['sharedService'].handleErrors).toHaveBeenCalled();
468
+ });
469
+ });
470
+ describe('#setTableData', () => {
471
+ it('should load the permissions table with the mapped permissions.', () => {
472
+ const permissionOptions: SelectOption[] = [];
473
+ TenantsMocks.permissionsSuccessResponse?.body?.map((permission) => {
474
+ permissionOptions.push({
475
+ id: permission.permissionId,
476
+ name: permission.permissionName,
477
+ });
478
+ });
479
+ const mappedPermissions: Permission[] = [
480
+ {
481
+ permissionName: 'View Groups',
482
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
483
+ },
484
+ ];
485
+ component.setTableData(
486
+ permissionOptions,
487
+ mappedPermissions as Permission[],
488
+ RoleAndPermissionsTableType.PERMISSION
489
+ );
490
+ expect(component.tableData?.[0]?.status).toBeTruthy();
491
+ });
492
+ it('should load the roles table with the mapped roles.', () => {
493
+ const roleOptions: SelectOption[] = [];
494
+ TenantsMocks.mockUserRoles?.body?.map((role) => {
495
+ roleOptions.push({
496
+ id: role.roleId,
497
+ name: role.roleName,
498
+ });
499
+ });
500
+ const mappedRoles: RoleDetails[] = [
501
+ {
502
+ roleName: 'Admin',
503
+ roleId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
504
+ },
505
+ ];
506
+ component.setTableData(
507
+ roleOptions,
508
+ mappedRoles as RoleDetails[],
509
+ RoleAndPermissionsTableType.ROLE
510
+ );
511
+ expect(component.tableData?.[0]?.status).toBeTruthy();
512
+ });
513
+ });
514
+ describe('#roleOrPermissionStatusChange', () => {
515
+ it('should select the respective permission and added to payload.', () => {
516
+ const slideToggleOption: SlideToggleOption = {
517
+ id: 1,
518
+ label: '',
519
+ checked: true,
520
+ };
521
+ const roleOrPermissionMapping: RoleOrPermissionMapping = {
522
+ roleOrPermissionName: 'View Groups',
523
+ roleOrPermissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
524
+ status: false,
525
+ };
526
+ component.selectedRole = {
527
+ roleId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
528
+ roleName: 'Admin',
529
+ };
530
+ component.roleOrPermissionStatusChange({
531
+ slideToggle: slideToggleOption,
532
+ rowData: roleOrPermissionMapping,
533
+ });
534
+ expect(component.modifiedRolesAndPermissionsMapping?.[0]?.roleId).toBe(
535
+ component.selectedRole?.roleId
536
+ );
537
+ expect(
538
+ component.modifiedRolesAndPermissionsMapping?.[0]?.permissionId
539
+ ).toBe(roleOrPermissionMapping?.roleOrPermissionId);
540
+ expect(
541
+ component.modifiedRolesAndPermissionsMapping?.[0]?.status
542
+ ).toBeTruthy();
543
+ expect(
544
+ component.dynamicFormComponent?.isSubmitButtonDisabled
545
+ ).toBeFalsy();
546
+ });
547
+ it('should de-select the already added permission and removed from payload.', () => {
548
+ const slideToggleOption: SlideToggleOption = {
549
+ id: 1,
550
+ label: '',
551
+ checked: false,
552
+ };
553
+ const roleOrPermissionMapping: RoleOrPermissionMapping = {
554
+ roleOrPermissionName: 'View Groups',
555
+ roleOrPermissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
556
+ status: true,
557
+ };
558
+ component.selectedRole = {
559
+ roleId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
560
+ roleName: 'Admin',
561
+ };
562
+ component.modifiedRolesAndPermissionsMapping?.push({
563
+ appId: 'NESC',
564
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
565
+ roleId: component?.selectedRole?.roleId,
566
+ status: true,
567
+ });
568
+ component.roleOrPermissionStatusChange({
569
+ slideToggle: slideToggleOption,
570
+ rowData: roleOrPermissionMapping,
571
+ });
572
+ expect(component.modifiedRolesAndPermissionsMapping).toEqual([]);
573
+ expect(
574
+ component.dynamicFormComponent?.isSubmitButtonDisabled
575
+ ).toBeTruthy();
576
+ });
577
+ it('should select the respective role and added to payload.', () => {
578
+ const slideToggleOption: SlideToggleOption = {
579
+ id: 1,
580
+ label: '',
581
+ checked: true,
582
+ };
583
+ const roleOrPermissionMapping: RoleOrPermissionMapping = {
584
+ roleOrPermissionName: 'Admin',
585
+ roleOrPermissionId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
586
+ status: false,
587
+ };
588
+ component.selectedPermission = {
589
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
590
+ permissionName: 'View Groups',
591
+ };
592
+ component.roleOrPermissionStatusChange({
593
+ slideToggle: slideToggleOption,
594
+ rowData: roleOrPermissionMapping,
595
+ });
596
+ expect(component.modifiedRolesAndPermissionsMapping?.[0]?.roleId).toBe(
597
+ roleOrPermissionMapping?.roleOrPermissionId
598
+ );
599
+ expect(
600
+ component.modifiedRolesAndPermissionsMapping?.[0]?.permissionId
601
+ ).toBe(component?.selectedPermission?.permissionId);
602
+ expect(
603
+ component.modifiedRolesAndPermissionsMapping?.[0]?.status
604
+ ).toBeTruthy();
605
+ expect(
606
+ component.dynamicFormComponent?.isSubmitButtonDisabled
607
+ ).toBeFalsy();
608
+ });
609
+ it('should de-select the already added role and removed from the payload.', () => {
610
+ const slideToggleOption: SlideToggleOption = {
611
+ id: 1,
612
+ label: '',
613
+ checked: false,
614
+ };
615
+ const roleOrPermissionMapping: RoleOrPermissionMapping = {
616
+ roleOrPermissionName: 'Admin',
617
+ roleOrPermissionId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
618
+ status: true,
619
+ };
620
+ component.selectedPermission = {
621
+ permissionId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
622
+ permissionName: 'View Groups',
623
+ };
624
+ component.modifiedRolesAndPermissionsMapping?.push({
625
+ appId: 'NESC',
626
+ permissionId: component?.selectedPermission?.permissionId,
627
+ roleId: roleOrPermissionMapping?.roleOrPermissionId,
628
+ status: true,
629
+ });
630
+ component.roleOrPermissionStatusChange({
631
+ slideToggle: slideToggleOption,
632
+ rowData: roleOrPermissionMapping,
633
+ });
634
+ expect(component.modifiedRolesAndPermissionsMapping).toEqual([]);
635
+ expect(
636
+ component.dynamicFormComponent?.isSubmitButtonDisabled
637
+ ).toBeTruthy();
638
+ });
639
+ });
640
+ describe('#onMapAndPermissionsFormSubmit', () => {
641
+ it('should save the mapped roles and permissions data.', () => {
642
+ component.modifiedRolesAndPermissionsMapping = [
643
+ {
644
+ appId: 'NESC',
645
+ permissionId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
646
+ roleId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
647
+ status: true,
648
+ },
649
+ ];
650
+ const saveRolePermissionMappingSuccessResponse =
651
+ TenantsMocks.saveRolePermissionMappingSuccessResponse;
652
+ const saveRolePermissionMappingSpy = spyOn(
653
+ tenantAppService,
654
+ 'saveRolePermissionMapping'
655
+ ).and.returnValue(
656
+ new Observable((subscriber) => {
657
+ subscriber.next(saveRolePermissionMappingSuccessResponse);
658
+ })
659
+ );
660
+ spyOn(component['sharedService'], 'showAlertMessage');
661
+ component.onMapAndPermissionsFormSubmit();
662
+ expect(saveRolePermissionMappingSpy).toHaveBeenCalled();
663
+ expect(component['sharedService'].showAlertMessage).toHaveBeenCalledWith(
664
+ AlertType.SUCCESS,
665
+ component?.mapRolesAndPermissionsScreenTexts?.message?.success
666
+ ?.rolesAndPermissionsSubmission
667
+ );
668
+ });
669
+ it('should return 3009 error code while saving mapped roles and permissions data.', () => {
670
+ component.modifiedRolesAndPermissionsMapping = [
671
+ {
672
+ appId: 'NESC',
673
+ permissionId: 'ROLE_NESC_edaf1dcc-229f-4d4c-9635-7ac732b4dfd8',
674
+ roleId: 'PERM_NESC_c05ff592-7178-4614-b730-7a7a8828824e',
675
+ status: true,
676
+ },
677
+ ];
678
+ const saveRolePermissionMappingFailureResponse =
679
+ TenantsMocks.saveRolePermissionMappingFailureResponse;
680
+ const saveRolePermissionMappingSpy = spyOn(
681
+ tenantAppService,
682
+ 'saveRolePermissionMapping'
683
+ ).and.returnValue(
684
+ new Observable((subscriber) => {
685
+ subscriber.error(saveRolePermissionMappingFailureResponse);
686
+ })
687
+ );
688
+ spyOn(component['sharedService'], 'handleErrors');
689
+ component.onMapAndPermissionsFormSubmit();
690
+ expect(saveRolePermissionMappingSpy).toHaveBeenCalled();
691
+ expect(component['sharedService'].handleErrors).toHaveBeenCalledWith(
692
+ saveRolePermissionMappingFailureResponse,
693
+ component?.mapRolesAndPermissionsScreenTexts?.errors
694
+ );
695
+ });
696
+ });
697
+ describe('#onMapAndPermissionsFormCancel', () => {
698
+ it('should emit formCancel event', () => {
699
+ const formCancelEmitSpy = spyOn(
700
+ component.formCancel,
701
+ 'emit'
702
+ ).and.callThrough();
703
+ component.onMapAndPermissionsFormCancel();
704
+ expect(formCancelEmitSpy).toHaveBeenCalled();
705
+ });
706
+ });
707
+ describe('#ngOnDestroy', () => {
708
+ it('should unsubscribe on ngOnDestroy', () => {
709
+ spyOn(component.destroy$, 'next');
710
+ spyOn(component.destroy$, 'unsubscribe');
711
+ component.ngOnDestroy();
712
+ expect(component.destroy$.next).toHaveBeenCalledWith(true);
713
+ expect(component.destroy$.unsubscribe).toHaveBeenCalled();
714
+ });
715
+ });
716
+ });