/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2014 ForgeRock AS. All Rights Reserved
*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* http://forgerock.org/license/CDDLv1.0.html
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at http://forgerock.org/license/CDDLv1.0.html
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*/
package org.forgerock.openicf.connectors;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.identityconnectors.framework.common.objects.filter.FilterBuilder.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import org.forgerock.openicf.connectors.scriptedcrest.ScriptedCRESTConnector;
import org.identityconnectors.common.CollectionUtil;
import org.identityconnectors.framework.api.ConnectorFacade;
import org.identityconnectors.framework.common.exceptions.UnknownUidException;
import org.identityconnectors.framework.common.objects.Attribute;
import org.identityconnectors.framework.common.objects.AttributeBuilder;
import org.identityconnectors.framework.common.objects.AttributeUtil;
import org.identityconnectors.framework.common.objects.ConnectorObject;
import org.identityconnectors.framework.common.objects.Name;
import org.identityconnectors.framework.common.objects.ObjectClass;
import org.identityconnectors.framework.common.objects.OperationOptionsBuilder;
import org.identityconnectors.framework.common.objects.PredefinedAttributes;
import org.identityconnectors.framework.common.objects.ResultsHandler;
import org.identityconnectors.framework.common.objects.ScriptContextBuilder;
import org.identityconnectors.framework.common.objects.SearchResult;
import org.identityconnectors.framework.common.objects.SortKey;
import org.identityconnectors.framework.common.objects.Uid;
import org.identityconnectors.framework.common.objects.filter.Filter;
import org.identityconnectors.framework.common.objects.filter.FilterBuilder;
import org.identityconnectors.test.common.ToListResultsHandler;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
*
* @author Laszlo Hordos
*/
public class ScriptedCRESTConnectorTest extends RESTTestBase {
protected static final String TEST_NAME = "CREST";
protected ConnectorFacade getFacade() {
return getFacade(ScriptedCRESTConnector.class, TEST_NAME);
}
@Test
public void validate() throws Exception {
final ConnectorFacade facade = getFacade();
facade.validate();
}
@Test
public void test() throws Exception {
final ConnectorFacade facade = getFacade();
facade.test();
}
@Test
public void testCreate() throws Exception {
final ConnectorFacade facade = getFacade();
Set<Attribute> createAttributes = createUserAttributes("John", "Doe");
createAttributes.add(AttributeBuilder.build("telephoneNumber", "1-555-555-1212"));
createAttributes.add(AttributeBuilder.buildEnabled(true));
createAttributes.add(AttributeBuilder.build(PredefinedAttributes.GROUPS_NAME, "Group1",
"Group2"));
Uid uid = facade.create(ObjectClass.ACCOUNT, createAttributes, null);
ConnectorObject co = facade.getObject(ObjectClass.ACCOUNT, uid, null);
assertThat(AttributeUtil.filterUid(co.getAttributes())).containsAll(createAttributes);
facade.delete(ObjectClass.ACCOUNT, uid, null);
Assert.assertNull(facade.getObject(ObjectClass.ACCOUNT, uid, null));
}
@Test
public void testUpdate() throws Exception {
final ConnectorFacade facade = getFacade();
Set<Attribute> createAttributes = createUserAttributes("John", "Doe");
createAttributes.add(AttributeBuilder.build("telephoneNumber", "1-555-555-1212"));
createAttributes.add(AttributeBuilder.buildEnabled(true));
createAttributes.add(AttributeBuilder.build(PredefinedAttributes.GROUPS_NAME,
new ArrayList<String>()));
Uid uid = facade.create(ObjectClass.ACCOUNT, createAttributes, null);
OperationOptionsBuilder builder =
new OperationOptionsBuilder().setAttributesToGet(PredefinedAttributes.GROUPS_NAME);
ConnectorObject co = facade.getObject(ObjectClass.ACCOUNT, uid, builder.build());
assertThat(co.getAttributeByName(PredefinedAttributes.GROUPS_NAME).getValue()).isEmpty();
facade.update(ObjectClass.ACCOUNT, co.getUid(), CollectionUtil.newSet(AttributeBuilder
.build(PredefinedAttributes.GROUPS_NAME, "Group1", "Group2")), null);
co = facade.getObject(ObjectClass.ACCOUNT, uid, builder.build());
assertThat(co.getAttributeByName(PredefinedAttributes.GROUPS_NAME).getValue()).contains(
"Group1", "Group2");
facade.delete(ObjectClass.ACCOUNT, uid, null);
Assert.assertNull(facade.getObject(ObjectClass.ACCOUNT, uid, null));
}
@Test(expectedExceptions = UnknownUidException.class)
public void testUpdateFail() throws Exception {
final ConnectorFacade facade = getFacade();
facade.update(ObjectClass.ACCOUNT, new Uid("_NON_EXIST_"), CollectionUtil
.newSet(AttributeBuilder
.build(PredefinedAttributes.GROUPS_NAME, "Group1", "Group2")), null);
}
@Test
public void testQuery() throws Exception {
final ConnectorFacade facade = getFacade();
for (int i = 0; i < 100; i++) {
String username = String.format("TEST%04d", i);
Set<Attribute> createAttributes = createUserAttributes("John", username);
facade.create(ObjectClass.ACCOUNT, createAttributes, null);
}
OperationOptionsBuilder builder = new OperationOptionsBuilder();
builder.setPageSize(10);
builder.setSortKeys(SortKey.descendingOrder(Name.NAME));
SearchResult result = null;
final Set<ConnectorObject> resultSet = new HashSet<ConnectorObject>();
int pageIndex = 0;
while ((result =
facade.search(ObjectClass.ACCOUNT, FilterBuilder.startsWith(AttributeBuilder.build(
Name.NAME, "TEST")), new ResultsHandler() {
private int index = 101;
public boolean handle(ConnectorObject connectorObject) {
Integer idx =
Integer.parseInt(connectorObject.getName().getNameValue()
.substring(4));
Assert.assertTrue(idx < index);
index = idx;
return resultSet.add(connectorObject);
}
}, builder.build())).getPagedResultsCookie() != null) {
builder = new OperationOptionsBuilder(builder.build());
builder.setPagedResultsCookie(result.getPagedResultsCookie());
Assert.assertEquals(resultSet.size(), 10 * ++pageIndex);
}
Assert.assertEquals(pageIndex, 9);
Assert.assertEquals(resultSet.size(), 100);
}
@Test
public void testFilterTranslator() throws Exception {
Filter left = startsWith(AttributeBuilder.build("attributeString", "reti"));
left = and(left, contains(AttributeBuilder.build("attributeString", "pipi")));
left = and(left, endsWith(AttributeBuilder.build("attributeString", "ter")));
Filter right = lessThanOrEqualTo(AttributeBuilder.build("attributeInteger", 42));
right = or(right, lessThan(AttributeBuilder.build("attributeFloat", Float.MAX_VALUE)));
right =
or(right, greaterThanOrEqualTo(AttributeBuilder.build("attributeDouble",
Double.MIN_VALUE)));
right = or(right, greaterThan(AttributeBuilder.build("attributeLong", Long.MIN_VALUE)));
right = and(right, not(equalTo(AttributeBuilder.build("attributeByte", new Byte("33")))));
left =
and(left, containsAllValues(AttributeBuilder.build("attributeStringMultivalue",
"value1", "value2")));
ToListResultsHandler handler = new ToListResultsHandler();
SearchResult result = getFacade().search(new ObjectClass("TEST"), and(left, right), handler, null);
Assert.assertTrue(handler.getObjects().isEmpty());
Assert.assertEquals(
result.getPagedResultsCookie(),
"((((/attributeString sw \"reti\" and /attributeString co \"pipi\") and /attributeString ew \"ter\") and /attributeStringMultivalue ca \"[\"value1\",\"value2\"]\") and ((((/attributeInteger le 42 or /attributeFloat lt 3.4028235E38) or /attributeDouble ge 4.9E-324) or /attributeLong gt -9223372036854775808) and ! (/attributeByte eq 33)))");
}
@Test(enabled = false)
public void testAction() throws Exception {
final ConnectorFacade facade = getFacade();
ScriptContextBuilder builder = new ScriptContextBuilder();
builder.setScriptLanguage("crest");
builder.setScriptText("UNKNOWN");
Object response = facade.runScriptOnResource(builder.build(), null);
}
private Set<Attribute> createUserAttributes(String firstName, String lastName) {
Set<Attribute> createAttributes = new HashSet<Attribute>();
createAttributes.add(new Name(lastName.toLowerCase()));
createAttributes.add(AttributeBuilder.buildCurrentPassword("Passw0rd".toCharArray()));
createAttributes.add(AttributeBuilder.build("givenName", firstName));
createAttributes.add(AttributeBuilder.build("sn", lastName));
createAttributes.add(AttributeBuilder
.build("mail", lastName.toLowerCase() + "@example.com"));
return createAttributes;
}
}