@ieeesa-npm/tenants 0.4.3 → 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 (144) 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 -33
  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 -454
  75. package/esm2022/lib/assets/tenant-validations.mjs +0 -17
  76. package/esm2022/lib/components/create-modify-group-type/create-modify-group-type.component.mjs +0 -477
  77. package/esm2022/lib/components/create-modify-role/create-modify-role.component.mjs +0 -280
  78. package/esm2022/lib/components/create-tenant-application/create-tenant-application.component.mjs +0 -512
  79. package/esm2022/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.mjs +0 -391
  80. package/esm2022/lib/components/tenant-basic-details/tenant-basic-details.component.mjs +0 -95
  81. package/esm2022/lib/components/view-tenant-details/view-tenant-details.component.mjs +0 -732
  82. package/esm2022/lib/components/view-tenant-group-types/view-tenant-group-types.component.mjs +0 -194
  83. package/esm2022/lib/components/view-tenants-list/view-tenants-list.component.mjs +0 -334
  84. package/esm2022/lib/models/app-type-config.model.mjs +0 -2
  85. package/esm2022/lib/models/app-type.model.mjs +0 -7
  86. package/esm2022/lib/models/create-group-type-config.model.mjs +0 -22
  87. package/esm2022/lib/models/create-group-type.model.mjs +0 -2
  88. package/esm2022/lib/models/feature-permission-id.model.mjs +0 -8
  89. package/esm2022/lib/models/features.model.mjs +0 -2
  90. package/esm2022/lib/models/form-status.model.mjs +0 -7
  91. package/esm2022/lib/models/permission-type.model.mjs +0 -12
  92. package/esm2022/lib/models/role-menu-action.model.mjs +0 -7
  93. package/esm2022/lib/models/role-type.model.mjs +0 -2
  94. package/esm2022/lib/models/roles-and-permissions-table-type.model.mjs +0 -7
  95. package/esm2022/lib/models/roles-and-permissions.model.mjs +0 -2
  96. package/esm2022/lib/models/route-config.model.mjs +0 -2
  97. package/esm2022/lib/models/table-column-schema-view-tenant-list.model.mjs +0 -16
  98. package/esm2022/lib/models/tenant-function-type.model.mjs +0 -12
  99. package/esm2022/lib/models/tenant.model.mjs +0 -2
  100. package/esm2022/lib/models/tenants-permission.model.mjs +0 -2
  101. package/esm2022/lib/models/update-tenant-status.model.mjs +0 -2
  102. package/esm2022/lib/models/view-tenant-group-types.model.mjs +0 -11
  103. package/esm2022/lib/services/tenant-applications.service.mjs +0 -618
  104. package/esm2022/lib/services/tenant-permissions-map.service.mjs +0 -36
  105. package/esm2022/lib/services/tenant-permissions.service.mjs +0 -38
  106. package/esm2022/lib/tenant-applications.component.mjs +0 -14
  107. package/esm2022/lib/tenant-applications.module.mjs +0 -16
  108. package/esm2022/public-api.mjs +0 -37
  109. package/fesm2022/ieeesa-npm-tenants.mjs +0 -4241
  110. package/fesm2022/ieeesa-npm-tenants.mjs.map +0 -1
  111. package/index.d.ts +0 -5
  112. package/lib/assets/tenant-validations.d.ts +0 -15
  113. package/lib/components/create-modify-group-type/create-modify-group-type.component.d.ts +0 -129
  114. package/lib/components/create-modify-role/create-modify-role.component.d.ts +0 -103
  115. package/lib/components/create-tenant-application/create-tenant-application.component.d.ts +0 -128
  116. package/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.d.ts +0 -106
  117. package/lib/components/tenant-basic-details/tenant-basic-details.component.d.ts +0 -472
  118. package/lib/components/view-tenant-details/view-tenant-details.component.d.ts +0 -223
  119. package/lib/components/view-tenant-group-types/view-tenant-group-types.component.d.ts +0 -63
  120. package/lib/components/view-tenants-list/view-tenants-list.component.d.ts +0 -134
  121. package/lib/models/app-type-config.model.d.ts +0 -14
  122. package/lib/models/app-type.model.d.ts +0 -4
  123. package/lib/models/create-group-type-config.model.d.ts +0 -16
  124. package/lib/models/create-group-type.model.d.ts +0 -49
  125. package/lib/models/feature-permission-id.model.d.ts +0 -4
  126. package/lib/models/features.model.d.ts +0 -15
  127. package/lib/models/form-status.model.d.ts +0 -4
  128. package/lib/models/permission-type.model.d.ts +0 -8
  129. package/lib/models/role-menu-action.model.d.ts +0 -4
  130. package/lib/models/role-type.model.d.ts +0 -27
  131. package/lib/models/roles-and-permissions-table-type.model.d.ts +0 -4
  132. package/lib/models/roles-and-permissions.model.d.ts +0 -119
  133. package/lib/models/route-config.model.d.ts +0 -4
  134. package/lib/models/table-column-schema-view-tenant-list.model.d.ts +0 -20
  135. package/lib/models/tenant-function-type.model.d.ts +0 -9
  136. package/lib/models/tenant.model.d.ts +0 -51
  137. package/lib/models/tenants-permission.model.d.ts +0 -9
  138. package/lib/models/update-tenant-status.model.d.ts +0 -14
  139. package/lib/models/view-tenant-group-types.model.d.ts +0 -29
  140. package/lib/services/tenant-applications.service.d.ts +0 -398
  141. package/lib/services/tenant-permissions-map.service.d.ts +0 -13
  142. package/lib/services/tenant-permissions.service.d.ts +0 -22
  143. package/lib/tenant-applications.component.d.ts +0 -5
  144. 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
+ });