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<RoleRelationModel> 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<String> set(String... values) {
|
return new LinkedHashSet<>(Arrays.asList(values));
|
}
|
}
|