From 3348f12f1271381147dcf562b480ea351fe3001d Mon Sep 17 00:00:00 2001 From: mmaquina Date: Wed, 31 Aug 2022 17:15:52 -0300 Subject: [PATCH 1/3] Switch disabled to prevent admin from auto-revoke --- .../users-list/users-list.component.html | 1 + .../components/users-list/users-list.component.ts | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/app/modules/users/components/users-list/users-list.component.html b/src/app/modules/users/components/users-list/users-list.component.html index ecc05e543..ff18560c2 100644 --- a/src/app/modules/users/components/users-list/users-list.component.html +++ b/src/app/modules/users/components/users-list/users-list.component.html @@ -20,6 +20,7 @@ admin diff --git a/src/app/modules/users/components/users-list/users-list.component.ts b/src/app/modules/users/components/users-list/users-list.component.ts index 6145e5d5a..91ce69548 100644 --- a/src/app/modules/users/components/users-list/users-list.component.ts +++ b/src/app/modules/users/components/users-list/users-list.component.ts @@ -9,6 +9,9 @@ import { EnvironmentType } from 'src/environments/enum'; import { User } from '../../models/users'; import { LoadUsers, UserActionTypes, AddUserToGroup, RemoveUserFromGroup } from '../../store/user.actions'; import { getIsLoading } from '../../store/user.selectors'; +import { UserInfoService } from 'src/app/modules/user/services/user-info.service'; +import { LoginService } from '../../../login/services/login.service'; +import { JwtHelperService } from '@auth0/angular-jwt'; @Component({ selector: 'app-users-list', @@ -28,13 +31,15 @@ export class UsersListComponent implements OnInit, OnDestroy, AfterViewInit { }; switchGroupsSubscription: Subscription; isDevelopmentOrProd = true; + helper: JwtHelperService; public get ROLES() { return ROLES; } - constructor(private store: Store, private actionsSubject$: ActionsSubject) { + constructor(private store: Store, private actionsSubject$: ActionsSubject, private userInfoService: UserInfoService, private loginService: LoginService) { this.isLoading$ = store.pipe(delay(0), select(getIsLoading)); + this.helper = new JwtHelperService(); } ngOnInit(): void { @@ -94,4 +99,11 @@ export class UsersListComponent implements OnInit, OnDestroy, AfterViewInit { ) ); } + + checkRoleCurrentUser(userEmail: string){ + const token = this.loginService.getLocalStorage('user'); + const user = this.helper.decodeToken(token); + return this.userInfoService.isAdmin() && (userEmail === user.email); + } + } From 1c5203ebb154a238e59d8b38d69873f2a2066a22 Mon Sep 17 00:00:00 2001 From: mmaquina Date: Mon, 5 Sep 2022 15:05:30 -0300 Subject: [PATCH 2/3] added imports used in .ts to .spec.ts --- .../users/components/users-list/users-list.component.spec.ts | 3 +++ .../users/components/users-list/users-list.component.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/modules/users/components/users-list/users-list.component.spec.ts b/src/app/modules/users/components/users-list/users-list.component.spec.ts index 025d5b1d9..7e4c7ba3b 100644 --- a/src/app/modules/users/components/users-list/users-list.component.spec.ts +++ b/src/app/modules/users/components/users-list/users-list.component.spec.ts @@ -7,6 +7,9 @@ import { ActionsSubject } from '@ngrx/store'; import { DataTablesModule } from 'angular-datatables'; import { GrantUserRole, RevokeUserRole } from '../../store/user.actions'; import { ROLES } from '../../../../../environments/environment'; +import { UserInfoService } from 'src/app/modules/user/services/user-info.service'; +import { LoginService } from '../../../login/services/login.service'; +import { JwtHelperService } from '@auth0/angular-jwt'; describe('UsersListComponent', () => { let component: UsersListComponent; diff --git a/src/app/modules/users/components/users-list/users-list.component.ts b/src/app/modules/users/components/users-list/users-list.component.ts index 91ce69548..b0ca7caab 100644 --- a/src/app/modules/users/components/users-list/users-list.component.ts +++ b/src/app/modules/users/components/users-list/users-list.component.ts @@ -99,7 +99,7 @@ export class UsersListComponent implements OnInit, OnDestroy, AfterViewInit { ) ); } - + checkRoleCurrentUser(userEmail: string){ const token = this.loginService.getLocalStorage('user'); const user = this.helper.decodeToken(token); From 263f91b8292b5ac09fb4e24d04d013b52911dc88 Mon Sep 17 00:00:00 2001 From: mmaquina Date: Tue, 6 Sep 2022 13:14:30 -0300 Subject: [PATCH 3/3] fixed tests --- .../users-list/users-list.component.spec.ts | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/app/modules/users/components/users-list/users-list.component.spec.ts b/src/app/modules/users/components/users-list/users-list.component.spec.ts index 7e4c7ba3b..cb4433b55 100644 --- a/src/app/modules/users/components/users-list/users-list.component.spec.ts +++ b/src/app/modules/users/components/users-list/users-list.component.spec.ts @@ -1,4 +1,5 @@ import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { MockStore, provideMockStore } from '@ngrx/store/testing'; import { NgxPaginationModule } from 'ngx-pagination'; import { UsersListComponent } from './users-list.component'; @@ -7,15 +8,22 @@ import { ActionsSubject } from '@ngrx/store'; import { DataTablesModule } from 'angular-datatables'; import { GrantUserRole, RevokeUserRole } from '../../store/user.actions'; import { ROLES } from '../../../../../environments/environment'; -import { UserInfoService } from 'src/app/modules/user/services/user-info.service'; import { LoginService } from '../../../login/services/login.service'; -import { JwtHelperService } from '@auth0/angular-jwt'; +import { of } from 'rxjs'; +import { UserInfoService } from 'src/app/modules/user/services/user-info.service'; + describe('UsersListComponent', () => { let component: UsersListComponent; let fixture: ComponentFixture; let store: MockStore; + let httpMock: HttpTestingController; const actionSub: ActionsSubject = new ActionsSubject(); + let loginService: LoginService; + let userInfoService: UserInfoService; + const userInfoServiceStub = { + isAdmin: () => of(false), + }; const state: UserState = { data: [ @@ -36,9 +44,11 @@ describe('UsersListComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [NgxPaginationModule, DataTablesModule], + imports: [NgxPaginationModule, DataTablesModule, HttpClientTestingModule], declarations: [UsersListComponent], - providers: [provideMockStore({ initialState: state }), { provide: ActionsSubject, useValue: actionSub }], + providers: [provideMockStore({ initialState: state }), + { provide: ActionsSubject, useValue: actionSub }, + { providers: LoginService, useValue: {}},], }).compileComponents(); }) ); @@ -47,6 +57,9 @@ describe('UsersListComponent', () => { fixture = TestBed.createComponent(UsersListComponent); component = fixture.componentInstance; store = TestBed.inject(MockStore); + httpMock = TestBed.inject(HttpTestingController); + loginService = TestBed.inject(LoginService); + userInfoService = TestBed.inject(UserInfoService); store.setState(state); fixture.detectChanges(); }); @@ -232,9 +245,19 @@ describe('UsersListComponent', () => { expect(component.ROLES).toEqual(ROLES); }); + it('Should call to localstorage and helper decode for get information about user when checkRoleCurrentUser method is called', () => { + const account = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiYyIsIm5hbWUiOiJhYmMiLCJlbWFpbCI6ImVtYWlsIiwiZ3JvdXBzIjpbImFkbWluIl19.gy1GljkoiuOjP8DzkoLRYE9SldBn5ljRc4kp8rwq7UI'; + spyOn(loginService, 'getLocalStorage').and.returnValue(account); + spyOn(userInfoService, 'isAdmin').and.returnValue(of(true)); + const response = component.checkRoleCurrentUser('email') + expect(response).toBeTrue(); + expect(userInfoService.isAdmin).toHaveBeenCalled(); + expect(loginService.getLocalStorage).toHaveBeenCalled(); + }); + afterEach(() => { component.dtTrigger.unsubscribe(); component.loadUsersSubscription.unsubscribe(); fixture.destroy(); }); -}); +}); \ No newline at end of file