http://git-wip-us.apache.org/repos/asf/syncope/blob/73fab3de/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java index 91eda38..3595886 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java @@ -84,6 +84,7 @@ import org.apache.syncope.common.rest.api.service.ResourceService; import org.apache.syncope.common.rest.api.service.GroupService; import org.apache.syncope.common.rest.api.service.MailTemplateService; import org.apache.syncope.common.rest.api.service.RealmService; +import org.apache.syncope.common.rest.api.service.ReconciliationService; import org.apache.syncope.common.rest.api.service.RelationshipTypeService; import org.apache.syncope.common.rest.api.service.ReportTemplateService; import org.apache.syncope.common.rest.api.service.ResourceHistoryService; @@ -227,6 +228,8 @@ public abstract class AbstractITCase { protected static TaskService taskService; + protected static ReconciliationService reconciliationService; + protected static WorkflowService workflowService; protected static MailTemplateService mailTemplateService; @@ -305,6 +308,7 @@ public abstract class AbstractITCase { reportTemplateService = adminClient.getService(ReportTemplateService.class); reportService = adminClient.getService(ReportService.class); taskService = adminClient.getService(TaskService.class); + reconciliationService = adminClient.getService(ReconciliationService.class); policyService = adminClient.getService(PolicyService.class); workflowService = adminClient.getService(WorkflowService.class); mailTemplateService = adminClient.getService(MailTemplateService.class);
http://git-wip-us.apache.org/repos/asf/syncope/blob/73fab3de/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReconciliationITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReconciliationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReconciliationITCase.java new file mode 100644 index 0000000..d6cd241 --- /dev/null +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReconciliationITCase.java @@ -0,0 +1,137 @@ +/* + * 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.fit.core; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Date; +import javax.sql.DataSource; +import org.apache.syncope.common.lib.to.AnyObjectTO; +import org.apache.syncope.common.lib.to.AttrTO; +import org.apache.syncope.common.lib.to.ReconciliationRequest; +import org.apache.syncope.common.lib.to.ReconciliationStatus; +import org.apache.syncope.common.lib.types.AnyTypeKind; +import org.apache.syncope.common.lib.types.ReconciliationAction; +import org.apache.syncope.fit.AbstractITCase; +import org.identityconnectors.framework.common.objects.OperationalAttributes; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "classpath:testJDBCEnv.xml" }) +public class ReconciliationITCase extends AbstractITCase { + + @Autowired + private DataSource testDataSource; + + @Test + public void push() { + // 1. create printer, with no resources + AnyObjectTO printer = AnyObjectITCase.getSampleTO("reconciliation"); + printer.getResources().clear(); + printer = createAnyObject(printer).getEntity(); + assertNotNull(printer.getKey()); + + // 2. verify no printer with that name is on the external resource's db + JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource); + assertEquals(0, jdbcTemplate.queryForList( + "SELECT id FROM testPRINTER WHERE printername=?", printer.getName()).size()); + + // 3. verify reconciliation status + ReconciliationStatus status = + reconciliationService.status(AnyTypeKind.ANY_OBJECT, printer.getName(), "resource-db-scripted"); + assertNotNull(status); + assertNotNull(status.getOnSyncope()); + assertNull(status.getOnResource()); + + // 4. push + ReconciliationRequest request = new ReconciliationRequest(); + request.setAction(ReconciliationAction.PUSH); + request.setAnyKey(printer.getKey()); + request.setAnyTypeKind(AnyTypeKind.ANY_OBJECT); + request.setResourceKey("resource-db-scripted"); + reconciliationService.reconcile(request); + + // 5. verify that printer is now propagated + assertEquals(1, jdbcTemplate.queryForList( + "SELECT id FROM testPRINTER WHERE printername=?", printer.getName()).size()); + + // 6. verify resource was not assigned + printer = anyObjectService.read(printer.getKey()); + assertTrue(printer.getResources().isEmpty()); + + // 7. verify reconciliation status + status = reconciliationService.status(AnyTypeKind.ANY_OBJECT, printer.getName(), "resource-db-scripted"); + assertNotNull(status); + assertNotNull(status.getOnSyncope()); + assertNotNull(status.getOnResource()); + + // __ENABLE__ management depends on the actual connector... + AttrTO enable = status.getOnSyncope().getAttr(OperationalAttributes.ENABLE_NAME); + if (enable != null) { + status.getOnSyncope().getAttrs().remove(enable); + } + assertEquals(status.getOnSyncope(), status.getOnResource()); + } + + @Test + public void pull() { + // 1. create printer, with no resources + AnyObjectTO printer = AnyObjectITCase.getSampleTO("reconciliation"); + printer.getResources().clear(); + printer = createAnyObject(printer).getEntity(); + assertNotNull(printer.getKey()); + assertNotEquals("Nowhere", printer.getPlainAttr("location").getValues().get(0)); + + // 2. create table into the external resource's db, with same name + JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource); + jdbcTemplate.update( + "INSERT INTO TESTPRINTER (id, printername, location, deleted, lastmodification) VALUES (?,?,?,?,?)", + printer.getKey(), printer.getName(), "Nowhere", false, new Date()); + + // 3. verify reconciliation status + ReconciliationStatus status = + reconciliationService.status(AnyTypeKind.ANY_OBJECT, printer.getName(), "resource-db-scripted"); + assertNotNull(status); + assertNotNull(status.getOnSyncope()); + assertNotNull(status.getOnResource()); + assertNotEquals(status.getOnSyncope().getAttr("LOCATION"), status.getOnResource().getAttr("LOCATION")); + + // 4. pull + ReconciliationRequest request = new ReconciliationRequest(); + request.setAction(ReconciliationAction.PULL); + request.setAnyKey(printer.getKey()); + request.setAnyTypeKind(AnyTypeKind.ANY_OBJECT); + request.setResourceKey("resource-db-scripted"); + reconciliationService.reconcile(request); + + // 5. verify reconciliation result (and resource is still not assigned) + printer = anyObjectService.read(printer.getKey()); + assertEquals("Nowhere", printer.getPlainAttr("location").getValues().get(0)); + assertTrue(printer.getResources().isEmpty()); + } +}