package jnpf.dmsPermission; import jnpf.base.UserInfo; import jnpf.dmsEntity.permission.model.DmsSubjectSet; import jnpf.permission.OrganizeApi; import jnpf.permission.PositionApi; import jnpf.permission.RoleRelationApi; import jnpf.permission.entity.OrganizeEntity; import jnpf.permission.entity.PositionEntity; import jnpf.permission.entity.RoleRelationEntity; import jnpf.permission.model.rolerelaiton.RoleRelationModel; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashSet; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class DmsSubjectResolverTest { @Test void resolvesOrganizationAndPositionHierarchyInBatches() { OrganizeApi organizeApi = mock(OrganizeApi.class); PositionApi positionApi = mock(PositionApi.class); RoleRelationApi roleRelationApi = mock(RoleRelationApi.class); DmsSubjectResolver resolver = new DmsSubjectResolver( new DmsSubjectHierarchyResolver(organizeApi, positionApi), roleRelationApi); UserInfo user = new UserInfo(); user.setUserId("user-1"); user.setOrganizeIds(Arrays.asList(" org-child ", "org-second")); user.setPositionIds(Collections.singletonList(" position-child ")); user.setRoleIds(Arrays.asList("role-direct", "role-inherited")); user.setGroupIds(Collections.singletonList("platform-group-1")); when(organizeApi.getListByIds(Arrays.asList("org-child", "org-second"))).thenReturn(Arrays.asList( organization("org-child", "org-parent", "org-root,org-parent,org-child"), organization("org-second", "0", "org-second"))); when(positionApi.getListByIds(Collections.singletonList("position-child"))).thenReturn( Collections.singletonList(position("position-child", "position-parent", "position-root,position-parent,position-child", "org-child"))); when(roleRelationApi.getListByObjectId(org.mockito.ArgumentMatchers.any(RoleRelationModel.class))) .thenReturn(Arrays.asList( role("user-1", "user", "role-direct"), role("org-child", "organize", "role-1"))); DmsSubjectSet result = resolver.resolve(user); assertEquals(set("org-child", "org-second"), result.getDirectOrgIds()); assertEquals(set("org-parent"), result.getImmediateParentOrgIds()); assertEquals(set("org-root", "org-parent", "org-child", "org-second"), result.getAncestorOrgIds()); assertEquals(set("position-child"), result.getPositionIds()); assertEquals(set("position-parent"), result.getImmediateParentPositionIds()); assertEquals(set("position-root", "position-parent", "position-child"), result.getAncestorPositionIds()); assertEquals(set("role-direct", "role-inherited"), result.getRoleIds()); assertEquals(set("role-direct"), result.getDirectUserRoleIds()); assertEquals(set("platform-group-1"), result.getPlatformGroupIds()); verify(organizeApi, times(1)).getListByIds(Arrays.asList("org-child", "org-second")); verify(positionApi, times(1)).getListByIds(Collections.singletonList("position-child")); ArgumentCaptor roleRequest = ArgumentCaptor.forClass(RoleRelationModel.class); verify(roleRelationApi, times(1)).getListByObjectId(roleRequest.capture()); assertEquals(Collections.singletonList("user-1"), roleRequest.getValue().getObjectId()); assertEquals("user", roleRequest.getValue().getObjectType()); } @Test void preservesDirectSubjectsWhenHierarchyServicesFallBackToEmptyResults() { OrganizeApi organizeApi = mock(OrganizeApi.class); PositionApi positionApi = mock(PositionApi.class); RoleRelationApi roleRelationApi = mock(RoleRelationApi.class); DmsSubjectResolver resolver = new DmsSubjectResolver( new DmsSubjectHierarchyResolver(organizeApi, positionApi), roleRelationApi); UserInfo user = new UserInfo(); user.setUserId("user-1"); user.setOrganizeIds(Collections.singletonList("org-child")); user.setPositionIds(Collections.singletonList("position-child")); when(organizeApi.getListByIds(Collections.singletonList("org-child"))) .thenReturn(Collections.emptyList()); when(positionApi.getListByIds(Collections.singletonList("position-child"))) .thenReturn(Collections.emptyList()); DmsSubjectSet result = resolver.resolve(user); assertEquals(set("org-child"), result.getDirectOrgIds()); assertEquals(set("org-child"), result.getAncestorOrgIds()); assertEquals(set("position-child"), result.getPositionIds()); assertEquals(set("position-child"), result.getAncestorPositionIds()); assertEquals(Collections.emptySet(), result.getImmediateParentOrgIds()); assertEquals(Collections.emptySet(), result.getImmediateParentPositionIds()); assertEquals(Collections.emptySet(), result.getDirectUserRoleIds()); } private OrganizeEntity organization(String id, String parentId, String idTree) { OrganizeEntity result = new OrganizeEntity(); result.setId(id); result.setParentId(parentId); result.setOrganizeIdTree(idTree); return result; } private PositionEntity position(String id, String parentId, String idTree, String organizationId) { PositionEntity result = new PositionEntity(); result.setId(id); result.setParentId(parentId); result.setPositionIdTree(idTree); result.setOrganizeId(organizationId); return result; } private RoleRelationEntity role(String objectId, String objectType, String roleId) { RoleRelationEntity result = new RoleRelationEntity(); result.setObjectId(objectId); result.setObjectType(objectType); result.setRoleId(roleId); return result; } private LinkedHashSet set(String... values) { return new LinkedHashSet<>(Arrays.asList(values)); } }