blob: d29d38396e252d91959eb136f6a89ffb9fc20e86 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.syncope.core.logic.scim;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.apache.syncope.common.lib.scim.SCIMComplexConf;
import org.apache.syncope.common.lib.scim.SCIMConf;
import org.apache.syncope.common.lib.scim.SCIMUserConf;
import org.apache.syncope.common.lib.scim.SCIMUserNameConf;
import org.apache.syncope.common.lib.scim.types.EmailCanonicalType;
import org.apache.syncope.core.persistence.api.dao.search.AnyCond;
import org.apache.syncope.core.persistence.api.dao.search.AttrCond;
import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
import org.apache.syncope.ext.scimv2.api.type.Resource;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
public class SCIMFilterTest {
private static SearchCondVisitor VISITOR;
@BeforeAll
public static void setup() {
SCIMConf conf = new SCIMConf();
conf.setUserConf(new SCIMUserConf());
conf.getUserConf().setTitle("title");
conf.getUserConf().setDisplayName("cn");
conf.getUserConf().setUserType("userType");
conf.getUserConf().setName(new SCIMUserNameConf());
conf.getUserConf().getName().setFamilyName("surname");
SCIMComplexConf<EmailCanonicalType> email = new SCIMComplexConf<>();
email.setValue("email");
email.setType(EmailCanonicalType.work);
conf.getUserConf().getEmails().add(email);
email = new SCIMComplexConf<>();
email.setValue("gmail");
email.setType(EmailCanonicalType.home);
conf.getUserConf().getEmails().add(email);
VISITOR = new SearchCondVisitor(Resource.User, conf);
}
@Test
public void eq() {
SearchCond cond = SearchCondConverter.convert(VISITOR, "userName eq \"bjensen\"");
assertNotNull(cond);
assertTrue(cond.getLeaf(AnyCond.class).isPresent());
assertEquals("username", cond.getLeaf(AnyCond.class).get().getSchema());
assertEquals(AttrCond.Type.IEQ, cond.getLeaf(AnyCond.class).get().getType());
assertEquals("bjensen", cond.getLeaf(AnyCond.class).get().getExpression());
}
@Test
public void sw() {
SearchCond cond = SearchCondConverter.convert(VISITOR, "userName sw \"J\"");
assertNotNull(cond);
assertTrue(cond.getLeaf(AnyCond.class).isPresent());
assertEquals("username", cond.getLeaf(AnyCond.class).get().getSchema());
assertEquals(AttrCond.Type.ILIKE, cond.getLeaf(AnyCond.class).get().getType());
assertEquals("J%", cond.getLeaf(AnyCond.class).get().getExpression());
SearchCond fqn = SearchCondConverter.convert(
VISITOR, "urn:ietf:params:scim:schemas:core:2.0:User:userName sw \"J\"");
assertEquals(cond, fqn);
}
@Test
public void pr() {
SearchCond cond = SearchCondConverter.convert(VISITOR, "title pr");
assertNotNull(cond);
assertTrue(cond.getLeaf(AttrCond.class).isPresent());
assertEquals("title", cond.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.ISNOTNULL, cond.getLeaf(AttrCond.class).get().getType());
assertNull(cond.getLeaf(AttrCond.class).get().getExpression());
}
@Test
public void gt() {
SearchCond cond = SearchCondConverter.convert(VISITOR, "meta.lastModified gt \"2011-05-13T04:42:34Z\"");
assertNotNull(cond);
assertTrue(cond.getLeaf(AnyCond.class).isPresent());
assertEquals("lastChangeDate", cond.getLeaf(AnyCond.class).get().getSchema());
assertEquals(AttrCond.Type.GT, cond.getLeaf(AnyCond.class).get().getType());
assertEquals("2011-05-13T04:42:34Z", cond.getLeaf(AnyCond.class).get().getExpression());
}
@Test
public void not() {
SearchCond cond = SearchCondConverter.convert(VISITOR, "not (title pr)");
assertNotNull(cond);
assertTrue(cond.getLeaf(AttrCond.class).isPresent());
assertEquals("title", cond.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.ISNULL, cond.getLeaf(AttrCond.class).get().getType());
assertNull(cond.getLeaf(AttrCond.class).get().getExpression());
}
@Test
public void and() {
SearchCond cond = SearchCondConverter.convert(VISITOR, "title pr and userName sw \"J\"");
assertNotNull(cond);
assertEquals(SearchCond.Type.AND, cond.getType());
SearchCond left = cond.getLeft();
assertNotNull(left);
assertTrue(left.getLeaf(AttrCond.class).isPresent());
assertEquals("title", left.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.ISNOTNULL, left.getLeaf(AttrCond.class).get().getType());
assertNull(left.getLeaf(AttrCond.class).get().getExpression());
SearchCond right = cond.getRight();
assertNotNull(right);
assertTrue(right.getLeaf(AnyCond.class).isPresent());
assertEquals("username", right.getLeaf(AnyCond.class).get().getSchema());
assertEquals(AttrCond.Type.ILIKE, right.getLeaf(AnyCond.class).get().getType());
assertEquals("J%", right.getLeaf(AnyCond.class).get().getExpression());
}
@Test
public void or() {
SearchCond cond = SearchCondConverter.convert(VISITOR, "title pr or displayName eq \"Other\"");
assertNotNull(cond);
assertEquals(SearchCond.Type.OR, cond.getType());
SearchCond left = cond.getLeft();
assertNotNull(left);
assertTrue(left.getLeaf(AttrCond.class).isPresent());
assertEquals("title", left.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.ISNOTNULL, left.getLeaf(AttrCond.class).get().getType());
assertNull(left.getLeaf(AttrCond.class).get().getExpression());
SearchCond right = cond.getRight();
assertNotNull(right);
assertTrue(right.getLeaf(AttrCond.class).isPresent());
assertEquals("cn", right.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.IEQ, right.getLeaf(AttrCond.class).get().getType());
assertEquals("Other", right.getLeaf(AttrCond.class).get().getExpression());
}
@Test
public void type() {
SearchCond cond = SearchCondConverter.convert(VISITOR, "userType eq \"Employee\" and (emails.type eq \"work\")");
assertNotNull(cond);
assertEquals(SearchCond.Type.AND, cond.getType());
SearchCond left = cond.getLeft();
assertNotNull(left);
assertTrue(left.getLeaf(AttrCond.class).isPresent());
assertEquals("userType", left.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.IEQ, left.getLeaf(AttrCond.class).get().getType());
assertEquals("Employee", left.getLeaf(AttrCond.class).get().getExpression());
SearchCond right = cond.getRight();
assertNotNull(right);
assertTrue(right.getLeaf(AttrCond.class).isPresent());
assertEquals("email", right.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.ISNOTNULL, right.getLeaf(AttrCond.class).get().getType());
}
@Test
public void name() {
SearchCond cond = SearchCondConverter.convert(VISITOR, "name.familyName co \"O'Malley\"");
assertNotNull(cond);
assertEquals(SearchCond.Type.LEAF, cond.getType());
AttrCond leaf = cond.getLeaf(AttrCond.class).get();
assertNotNull(leaf);
assertEquals("surname", leaf.getSchema());
assertEquals(AttrCond.Type.ILIKE, leaf.getType());
assertEquals("%O'Malley%", leaf.getExpression());
}
@Test
public void emails() {
SearchCond cond = SearchCondConverter.convert(VISITOR,
"emails co \"example.com\" or emails.value co \"example.org\"");
assertNotNull(cond);
assertEquals(SearchCond.Type.OR, cond.getType());
SearchCond left = cond.getLeft();
assertNotNull(left);
assertEquals(SearchCond.Type.OR, left.getType());
SearchCond left1 = left.getLeft();
assertNotNull(left1);
assertTrue(left1.getLeaf(AttrCond.class).isPresent());
assertEquals("email", left1.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.ILIKE, left1.getLeaf(AttrCond.class).get().getType());
assertEquals("%example.com%", left1.getLeaf(AttrCond.class).get().getExpression());
SearchCond left2 = left.getRight();
assertNotNull(left2);
assertTrue(left2.getLeaf(AttrCond.class).isPresent());
assertEquals("gmail", left2.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.ILIKE, left2.getLeaf(AttrCond.class).get().getType());
assertEquals("%example.com%", left2.getLeaf(AttrCond.class).get().getExpression());
SearchCond right = cond.getRight();
assertNotNull(right);
assertEquals(SearchCond.Type.OR, right.getType());
SearchCond right1 = right.getLeft();
assertNotNull(right1);
assertTrue(right1.getLeaf(AttrCond.class).isPresent());
assertEquals("email", right1.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.ILIKE, right1.getLeaf(AttrCond.class).get().getType());
assertEquals("%example.org%", right1.getLeaf(AttrCond.class).get().getExpression());
SearchCond right2 = right.getRight();
assertNotNull(right2);
assertTrue(right2.getLeaf(AttrCond.class).isPresent());
assertEquals("gmail", right2.getLeaf(AttrCond.class).get().getSchema());
assertEquals(AttrCond.Type.ILIKE, right2.getLeaf(AttrCond.class).get().getType());
assertEquals("%example.org%", right2.getLeaf(AttrCond.class).get().getExpression());
}
}