package com.constellio.app.api.cmis.accept;
import static java.util.Arrays.asList;
import static org.apache.chemistry.opencmis.commons.enums.AclPropagation.REPOSITORYDETERMINED;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.commons.enums.Action;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.api.cmis.accept.CmisAcceptanceTestSetup.Records;
import com.constellio.model.entities.records.Record;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.records.RecordServicesRuntimeException;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators;
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 DeleteTreeAcceptTest extends ConstellioTest {
UserServices userServices;
TaxonomiesManager taxonomiesManager;
MetadataSchemasManager metadataSchemasManager;
RecordServices recordServices;
Users users = new Users();
CmisAcceptanceTestSetup zeCollectionSchemas = new CmisAcceptanceTestSetup(zeCollection);
Records zeCollectionRecords;
TaxonomiesSearchServices taxonomiesSearchServices;
Session cmisSession;
String chuckNorrisKey = "chuckNorris-key";
String chuckNorrisToken;
SearchServices searchServices;
@Before
public void setUp()
throws Exception {
userServices = getModelLayerFactory().newUserServices();
taxonomiesManager = getModelLayerFactory().getTaxonomiesManager();
metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager();
recordServices = getModelLayerFactory().newRecordServices();
taxonomiesSearchServices = getModelLayerFactory().newTaxonomiesSearchService();
searchServices = getModelLayerFactory().newSearchServices();
users.setUp(userServices);
defineSchemasManager().using(zeCollectionSchemas);
CmisAcceptanceTestSetup.allSchemaTypesSupported(getAppLayerFactory());
taxonomiesManager.addTaxonomy(zeCollectionSchemas.getTaxonomy1(), metadataSchemasManager);
taxonomiesManager.addTaxonomy(zeCollectionSchemas.getTaxonomy2(), metadataSchemasManager);
taxonomiesManager.setPrincipalTaxonomy(zeCollectionSchemas.getTaxonomy1(), metadataSchemasManager);
zeCollectionRecords = zeCollectionSchemas.givenRecords(recordServices);
userServices.addUpdateUserCredential(
userServices.getUserCredential(chuckNorris).withServiceKey(chuckNorrisKey).withSystemAdminPermission());
chuckNorrisToken = userServices.generateToken(chuckNorris);
userServices.addUserToCollection(users.chuckNorris(), zeCollection);
userServices.addUserToCollection(users.admin(), zeCollection);
cmisSession = newCmisSessionBuilder().authenticatedBy(chuckNorrisKey, chuckNorrisToken).onCollection(zeCollection)
.build();
recordServices.update(users.adminIn(zeCollection).setCollectionAllAccess(true));
CmisAcceptanceTestSetup.giveUseCMISPermissionToUsers(getModelLayerFactory());
}
@Test
public void whenDeleteTreeThenItIsDeleted()
throws Exception {
recordServices.update(users.chuckNorrisIn(zeCollection).setCollectionDeleteAccess(true).getWrappedRecord());
CmisObject object = cmisSession.getObject(zeCollectionRecords.folder1.getId());
cmisSession.getBinding().getObjectService()
.deleteTree(cmisSession.getRepositoryInfo().getId(), object.getId(), true, UnfileObject.DELETE, false, null);
try {
recordServices.getDocumentById(zeCollectionRecords.folder1.getId());
fail("Record still exist");
} catch (RecordServicesRuntimeException.NoSuchRecordWithId e) {
//OK
}
}
@Test
public void givenOnlyReadAccessWhenDeleteTreeThenItsNotDeleted()
throws Exception {
recordServices.update(users.chuckNorrisIn(zeCollection).setCollectionReadAccess(true).getWrappedRecord());
CmisObject object = cmisSession.getObject(zeCollectionRecords.folder1.getId());
cmisSession.getBinding().getObjectService()
.deleteTree(cmisSession.getRepositoryInfo().getId(), object.getId(), true, UnfileObject.DELETE, false, null);
recordServices.refresh(zeCollectionRecords.folder1);
assertThat(zeCollectionRecords.folder1.isActive()).isTrue();
}
@Test
public void whenDeletingConceptThenError()
throws RecordServicesException {
String parentId = "folder2";
cmisSession = newCMISSessionAsUserInZeCollection(admin);
int initialRecordsCount = countRecords();
for (Record record : asList(zeCollectionRecords.taxo1_category2, zeCollectionRecords.taxo1_category2_1,
zeCollectionRecords.taxo1_fond1, zeCollectionRecords.taxo1_fond1_1, zeCollectionRecords.taxo2_station1,
zeCollectionRecords.taxo2_unit1_1)) {
System.out.println(record.getId());
Folder folder = cmisFolder(record);
assertThat(folder.getAllowableActions().getAllowableActions())
.doesNotContain(Action.CAN_DELETE_OBJECT, Action.CAN_DELETE_TREE);
//This service is returning a list of failed record
assertThat(folder.deleteTree(true, UnfileObject.DELETE, false)).isNotEmpty();
assertThat(countRecords()).isEqualTo(initialRecordsCount);
try {
folder.delete(true);
fail("Exception expected");
} catch (CmisRuntimeException e) {
assertThat(e.getMessage()).isEqualTo("Unsupported operation");
}
try {
folder.delete();
fail("Exception expected");
} catch (CmisRuntimeException e) {
assertThat(e.getMessage()).isEqualTo("Unsupported operation");
}
}
}
private Folder cmisFolder(Record record) {
return (Folder) cmisSession.getObject(record.getId());
}
private int countRecords() {
return (int) searchServices.getResultsCount(LogicalSearchQueryOperators.fromAllSchemasIn(zeCollection).returnAll());
}
}