刘光辉
6 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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));
    }
}