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.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 }