package com.constellio.app.api.cmis.accept;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.apache.chemistry.opencmis.commons.spi.Holder;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.api.cmis.accept.CmisAcceptanceTestSetup.FolderSchema;
import com.constellio.app.api.cmis.accept.CmisAcceptanceTestSetup.Records;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import com.constellio.model.services.taxonomies.TaxonomiesSearchServices;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.annotations.DriverTest;
import com.constellio.sdk.tests.setups.Users;
@DriverTest
public class MoveObjectAcceptTest extends ConstellioTest {
UserServices userServices;
TaxonomiesManager taxonomiesManager;
MetadataSchemasManager schemasManager;
RecordServices recordServices;
Users users = new Users();
CmisAcceptanceTestSetup zeCollectionSchemas = new CmisAcceptanceTestSetup(zeCollection);
FolderSchema folderSchema = zeCollectionSchemas.new FolderSchema();
Records zeCollectionRecords;
TaxonomiesSearchServices taxonomiesSearchServices;
Session cmisSession;
String chuckNorrisKey = "chuckNorris-key";
String chuckNorrisToken;
@Before
public void setUp()
throws Exception {
userServices = getModelLayerFactory().newUserServices();
taxonomiesManager = getModelLayerFactory().getTaxonomiesManager();
schemasManager = getModelLayerFactory().getMetadataSchemasManager();
recordServices = getModelLayerFactory().newRecordServices();
taxonomiesSearchServices = getModelLayerFactory().newTaxonomiesSearchService();
users.setUp(userServices);
defineSchemasManager().using(zeCollectionSchemas);
CmisAcceptanceTestSetup.allSchemaTypesSupported(getAppLayerFactory());
taxonomiesManager.addTaxonomy(zeCollectionSchemas.getTaxonomy1(), schemasManager);
taxonomiesManager.setPrincipalTaxonomy(zeCollectionSchemas.getTaxonomy1(), schemasManager);
zeCollectionRecords = zeCollectionSchemas.givenRecords(recordServices);
userServices.addUpdateUserCredential(
userServices.getUserCredential(chuckNorris).withServiceKey(chuckNorrisKey).withSystemAdminPermission());
chuckNorrisToken = userServices.generateToken(chuckNorris);
userServices.addUserToCollection(users.chuckNorris(), zeCollection);
cmisSession = newCmisSessionBuilder().authenticatedBy(chuckNorrisKey, chuckNorrisToken).onCollection(zeCollection)
.build();
recordServices.update(users.chuckNorrisIn(zeCollection).setCollectionWriteAccess(true).getWrappedRecord());
CmisAcceptanceTestSetup.giveUseCMISPermissionToUsers(getModelLayerFactory());
}
@Test
public void whenChangeParentOfSubFolderThenItIsMoved()
throws Exception {
Record record = zeCollectionRecords.folder2_1;
String parentTargetId = zeCollectionRecords.folder1.getId();
moveObject(record, parentTargetId);
assertThat(record.getParentId()).isEqualTo(parentTargetId);
assertParentAndPrincipalPath(record, parentTargetId);
}
@Test
public void whenChangeParentOfFolderThenItIsMoved()
throws Exception {
Record record = zeCollectionRecords.folder4;
String parentTargetId = zeCollectionRecords.taxo1_category1.getId();
recordServices.update(record.set(folderSchema.taxonomy1(), parentTargetId));
//moveObject(record, parentTargetId);
assertParentAndPrincipalPath(record, parentTargetId);
}
@Test
public void whenMovingConceptThenError()
throws Exception {
Record record = zeCollectionRecords.taxo1_category2;
String parentTargetId = zeCollectionRecords.taxo1_fond1_1.getId();
try {
moveObject(record, parentTargetId);
fail("Exception expected");
} catch (CmisRuntimeException e) {
//OK
}
}
@Test
public void whenChangeParentOfFolderToNonPrincipalConceptTaxonomyThenException()
throws Exception {
Record record = zeCollectionRecords.folder4;
String parentTargetId = zeCollectionRecords.taxo2_station2.getId();
try {
moveObject(record, parentTargetId);
} catch (Exception e) {
assertThat(e.getMessage()).isEqualTo("Target " + parentTargetId + " record is not in a principal taxonomy");
}
}
private void moveObject(Record record, String parentTargetId) {
CmisObject object = cmisSession.getObject(record.getId());
Holder<String> objectIdHolder = new Holder<String>(object.getId());
cmisSession.getBinding().getObjectService()
.moveObject(cmisSession.getRepositoryInfo().getId(), objectIdHolder, parentTargetId, record.getId(), null);
recordServices.refresh(record);
}
private void assertParentAndPrincipalPath(Record record, String parentTargetId) {
boolean flag = false;
MetadataSchemaTypes types = schemasManager.getSchemaTypes(record.getCollection());
MetadataSchema schema = types.getSchema(record.getSchemaCode());
List<Metadata> parentReferencesMetadatas = schema.getParentReferences();
List<Metadata> referencesMetadatas = schema.getTaxonomyRelationshipReferences(Arrays.asList(taxonomiesManager
.getPrincipalTaxonomy(record.getCollection())));
List<Metadata> allReferencesMetadatas = new ArrayList<>();
allReferencesMetadatas.addAll(parentReferencesMetadatas);
allReferencesMetadatas.addAll(referencesMetadatas);
for (Metadata referenceMetadata : allReferencesMetadatas) {
if (record.get(referenceMetadata) != null) {
assertThat(record.get(referenceMetadata)).isEqualTo(parentTargetId);
assertThat(((String) record.get(Schemas.PRINCIPAL_PATH)).contains(parentTargetId)).isTrue();
flag = true;
}
}
if (!flag) {
fail();
}
}
}