View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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 }