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.api;
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.assertNotNull;
24 import static org.junit.jupiter.api.Assertions.assertNull;
25 import static org.junit.jupiter.api.Assertions.assertTrue;
26 import static org.junit.jupiter.api.Assertions.fail;
27 import static org.mockito.ArgumentMatchers.any;
28 import static org.mockito.ArgumentMatchers.anyString;
29 import static org.mockito.Mockito.lenient;
30 import static org.mockito.Mockito.mock;
31 import static org.mockito.Mockito.when;
32
33 import java.text.ParseException;
34 import java.util.HashMap;
35 import java.util.List;
36 import java.util.Map;
37 import org.apache.commons.lang3.builder.HashCodeBuilder;
38 import org.apache.syncope.common.lib.types.AnyTypeKind;
39 import org.apache.syncope.common.lib.types.AttrSchemaType;
40 import org.apache.syncope.common.lib.types.SchemaType;
41 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
42 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
43 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
44 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
45 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
46 import org.apache.syncope.core.persistence.api.entity.DerSchema;
47 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
48 import org.apache.syncope.core.persistence.api.entity.VirSchema;
49 import org.junit.jupiter.api.BeforeEach;
50 import org.junit.jupiter.api.Test;
51 import org.mockito.Mock;
52 import org.springframework.util.ReflectionUtils;
53
54 public class IntAttrNameParserTest extends AbstractTest {
55
56 private static final Map<AnyTypeKind, List<String>> FIELDS = new HashMap<>();
57
58 static {
59 FIELDS.put(AnyTypeKind.USER, List.of("key", "username"));
60 FIELDS.put(AnyTypeKind.GROUP, List.of("key", "name", "userOwner"));
61 FIELDS.put(AnyTypeKind.ANY_OBJECT, List.of("key", "name"));
62 }
63
64 @Mock
65 private PlainSchemaDAO plainSchemaDAO;
66
67 @Mock
68 private DerSchemaDAO derSchemaDAO;
69
70 @Mock
71 private VirSchemaDAO virSchemaDAO;
72
73 @Mock
74 private AnyUtilsFactory anyUtilsFactory;
75
76 @Mock
77 private AnyUtils anyUtils;
78
79 private IntAttrNameParser intAttrNameParser;
80
81 @BeforeEach
82 public void initMocks() throws NoSuchFieldException {
83 lenient().when(anyUtilsFactory.getInstance(any(AnyTypeKind.class))).thenAnswer(ic -> {
84 when(anyUtils.anyTypeKind()).thenReturn(ic.getArgument(0));
85 return anyUtils;
86 });
87 lenient().when(anyUtils.getField(anyString())).thenAnswer(ic -> {
88 String field = ic.getArgument(0);
89 return FIELDS.get(anyUtils.anyTypeKind()).contains(field)
90 ? ReflectionUtils.findField(getClass(), "anyUtils")
91 : null;
92 });
93 lenient().when(plainSchemaDAO.find(anyString())).thenAnswer(ic -> {
94 String schemaName = ic.getArgument(0);
95 switch (schemaName) {
96 case "email":
97 case "firstname":
98 case "location":
99 PlainSchema schema = mock(PlainSchema.class);
100 lenient().when(schema.getKey()).thenReturn(schemaName);
101 lenient().when(schema.getType()).thenReturn(AttrSchemaType.String);
102 return schema;
103
104 default:
105 return null;
106 }
107 });
108 lenient().when(derSchemaDAO.find(anyString())).thenAnswer(ic -> {
109 String schemaName = ic.getArgument(0);
110 switch (schemaName) {
111 case "cn":
112 DerSchema schema = mock(DerSchema.class);
113 lenient().when(schema.getKey()).thenReturn(ic.getArgument(0));
114 return schema;
115
116 default:
117 return null;
118 }
119 });
120 lenient().when(virSchemaDAO.find(anyString())).thenAnswer(ic -> {
121 String schemaName = ic.getArgument(0);
122 switch (schemaName) {
123 case "rvirtualdata":
124 VirSchema schema = mock(VirSchema.class);
125 lenient().when(schema.getKey()).thenReturn(ic.getArgument(0));
126 return schema;
127
128 default:
129 return null;
130 }
131 });
132
133 intAttrNameParser = new IntAttrNameParser(plainSchemaDAO, derSchemaDAO, virSchemaDAO, anyUtilsFactory);
134 }
135
136 @Test
137 public void ownFields() throws ParseException {
138 IntAttrName intAttrName = intAttrNameParser.parse("key", AnyTypeKind.USER);
139 assertNotNull(intAttrName);
140 assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
141 assertNotNull(intAttrName.getField());
142 assertEquals("key", intAttrName.getField());
143 assertNull(intAttrName.getSchema());
144 assertNull(intAttrName.getSchemaType());
145 assertNull(intAttrName.getEnclosingGroup());
146 assertNull(intAttrName.getMembershipOfGroup());
147 assertNull(intAttrName.getRelatedAnyObject());
148 assertNull(intAttrName.getPrivilegesOfApplication());
149 assertNull(intAttrName.getRelationshipAnyType());
150 assertNull(intAttrName.getRelationshipType());
151 assertNull(intAttrName.getRelatedUser());
152
153 intAttrName = intAttrNameParser.parse("name", AnyTypeKind.GROUP);
154 assertNotNull(intAttrName);
155 assertEquals(AnyTypeKind.GROUP, intAttrName.getAnyTypeKind());
156 assertNotNull(intAttrName.getField());
157 assertEquals("name", intAttrName.getField());
158 assertNull(intAttrName.getSchema());
159 assertNull(intAttrName.getSchemaType());
160 assertNull(intAttrName.getEnclosingGroup());
161 assertNull(intAttrName.getMembershipOfGroup());
162 assertNull(intAttrName.getRelatedAnyObject());
163 assertNull(intAttrName.getPrivilegesOfApplication());
164 assertNull(intAttrName.getRelationshipAnyType());
165 assertNull(intAttrName.getRelationshipType());
166 assertNull(intAttrName.getRelatedUser());
167
168 intAttrName = intAttrNameParser.parse("userOwner", AnyTypeKind.GROUP);
169 assertNotNull(intAttrName);
170 assertEquals(AnyTypeKind.GROUP, intAttrName.getAnyTypeKind());
171 assertNotNull(intAttrName.getField());
172 assertEquals("userOwner", intAttrName.getField());
173 assertNull(intAttrName.getSchema());
174 assertNull(intAttrName.getSchemaType());
175 assertNull(intAttrName.getEnclosingGroup());
176 assertNull(intAttrName.getMembershipOfGroup());
177 assertNull(intAttrName.getRelatedAnyObject());
178 assertNull(intAttrName.getPrivilegesOfApplication());
179 assertNull(intAttrName.getRelationshipAnyType());
180 assertNull(intAttrName.getRelationshipType());
181 assertNull(intAttrName.getRelatedUser());
182
183 intAttrName = intAttrNameParser.parse("name", AnyTypeKind.USER);
184 assertNotNull(intAttrName);
185 assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
186 assertNull(intAttrName.getField());
187
188 Object nullObj = null;
189 int expected = new HashCodeBuilder().
190 append(AnyTypeKind.USER).append(nullObj).append(nullObj).append(nullObj).append(nullObj).
191 append(nullObj).append(nullObj).append(nullObj).append(nullObj).append(nullObj).append(nullObj).
192 build();
193 assertEquals(expected, intAttrName.hashCode());
194 IntAttrName intAttrName2 = intAttrNameParser.parse("email", AnyTypeKind.USER);
195 assertFalse(intAttrName.equals(intAttrName2));
196 assertFalse(intAttrName.equals(nullObj));
197 assertTrue(intAttrName.equals(intAttrName));
198 String toString = intAttrName.toString();
199 assertTrue(toString.startsWith("org.apache.syncope.core.provisioning.api.IntAttrName"));
200 assertTrue(toString.endsWith("[USER,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>]"));
201 }
202
203 @Test
204 public void ownSchema() throws ParseException {
205 IntAttrName intAttrName = intAttrNameParser.parse("email", AnyTypeKind.USER);
206 assertNotNull(intAttrName);
207 assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
208 assertNull(intAttrName.getField());
209 assertEquals("email", intAttrName.getSchema().getKey());
210 assertEquals(SchemaType.PLAIN, intAttrName.getSchemaType());
211 assertTrue(intAttrName.getSchema() instanceof PlainSchema);
212 assertNull(intAttrName.getEnclosingGroup());
213 assertNull(intAttrName.getMembershipOfGroup());
214 assertNull(intAttrName.getRelatedAnyObject());
215 assertNull(intAttrName.getPrivilegesOfApplication());
216 assertNull(intAttrName.getRelationshipAnyType());
217 assertNull(intAttrName.getRelationshipType());
218 assertNull(intAttrName.getRelatedUser());
219
220 intAttrName = intAttrNameParser.parse("cn", AnyTypeKind.ANY_OBJECT);
221 assertNotNull(intAttrName);
222 assertEquals(AnyTypeKind.ANY_OBJECT, intAttrName.getAnyTypeKind());
223 assertNull(intAttrName.getField());
224 assertEquals("cn", intAttrName.getSchema().getKey());
225 assertEquals(SchemaType.DERIVED, intAttrName.getSchemaType());
226 assertTrue(intAttrName.getSchema() instanceof DerSchema);
227 assertNull(intAttrName.getEnclosingGroup());
228 assertNull(intAttrName.getMembershipOfGroup());
229 assertNull(intAttrName.getRelatedAnyObject());
230 assertNull(intAttrName.getPrivilegesOfApplication());
231 assertNull(intAttrName.getRelationshipAnyType());
232 assertNull(intAttrName.getRelationshipType());
233 assertNull(intAttrName.getRelatedUser());
234
235 intAttrName = intAttrNameParser.parse("rvirtualdata", AnyTypeKind.ANY_OBJECT);
236 assertNotNull(intAttrName);
237 assertEquals(AnyTypeKind.ANY_OBJECT, intAttrName.getAnyTypeKind());
238 assertNull(intAttrName.getField());
239 assertEquals("rvirtualdata", intAttrName.getSchema().getKey());
240 assertEquals(SchemaType.VIRTUAL, intAttrName.getSchemaType());
241 assertTrue(intAttrName.getSchema() instanceof VirSchema);
242 assertNull(intAttrName.getEnclosingGroup());
243 assertNull(intAttrName.getMembershipOfGroup());
244 assertNull(intAttrName.getRelatedAnyObject());
245 assertNull(intAttrName.getPrivilegesOfApplication());
246 assertNull(intAttrName.getRelationshipAnyType());
247 assertNull(intAttrName.getRelationshipType());
248 assertNull(intAttrName.getRelatedUser());
249 }
250
251 @Test
252 public void enclosingGroup() throws ParseException {
253 IntAttrName intAttrName = intAttrNameParser.parse("groups[readers].cn", AnyTypeKind.USER);
254 assertNotNull(intAttrName);
255 assertEquals(AnyTypeKind.GROUP, intAttrName.getAnyTypeKind());
256 assertNull(intAttrName.getField());
257 assertEquals("cn", intAttrName.getSchema().getKey());
258 assertEquals(SchemaType.DERIVED, intAttrName.getSchemaType());
259 assertTrue(intAttrName.getSchema() instanceof DerSchema);
260 assertEquals("readers", intAttrName.getEnclosingGroup());
261 assertNull(intAttrName.getMembershipOfGroup());
262 assertNull(intAttrName.getRelatedAnyObject());
263 assertNull(intAttrName.getPrivilegesOfApplication());
264 assertNull(intAttrName.getRelationshipAnyType());
265 assertNull(intAttrName.getRelationshipType());
266 assertNull(intAttrName.getRelatedUser());
267 }
268
269 @Test
270 public void relatedUser() throws ParseException {
271 IntAttrName intAttrName = intAttrNameParser.parse("users[bellini].firstname", AnyTypeKind.USER);
272 assertNotNull(intAttrName);
273 assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
274 assertNull(intAttrName.getField());
275 assertEquals("firstname", intAttrName.getSchema().getKey());
276 assertEquals(SchemaType.PLAIN, intAttrName.getSchemaType());
277 assertTrue(intAttrName.getSchema() instanceof PlainSchema);
278 assertEquals("bellini", intAttrName.getRelatedUser());
279 assertNull(intAttrName.getEnclosingGroup());
280 assertNull(intAttrName.getMembershipOfGroup());
281 assertNull(intAttrName.getRelatedAnyObject());
282 assertNull(intAttrName.getPrivilegesOfApplication());
283 assertNull(intAttrName.getRelationshipAnyType());
284 assertNull(intAttrName.getRelationshipType());
285 }
286
287 @Test
288 public void relatedAnyObject() throws ParseException {
289 IntAttrName intAttrName = intAttrNameParser.parse("anyObjects[hp].name", AnyTypeKind.USER);
290 assertNotNull(intAttrName);
291 assertEquals(AnyTypeKind.ANY_OBJECT, intAttrName.getAnyTypeKind());
292 assertEquals("name", intAttrName.getField());
293 assertNull(intAttrName.getSchema());
294 assertNull(intAttrName.getSchemaType());
295 assertNull(intAttrName.getEnclosingGroup());
296 assertEquals("hp", intAttrName.getRelatedAnyObject());
297 assertNull(intAttrName.getMembershipOfGroup());
298 assertNull(intAttrName.getPrivilegesOfApplication());
299 assertNull(intAttrName.getRelationshipAnyType());
300 assertNull(intAttrName.getRelationshipType());
301 assertNull(intAttrName.getRelatedUser());
302 }
303
304 @Test
305 public void membership() throws ParseException {
306 IntAttrName intAttrName = intAttrNameParser.parse("memberships[top].cn", AnyTypeKind.USER);
307 assertNotNull(intAttrName);
308 assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
309 assertNull(intAttrName.getField());
310 assertEquals("cn", intAttrName.getSchema().getKey());
311 assertEquals(SchemaType.DERIVED, intAttrName.getSchemaType());
312 assertTrue(intAttrName.getSchema() instanceof DerSchema);
313 assertNull(intAttrName.getEnclosingGroup());
314 assertEquals("top", intAttrName.getMembershipOfGroup());
315 assertNull(intAttrName.getRelatedAnyObject());
316 assertNull(intAttrName.getPrivilegesOfApplication());
317 assertNull(intAttrName.getRelationshipAnyType());
318 assertNull(intAttrName.getRelationshipType());
319 assertNull(intAttrName.getRelatedUser());
320 }
321
322 @Test
323 public void privileges() throws ParseException {
324 IntAttrName intAttrName = intAttrNameParser.parse("privileges[mightyApp]", AnyTypeKind.USER);
325 assertNotNull(intAttrName);
326 assertEquals(AnyTypeKind.USER, intAttrName.getAnyTypeKind());
327 assertNull(intAttrName.getField());
328 assertNull(intAttrName.getSchema());
329 assertNull(intAttrName.getSchemaType());
330 assertNull(intAttrName.getEnclosingGroup());
331 assertNull(intAttrName.getRelatedAnyObject());
332 assertEquals("mightyApp", intAttrName.getPrivilegesOfApplication());
333 assertNull(intAttrName.getRelationshipAnyType());
334 assertNull(intAttrName.getRelationshipType());
335 assertNull(intAttrName.getRelatedUser());
336 }
337
338 @Test
339 public void relationship() throws ParseException {
340 IntAttrName intAttrName = intAttrNameParser.parse(
341 "relationships[inclusion][PRINTER].location", AnyTypeKind.USER);
342 assertNotNull(intAttrName);
343 assertEquals(AnyTypeKind.ANY_OBJECT, intAttrName.getAnyTypeKind());
344 assertNull(intAttrName.getField());
345 assertEquals("location", intAttrName.getSchema().getKey());
346 assertEquals(SchemaType.PLAIN, intAttrName.getSchemaType());
347 assertTrue(intAttrName.getSchema() instanceof PlainSchema);
348 assertEquals("inclusion", intAttrName.getRelationshipType());
349 assertEquals("PRINTER", intAttrName.getRelationshipAnyType());
350 assertNull(intAttrName.getEnclosingGroup());
351 assertNull(intAttrName.getRelatedAnyObject());
352 assertNull(intAttrName.getPrivilegesOfApplication());
353 assertNull(intAttrName.getRelatedUser());
354 }
355
356 @Test
357 public void invalid() {
358 try {
359 intAttrNameParser.parse("memberships.cn", AnyTypeKind.USER);
360 fail("This should not happen");
361 } catch (ParseException e) {
362 assertNotNull(e);
363 }
364 }
365 }