From c43234cf5beb7672573bbd9f13a522afe8206f22 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Wed, 2 Oct 2024 12:09:38 +0200 Subject: [PATCH] OZG-6731 OZG 6763 UserService Tests --- .../src/lib/user/user.repository.service.ts | 24 +++++---- .../src/lib/user/user.repository.spec.ts | 54 +++++++++++++------ 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/alfa-client/libs/admin/settings/src/lib/user/user.repository.service.ts b/alfa-client/libs/admin/settings/src/lib/user/user.repository.service.ts index 0c14ace06e..e6c95427e7 100644 --- a/alfa-client/libs/admin/settings/src/lib/user/user.repository.service.ts +++ b/alfa-client/libs/admin/settings/src/lib/user/user.repository.service.ts @@ -3,8 +3,10 @@ import KcAdminClient, { NetworkError } from '@keycloak/keycloak-admin-client'; import { TokenProvider } from '@keycloak/keycloak-admin-client/lib/client'; import GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation'; import MappingsRepresentation from '@keycloak/keycloak-admin-client/lib/defs/mappingsRepresentation'; +import RoleRepresentation from '@keycloak/keycloak-admin-client/lib/defs/roleRepresentation'; import UserRepresentation from '@keycloak/keycloak-admin-client/lib/defs/userRepresentation'; import { OAuthService } from 'angular-oauth2-oidc'; +import { isNil } from 'lodash-es'; import { Observable, OperatorFunction, @@ -111,11 +113,8 @@ export class UserRepository { } private addInformationToUser(user: UserRepresentation) { - return forkJoin({ - groups: this.getUserGroups(user), - roles: this.getAlfaClientRoles(user), - }).pipe( - map(({ groups, roles }) => ({ + return forkJoin([this.getUserGroups(user), this.getAlfaClientRoles(user)]).pipe( + map(([groups, roles]) => ({ ...user, groups, roles, @@ -131,16 +130,19 @@ export class UserRepository { private getAlfaClientRoles(user: UserRepresentation): Observable<string[]> { return from(this.kcAdminClient.users.listRoleMappings({ id: user.id })).pipe( - map((clientMappings) => this.mapToAlfaClientRoleNames(clientMappings)), + map((clientMappings: MappingsRepresentation) => + this.mapToAlfaClientRoleNames(clientMappings), + ), ); } private mapToAlfaClientRoleNames(roleMappings: MappingsRepresentation): string[] { - const clientMappings = - roleMappings.clientMappings ? roleMappings.clientMappings['alfa'] : undefined; - if (clientMappings && clientMappings.mappings) { - return clientMappings.mappings.map((role: any) => role.name); + if (isNil(roleMappings?.clientMappings?.['alfa'])) { + return []; } - return []; + + return roleMappings.clientMappings['alfa'].mappings.map( + (role: RoleRepresentation) => role.name, + ); } } diff --git a/alfa-client/libs/admin/settings/src/lib/user/user.repository.spec.ts b/alfa-client/libs/admin/settings/src/lib/user/user.repository.spec.ts index 23d0951d8b..d24b2af59e 100644 --- a/alfa-client/libs/admin/settings/src/lib/user/user.repository.spec.ts +++ b/alfa-client/libs/admin/settings/src/lib/user/user.repository.spec.ts @@ -4,6 +4,7 @@ import { faker } from '@faker-js/faker'; import KcAdminClient, { NetworkError } from '@keycloak/keycloak-admin-client'; import { TokenProvider } from '@keycloak/keycloak-admin-client/lib/client'; import GroupRepresentation from '@keycloak/keycloak-admin-client/lib/defs/groupRepresentation'; +import MappingsRepresentation from '@keycloak/keycloak-admin-client/lib/defs/mappingsRepresentation'; import UserRepresentation from '@keycloak/keycloak-admin-client/lib/defs/userRepresentation'; import { Groups } from '@keycloak/keycloak-admin-client/lib/resources/groups'; import { OAuthService } from 'angular-oauth2-oidc'; @@ -37,9 +38,6 @@ describe('UserRepository', () => { }; }; - const userRep: UserRepresentation = { id: '1234' }; - const groupRep: GroupRepresentation = { name: 'groupName' }; - beforeEach(() => { kcAdminClient = mock(KcAdminClient); oAuthService = mock(OAuthService); @@ -336,35 +334,59 @@ describe('UserRepository', () => { }); describe('getUsers', () => { - let findMock: jest.Mock; - let listGroupsMock: jest.Mock; + const userRep: UserRepresentation = { id: faker.random.word(), firstName: faker.random.word() }; + const userRepArray: UserRepresentation[] = [userRep, userRep, userRep]; + const group = faker.random.word(); + const role = faker.random.word(); + const groupRep: GroupRepresentation[] = [{ name: group }]; + const roleRep: MappingsRepresentation = { + clientMappings: { alfa: { mappings: [{ name: role }] } }, + }; beforeEach(() => { - findMock = jest.fn().mockReturnValue(Promise.resolve([userRep])); - listGroupsMock = jest.fn().mockReturnValue(Promise.resolve([groupRep])); - + jest.clearAllMocks(); kcAdminClient.users = <any>{ - find: findMock, - listGroups: listGroupsMock, + find: jest.fn().mockReturnValue(Promise.resolve(userRepArray)), + listGroups: jest.fn().mockReturnValue(Promise.resolve(groupRep)), + listRoleMappings: jest.fn().mockReturnValue(Promise.resolve(roleRep)), }; }); it('should call kcAdminClient users find', () => { repository.getUsers(); - expect(findMock).toHaveBeenCalled(); + expect(kcAdminClient.users['find']).toHaveBeenCalled(); }); - it('should call kcAdminClient users listGroups', fakeAsync(() => { + it('should call kcadminClient listGroups for every user', fakeAsync(() => { repository.getUsers().subscribe(); tick(); - expect(listGroupsMock).toHaveBeenCalledWith({ id: userRep.id }); + expect(kcAdminClient.users['listGroups']).toBeCalledTimes(userRepArray.length); })); - it('should return users with groups', (done) => { - repository.getUsers().subscribe((result) => { - expect(result).toEqual([{ ...userRep, groupReps: [groupRep] }]); + it('should call kcadminClient listRoleMappings for every user', fakeAsync(() => { + repository.getUsers().subscribe(); + tick(); + + expect(kcAdminClient.users['listRoleMappings']).toBeCalledTimes(userRepArray.length); + })); + + it('should return users with groups and roles', (done) => { + repository.getUsers().subscribe((users: UserRepresentation[]) => { + users.forEach((user) => + expect(user).toEqual({ ...userRep, groups: [group], roles: [role] }), + ); + done(); + }); + }); + + it('should return users with empty groups and roles if they have none', (done) => { + kcAdminClient.users['listGroups'] = jest.fn().mockReturnValue(Promise.resolve([])); + kcAdminClient.users['listRoleMappings'] = jest.fn().mockReturnValue(Promise.resolve({})); + + repository.getUsers().subscribe((users: UserRepresentation[]) => { + users.forEach((user) => expect(user).toEqual({ ...userRep, groups: [], roles: [] })); done(); }); }); -- GitLab