You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by kd...@apache.org on 2018/09/22 02:11:01 UTC

[02/51] [partial] nifi-registry git commit: NIFIREG-201 Refactoring project structure to better isolate extensions

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6f26290d/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.spec.js
----------------------------------------------------------------------
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.spec.js
new file mode 100644
index 0000000..624447a
--- /dev/null
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.spec.js
@@ -0,0 +1,2517 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the 'License'); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var NfRegistryRoutes = require('nifi-registry/nf-registry.routes.js');
+var ngCoreTesting = require('@angular/core/testing');
+var ngCommon = require('@angular/common');
+var ngRouter = require('@angular/router');
+var NfRegistry = require('nifi-registry/nf-registry.js');
+var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
+var NfRegistryService = require('nifi-registry/services/nf-registry.service.js');
+var NfPageNotFoundComponent = require('nifi-registry/components/page-not-found/nf-registry-page-not-found.js');
+var NfRegistryExplorer = require('nifi-registry/components/explorer/nf-registry-explorer.js');
+var NfRegistryAdministration = require('nifi-registry/components/administration/nf-registry-administration.js');
+var NfRegistryUsersAdministration = require('nifi-registry/components/administration/users/nf-registry-users-administration.js');
+var NfRegistryAddUser = require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js');
+var NfRegistryCreateNewGroup = require('nifi-registry/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js');
+var NfRegistryEditBucketPolicy = require('nifi-registry/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js');
+var NfRegistryAddPolicyToBucket = require('nifi-registry/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js');
+var NfRegistryAddUserToGroups = require('nifi-registry/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js');
+var NfRegistryAddUsersToGroup = require('nifi-registry/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.js');
+var NfRegistryManageUser = require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js');
+var NfRegistryManageGroup = require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js');
+var NfRegistryManageBucket = require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js');
+var NfRegistryWorkflowAdministration = require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js');
+var NfRegistryCreateBucket = require('nifi-registry/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js');
+var NfRegistryGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js');
+var NfRegistryBucketGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js');
+var NfRegistryDropletGridListViewer = require('nifi-registry/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js');
+var fdsCore = require('@flow-design-system/core');
+var ngMoment = require('angular2-moment');
+var rxjs = require('rxjs/Rx');
+var ngCommonHttp = require('@angular/common/http');
+var NfRegistryTokenInterceptor = require('nifi-registry/services/nf-registry.token.interceptor.js');
+var NfStorage = require('nifi-registry/services/nf-storage.service.js');
+var NfLoginComponent = require('nifi-registry/components/login/nf-registry-login.js');
+var NfUserLoginComponent = require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
+
+describe('NfRegistryManageGroup Component', function () {
+    var comp;
+    var fixture;
+    var nfRegistryService;
+    var nfRegistryApi;
+
+    beforeEach(function () {
+        ngCoreTesting.TestBed.configureTestingModule({
+            imports: [
+                ngMoment.MomentModule,
+                ngCommonHttp.HttpClientModule,
+                fdsCore,
+                NfRegistryRoutes
+            ],
+            declarations: [
+                NfRegistry,
+                NfRegistryExplorer,
+                NfRegistryAdministration,
+                NfRegistryUsersAdministration,
+                NfRegistryManageUser,
+                NfRegistryManageGroup,
+                NfRegistryManageBucket,
+                NfRegistryWorkflowAdministration,
+                NfRegistryAddUser,
+                NfRegistryCreateBucket,
+                NfRegistryCreateNewGroup,
+                NfRegistryAddUserToGroups,
+                NfRegistryAddUsersToGroup,
+                NfRegistryAddPolicyToBucket,
+                NfRegistryEditBucketPolicy,
+                NfRegistryGridListViewer,
+                NfRegistryBucketGridListViewer,
+                NfRegistryDropletGridListViewer,
+                NfPageNotFoundComponent,
+                NfLoginComponent,
+                NfUserLoginComponent
+            ],
+            entryComponents: [
+                NfRegistryAddUser,
+                NfRegistryCreateBucket,
+                NfRegistryCreateNewGroup,
+                NfRegistryAddUserToGroups,
+                NfRegistryAddUsersToGroup,
+                NfRegistryAddPolicyToBucket,
+                NfRegistryEditBucketPolicy,
+                NfUserLoginComponent
+            ],
+            providers: [
+                NfRegistryService,
+                NfRegistryApi,
+                NfStorage,
+                {
+                    provide: ngCommonHttp.HTTP_INTERCEPTORS,
+                    useClass: NfRegistryTokenInterceptor,
+                    multi: true
+                },
+                {
+                    provide: ngCommon.APP_BASE_HREF,
+                    useValue: '/'
+                },
+                {
+                    provide: ngRouter.ActivatedRoute,
+                    useValue: {
+                        params: rxjs.Observable.of({groupId: '123'})
+                    }
+                }
+            ]
+        });
+        fixture = ngCoreTesting.TestBed.createComponent(NfRegistryManageGroup);
+
+        // test instance
+        comp = fixture.componentInstance;
+
+        // from the root injector
+        nfRegistryService = ngCoreTesting.TestBed.get(NfRegistryService);
+        nfRegistryApi = ngCoreTesting.TestBed.get(NfRegistryApi);
+
+        // because the NfRegistryManageGroup component is a nested route component we need to set up the nfRegistryService service manually
+        nfRegistryService.sidenav = {
+            open: function () {
+            },
+            close: function () {
+            }
+        };
+        nfRegistryService.group = {
+            identifier: 999,
+            identity: 'Group #1',
+            users: [{
+                identifier: '123',
+                identity: 'Group #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }],
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            }
+        };
+        nfRegistryService.groups = [nfRegistryService.group];
+
+        //Spy
+        spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({}));
+    });
+
+    it('should have a defined component', ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        expect(comp).toBeDefined();
+        expect(nfRegistryService.group.identifier).toEqual('123');
+
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first()
+        expect(getUserGroupCall.args[0]).toBe('123');
+    }));
+
+    it('should FAIL to get user by id and redirect to admin users perspective', ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404
+        }));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var routerCall = comp.router.navigateByUrl.calls.first();
+        expect(routerCall.args[0]).toBe('/nifi-registry/administration/users');
+        expect(comp.router.navigateByUrl.calls.count()).toBe(1);
+    }));
+
+    it('should FAIL to get user by id and redirect to workflow perspective', ngCoreTesting.fakeAsync(function () {
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 409
+        }));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var routerCall = comp.router.navigateByUrl.calls.first();
+        expect(routerCall.args[0]).toBe('/nifi-registry/administration/workflow');
+        expect(comp.router.navigateByUrl.calls.count()).toBe(1);
+    }));
+
+    it('should redirect to users perspective', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        // the function to test
+        comp.closeSideNav();
+
+        //assertions
+        var routerCall = comp.router.navigateByUrl.calls.first();
+        expect(routerCall.args[0]).toBe('/nifi-registry/administration/users');
+        expect(comp.router.navigateByUrl.calls.count()).toBe(1);
+    }));
+
+    it('should toggle to create the manage bucket privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404,
+            userGroups: []
+        }));
+        spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManageBucketsPrivileges({
+            checked: true
+        }, 'read');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.postPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to update the manage bucket privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: []
+        }));
+        spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManageBucketsPrivileges({
+            checked: true
+        }, 'read');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.putPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to remove the manage bucket privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 400,
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManageBucketsPrivileges({
+            checked: false
+        }, 'read');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.putPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to create the manage proxy privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404,
+            userGroups: []
+        }));
+        spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManageProxyPrivileges({
+            checked: true
+        }, 'write');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.postPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to update the manage proxy privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: []
+        }));
+        spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManageProxyPrivileges({
+            checked: true
+        }, 'write');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.putPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to remove the manage proxy privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 400,
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManageProxyPrivileges({
+            checked: false
+        }, 'write');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.putPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to create the manage policies privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404,
+            userGroups: []
+        }));
+        spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManagePoliciesPrivileges({
+            checked: true
+        }, 'read');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.postPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to update the manage policies privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: []
+        }));
+        spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManagePoliciesPrivileges({
+            checked: true
+        }, 'read');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.putPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to remove the manage policies privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 400,
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManagePoliciesPrivileges({
+            checked: false
+        }, 'read');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.putPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to create the manage tenants privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 404,
+            userGroups: []
+        }));
+        spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManageTenantsPrivileges({
+            checked: true
+        }, 'read');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.postPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to update the manage tenants privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: []
+        }));
+        spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManageTenantsPrivileges({
+            checked: true
+        }, 'read');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.putPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should toggle to remove the manage tenants privileges for the current group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            status: 400,
+            userGroups: [
+                {
+                    identifier: '123',
+                    identity: 'Group #1',
+                    resourcePermissions: {
+                        anyTopLevelResource: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        buckets: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        tenants: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        policies: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        },
+                        proxy: {
+                            canRead: false,
+                            canWrite: false,
+                            canDelete: false
+                        }
+                    }
+                }
+            ]
+        }));
+        spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({}));
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.toggleGroupManageTenantsPrivileges({
+            checked: false
+        }, 'read');
+
+        //assertions
+        expect(nfRegistryApi.getPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.putPolicyActionResource.calls.count()).toBe(1);
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+    }));
+
+    it('should open a modal dialog UX enabling the addition of the current user to a group(s)', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp, 'filterUsers').and.callFake(function () {
+        });
+        spyOn(comp.dialog, 'open').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of({});
+                }
+            }
+        });
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.addUsersToGroup();
+
+        //assertions
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+        expect(comp.filterUsers).toHaveBeenCalled();
+    }));
+
+    it('should sort `users` by `column`', ngCoreTesting.fakeAsync(function () {
+        spyOn(comp, 'filterUsers').and.callFake(function () {
+        });
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the async calls
+        fixture.detectChanges();
+
+        // object to be updated by the test
+        var column = {name: 'name', label: 'Display Name', sortable: true};
+
+        // The function to test
+        comp.sortUsers(column);
+
+        //assertions
+        expect(column.active).toBe(true);
+        var filterUsersCall = comp.filterUsers.calls.first();
+        expect(filterUsersCall.args[0]).toBeUndefined();
+        expect(filterUsersCall.args[1]).toBeUndefined();
+    }));
+
+    it('should remove user from group', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp, 'filterUsers').and.callFake(function () {
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+        spyOn(nfRegistryApi, 'updateUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({}));
+        spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
+        });
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        var user = {
+            identifier: '123'
+        };
+
+        // the function to test
+        comp.removeUserFromGroup(user);
+
+        //assertions
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(2);
+        expect(nfRegistryApi.updateUserGroup.calls.count()).toBe(1);
+        expect(comp.snackBarService.openCoaster.calls.count()).toBe(1);
+        expect(comp.filterUsers).toHaveBeenCalled();
+    }));
+
+    it('should update group name', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of(true);
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                }
+            },
+            users: [{
+                identifier: '123',
+                identity: 'User #1',
+                resourcePermissions: {
+                    anyTopLevelResource: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    buckets: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    tenants: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    policies: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    },
+                    proxy: {
+                        canRead: false,
+                        canWrite: false,
+                        canDelete: false
+                    }
+                }
+            }]
+        }));
+        spyOn(nfRegistryApi, 'updateUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'test',
+            status: 200
+        }));
+
+        // 1st change detection triggers ngOnInit
+        fixture.detectChanges();
+        // wait for async calls
+        ngCoreTesting.tick();
+        // 2nd change detection completes after the getUserGroup calls
+        fixture.detectChanges();
+
+        //assertions
+        var getUserGroupCall = nfRegistryApi.getUserGroup.calls.first();
+        expect(getUserGroupCall.args[0]).toBe('123');
+        expect(nfRegistryApi.getUserGroup.calls.count()).toBe(1);
+
+        // the function to test
+        comp.updateGroupName('test');
+
+        //assertions
+        expect(comp.snackBarService.openCoaster.calls.count()).toBe(1);
+        expect(comp.nfRegistryService.group.identity).toBe('test');
+    }));
+
+    it('should fail to update group name (409)', ngCoreTesting.fakeAsync(function () {
+        // Spy
+        spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
+            return {
+                afterClosed: function () {
+                    return rxjs.Observable.of(true);
+                }
+            }
+        });
+        spyOn(comp.snackBarService, 'openCoaster');
+        spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
+        }).and.returnValue(rxjs.Observable.of({
+            identifier: '123',
+            identity: 'Group #1',
+            resourcePermissions: {
+                anyTopLevelResource: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                buckets: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                tenants: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                policies: {
+                    canRead: false,
+                    canWrite: false,
+                    canDelete: false
+                },
+                proxy: {
+             

<TRUNCATED>