1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.persistence.api.search;
20
21 import static org.junit.jupiter.api.Assertions.assertEquals;
22 import static org.junit.jupiter.api.Assertions.assertTrue;
23 import static org.junit.jupiter.api.Assertions.fail;
24
25 import java.util.List;
26 import java.util.ListIterator;
27 import org.apache.commons.lang3.StringUtils;
28 import org.apache.commons.lang3.builder.EqualsBuilder;
29 import org.apache.syncope.common.lib.SyncopeClientException;
30 import org.apache.syncope.common.lib.search.ConnObjectTOFiqlSearchConditionBuilder;
31 import org.apache.syncope.common.lib.search.SpecialAttr;
32 import org.apache.syncope.common.lib.types.ClientExceptionType;
33 import org.identityconnectors.framework.common.objects.AttributeBuilder;
34 import org.identityconnectors.framework.common.objects.filter.AndFilter;
35 import org.identityconnectors.framework.common.objects.filter.Filter;
36 import org.identityconnectors.framework.common.objects.filter.FilterBuilder;
37 import org.identityconnectors.framework.common.objects.filter.NotFilter;
38 import org.identityconnectors.framework.common.objects.filter.OrFilter;
39 import org.junit.jupiter.api.Test;
40
41 public class FilterConverterTest {
42
43 private boolean equals(final Filter filter1, final Filter filter2) {
44 return EqualsBuilder.reflectionEquals(filter1, filter2);
45 }
46
47 private boolean equals(final List<Filter> filters1, final List<Filter> filters2) {
48 ListIterator<Filter> e1 = filters1.listIterator();
49 ListIterator<Filter> e2 = filters2.listIterator();
50 while (e1.hasNext() && e2.hasNext()) {
51 Filter o1 = e1.next();
52 Filter o2 = e2.next();
53 if (!equals(o1, o2)) {
54 return false;
55 }
56 }
57 return !(e1.hasNext() || e2.hasNext());
58 }
59
60 @Test
61 public void eq() {
62 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("username").equalTo("rossini").query();
63 assertEquals("username==rossini", fiql);
64
65 Filter filter = FilterBuilder.equalTo(AttributeBuilder.build("username", "rossini"));
66
67 assertTrue(equals(filter, FilterConverter.convert(fiql)));
68 }
69
70 @Test
71 public void ieq() {
72 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("username").equalToIgnoreCase("rossini").query();
73 assertEquals("username=~rossini", fiql);
74
75 Filter filter = FilterBuilder.equalsIgnoreCase(AttributeBuilder.build("username", "rossini"));
76
77 assertTrue(equals(filter, FilterConverter.convert(fiql)));
78 }
79
80 @Test
81 public void nieq() {
82 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("username").notEqualTolIgnoreCase("rossini").
83 query();
84 assertEquals("username!~rossini", fiql);
85
86 Filter filter = FilterBuilder.not(
87 FilterBuilder.equalsIgnoreCase(AttributeBuilder.build("username", "rossini")));
88 assertTrue(filter instanceof NotFilter);
89
90 Filter converted = FilterConverter.convert(fiql);
91 assertTrue(converted instanceof NotFilter);
92
93 assertTrue(equals(
94 ((NotFilter) filter).getFilter(), ((NotFilter) converted).getFilter()));
95 }
96
97 @Test
98 public void like() {
99 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("username").equalTo("ros*").query();
100 assertEquals("username==ros*", fiql);
101
102 Filter filter = FilterBuilder.startsWith(AttributeBuilder.build("username", "ros"));
103
104 assertTrue(equals(filter, FilterConverter.convert(fiql)));
105
106 fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("username").equalTo("*ini").query();
107 assertEquals("username==*ini", fiql);
108
109 filter = FilterBuilder.endsWith(AttributeBuilder.build("username", "ini"));
110
111 assertTrue(equals(filter, FilterConverter.convert(fiql)));
112
113 fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("username").equalTo("r*ini").query();
114 assertEquals("username==r*ini", fiql);
115
116 try {
117 FilterConverter.convert(fiql);
118 fail();
119 } catch (SyncopeClientException e) {
120 assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
121 }
122 }
123
124 @Test
125 public void ilike() {
126 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("username").equalToIgnoreCase("ros*").query();
127 assertEquals("username=~ros*", fiql);
128
129 try {
130 FilterConverter.convert(fiql);
131 fail();
132 } catch (SyncopeClientException e) {
133 assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
134 }
135 }
136
137 @Test
138 public void nilike() {
139 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("username").notEqualTolIgnoreCase("ros*").query();
140 assertEquals("username!~ros*", fiql);
141
142 try {
143 FilterConverter.convert(fiql);
144 fail();
145 } catch (SyncopeClientException e) {
146 assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
147 }
148 }
149
150 @Test
151 public void isNull() {
152 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("loginDate").nullValue().query();
153 assertEquals("loginDate==" + SpecialAttr.NULL, fiql);
154
155 Filter filter = FilterBuilder.not(
156 FilterBuilder.startsWith(AttributeBuilder.build("loginDate", StringUtils.EMPTY)));
157
158 Filter converted = FilterConverter.convert(fiql);
159 assertTrue(converted instanceof NotFilter);
160
161 assertTrue(equals(
162 ((NotFilter) filter).getFilter(), ((NotFilter) converted).getFilter()));
163 }
164
165 @Test
166 public void isNotNull() {
167 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("loginDate").notNullValue().query();
168 assertEquals("loginDate!=" + SpecialAttr.NULL, fiql);
169
170 Filter filter = FilterBuilder.startsWith(AttributeBuilder.build("loginDate", StringUtils.EMPTY));
171
172 assertTrue(equals(filter, FilterConverter.convert(fiql)));
173 }
174
175 @Test
176 public void inDynRealms() {
177 try {
178 FilterConverter.convert(SpecialAttr.DYNREALMS + "==realm");
179 fail();
180 } catch (SyncopeClientException e) {
181 assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
182 }
183 }
184
185 @Test
186 public void notInDynRealms() {
187 try {
188 FilterConverter.convert(SpecialAttr.DYNREALMS + "!=realm");
189 fail();
190 } catch (SyncopeClientException e) {
191 assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
192 }
193 }
194
195 @Test
196 public void hasAuxClasses() {
197 try {
198 FilterConverter.convert(SpecialAttr.AUX_CLASSES + "==clazz1");
199 fail();
200 } catch (SyncopeClientException e) {
201 assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
202 }
203 }
204
205 @Test
206 public void hasNotAuxClasses() {
207 try {
208 FilterConverter.convert(SpecialAttr.AUX_CLASSES + "!=clazz1");
209 fail();
210 } catch (SyncopeClientException e) {
211 assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
212 }
213 }
214
215 @Test
216 public void hasResources() {
217 try {
218 FilterConverter.convert(SpecialAttr.RESOURCES + "==resource");
219 fail();
220 } catch (SyncopeClientException e) {
221 assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
222 }
223 }
224
225 @Test
226 public void hasNotResources() {
227 try {
228 FilterConverter.convert(SpecialAttr.RESOURCES + "!=resource");
229 fail();
230 } catch (SyncopeClientException e) {
231 assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
232 }
233 }
234
235 @Test
236 public void and() {
237 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().
238 is("fullname").equalTo("ro*").and("fullname").equalTo("*i").query();
239 assertEquals("fullname==ro*;fullname==*i", fiql);
240
241 Filter filter1 = FilterBuilder.startsWith(AttributeBuilder.build("fullname", "ro"));
242 Filter filter2 = FilterBuilder.endsWith(AttributeBuilder.build("fullname", "i"));
243
244 Filter filter = FilterBuilder.and(filter1, filter2);
245 assertTrue(filter instanceof AndFilter);
246
247 Filter converted = FilterConverter.convert(fiql);
248 assertTrue(converted instanceof AndFilter);
249
250 assertTrue(equals(
251 (List<Filter>) ((AndFilter) filter).getFilters(), (List<Filter>) ((AndFilter) converted).getFilters()));
252 }
253
254 @Test
255 public void or() {
256 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().
257 is("fullname").equalTo("ro*").or("fullname").equalTo("*i").query();
258 assertEquals("fullname==ro*,fullname==*i", fiql);
259
260 Filter filter1 = FilterBuilder.startsWith(AttributeBuilder.build("fullname", "ro"));
261 Filter filter2 = FilterBuilder.endsWith(AttributeBuilder.build("fullname", "i"));
262
263 Filter filter = FilterBuilder.or(filter1, filter2);
264 assertTrue(filter instanceof OrFilter);
265
266 Filter converted = FilterConverter.convert(fiql);
267 assertTrue(converted instanceof OrFilter);
268
269 assertTrue(equals(
270 (List<Filter>) ((OrFilter) filter).getFilters(), (List<Filter>) ((OrFilter) converted).getFilters()));
271 }
272
273 @Test
274 public void issueSYNCOPE1223() {
275 String fiql = new ConnObjectTOFiqlSearchConditionBuilder().is("ctype").equalTo("ou=sample%252Co=isp").query();
276
277 Filter filter = FilterBuilder.equalTo(AttributeBuilder.build("ctype", "ou=sample,o=isp"));
278
279 assertTrue(equals(filter, FilterConverter.convert(fiql)));
280 }
281 }