1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.provisioning.java.pushpull;
20
21 import static org.junit.jupiter.api.Assertions.assertEquals;
22 import static org.junit.jupiter.api.Assertions.assertFalse;
23 import static org.junit.jupiter.api.Assertions.assertTrue;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.ArgumentMatchers.anyString;
26 import static org.mockito.Mockito.lenient;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.when;
29
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
33 import java.util.Optional;
34 import java.util.Set;
35 import java.util.UUID;
36 import org.apache.syncope.common.lib.request.AnyUR;
37 import org.apache.syncope.common.lib.request.UserUR;
38 import org.apache.syncope.common.lib.to.EntityTO;
39 import org.apache.syncope.common.lib.to.GroupTO;
40 import org.apache.syncope.common.lib.to.Mapping;
41 import org.apache.syncope.common.lib.to.Provision;
42 import org.apache.syncope.common.lib.to.ProvisioningReport;
43 import org.apache.syncope.common.lib.to.UserTO;
44 import org.apache.syncope.common.lib.types.AnyTypeKind;
45 import org.apache.syncope.common.lib.types.ConnConfPropSchema;
46 import org.apache.syncope.common.lib.types.ConnConfProperty;
47 import org.apache.syncope.common.lib.types.MatchType;
48 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
49 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
50 import org.apache.syncope.core.persistence.api.entity.AnyType;
51 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
52 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
53 import org.apache.syncope.core.persistence.api.entity.ExternalResource;
54 import org.apache.syncope.core.persistence.api.entity.task.ProvisioningTask;
55 import org.apache.syncope.core.persistence.api.entity.user.UMembership;
56 import org.apache.syncope.core.persistence.api.entity.user.User;
57 import org.apache.syncope.core.provisioning.api.Connector;
58 import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningProfile;
59 import org.apache.syncope.core.provisioning.api.rules.PullMatch;
60 import org.apache.syncope.core.provisioning.java.AbstractTest;
61 import org.identityconnectors.framework.common.objects.ConnectorObject;
62 import org.identityconnectors.framework.common.objects.SyncDelta;
63 import org.identityconnectors.framework.common.objects.Uid;
64 import org.junit.jupiter.api.BeforeEach;
65 import org.junit.jupiter.api.Test;
66 import org.mockito.InjectMocks;
67 import org.mockito.Mock;
68 import org.quartz.JobExecutionException;
69 import org.springframework.beans.factory.annotation.Autowired;
70 import org.springframework.test.util.ReflectionTestUtils;
71
72 public class LDAPMembershipPullActionsTest extends AbstractTest {
73
74 @Autowired
75 private EntityFactory entityFactory;
76
77 @Mock
78 private AnyTypeDAO anyTypeDAO;
79
80 @Mock
81 private GroupDAO groupDAO;
82
83 @Mock
84 private InboundMatcher inboundMatcher;
85
86 @InjectMocks
87 private LDAPMembershipPullActions ldapMembershipPullActions;
88
89 @Mock
90 private SyncDelta syncDelta;
91
92 @Mock
93 private ProvisioningProfile<?, ?> profile;
94
95 @Mock
96 private ProvisioningReport result;
97
98 @Mock
99 private ProvisioningTask<?> pullTask;
100
101 @Mock
102 private ExternalResource resource;
103
104 @Mock
105 private Provision provision;
106
107 @Mock
108 private Connector connector;
109
110 @Mock
111 private ConnectorObject connectorObj;
112
113 @Mock
114 private ConnInstance connInstance;
115
116 private EntityTO entity;
117
118 private AnyUR anyReq;
119
120 private Map<String, Set<String>> membershipsAfter;
121
122 private Map<String, Set<String>> membershipsBefore;
123
124 private User user;
125
126 private Set<ConnConfProperty> connConfProperties;
127
128 @BeforeEach
129 public void initTest() {
130 user = entityFactory.newEntity(User.class);
131 ReflectionTestUtils.setField(user, "id", UUID.randomUUID().toString());
132
133 UMembership uMembership = entityFactory.newEntity(UMembership.class);
134 uMembership.setLeftEnd(user);
135
136 anyReq = new UserUR();
137
138 membershipsBefore = new HashMap<>();
139 ReflectionTestUtils.setField(ldapMembershipPullActions, "membershipsBefore", membershipsBefore);
140 membershipsAfter = new HashMap<>();
141 ReflectionTestUtils.setField(ldapMembershipPullActions, "membershipsAfter", membershipsAfter);
142
143 lenient().when(groupDAO.findUMemberships(groupDAO.find(anyString()))).thenReturn(List.of(uMembership));
144
145 ConnConfPropSchema connConfPropSchema = new ConnConfPropSchema();
146 connConfPropSchema.setName("testSchemaName");
147 ConnConfProperty connConfProperty = new ConnConfProperty();
148 connConfProperty.setSchema(connConfPropSchema);
149 connConfProperties = Set.of(connConfProperty);
150
151 lenient().when(profile.getTask()).thenAnswer(ic -> pullTask);
152 lenient().when(pullTask.getResource()).thenReturn(resource);
153 lenient().when(resource.getProvisionByAnyType(anyString())).thenReturn(Optional.of(provision));
154 lenient().when(provision.getMapping()).thenReturn(new Mapping());
155 lenient().when(anyTypeDAO.findUser()).thenAnswer(ic -> {
156 AnyType userAnyType = mock(AnyType.class);
157 lenient().when(userAnyType.getKey()).thenReturn(AnyTypeKind.USER.name());
158 return userAnyType;
159 });
160
161 lenient().when(profile.getConnector()).thenReturn(connector);
162 lenient().when(syncDelta.getObject()).thenReturn(connectorObj);
163 lenient().when(connector.getConnInstance()).thenReturn(connInstance);
164 lenient().when(connInstance.getConf()).thenReturn(connConfProperties);
165 }
166
167 @Test
168 public void beforeUpdateWithGroupTOAndEmptyMemberships() throws JobExecutionException {
169 entity = new GroupTO();
170 entity.setKey(UUID.randomUUID().toString());
171
172 ldapMembershipPullActions.beforeUpdate(profile, syncDelta, entity, anyReq);
173
174 assertTrue(entity instanceof GroupTO);
175 assertEquals(1, membershipsBefore.get(user.getKey()).size());
176 assertEquals(Set.of(entity.getKey()), membershipsBefore.get(user.getKey()));
177 }
178
179 @Test
180 public void beforeUpdate() throws JobExecutionException {
181 entity = new UserTO();
182 entity.setKey(UUID.randomUUID().toString());
183
184 membershipsBefore.put(user.getKey(), Set.of(entity.getKey()));
185
186 ldapMembershipPullActions.beforeUpdate(profile, syncDelta, entity, anyReq);
187
188 assertFalse(entity instanceof GroupTO);
189 assertEquals(1, membershipsBefore.get(user.getKey()).size());
190 }
191
192 @Test
193 public void after() throws JobExecutionException {
194 entity = new GroupTO();
195 entity.setKey(UUID.randomUUID().toString());
196
197 when(connectorObj.getAttributeByName(anyString())).thenReturn(new Uid(UUID.randomUUID().toString()));
198 when(inboundMatcher.match(any(AnyType.class), anyString(), any(ExternalResource.class), any(Connector.class))).
199 thenReturn(Optional.of(new PullMatch(MatchType.ANY, user)));
200
201 ldapMembershipPullActions.after(profile, syncDelta, entity, result);
202
203 assertEquals(1, membershipsAfter.get(user.getKey()).size());
204 assertEquals(entity.getKey(), membershipsAfter.get(user.getKey()).iterator().next());
205 }
206 }