package com.constellio.app.api.cmis.rm;
import static org.apache.chemistry.opencmis.commons.enums.PropertyType.DATETIME;
import static org.apache.chemistry.opencmis.commons.enums.PropertyType.STRING;
import static org.apache.chemistry.opencmis.commons.enums.Updatability.READONLY;
import static org.apache.chemistry.opencmis.commons.enums.Updatability.READWRITE;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.chemistry.opencmis.client.api.ObjectType;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.enums.PropertyType;
import org.apache.chemistry.opencmis.commons.enums.Updatability;
import org.assertj.core.api.Condition;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.api.cmis.accept.CmisAcceptanceTestSetup;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.setups.Users;
public class RMModuleTypesAcceptTest extends ConstellioTest {
Session cmisSession;
Users users = new Users();
UserServices userServices;
String chuckNorrisKey = "chuckNorris-key";
String chuckNorrisToken;
@Before
public void setUp()
throws Exception {
prepareSystem(
withZeCollection().withAllTestUsers().withConstellioRMModule()
);
userServices = getModelLayerFactory().newUserServices();
users.setUp(userServices);
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();
CmisAcceptanceTestSetup.giveUseCMISPermissionToUsers(getModelLayerFactory());
}
@Test
public void validateFolderType()
throws Exception {
ObjectType baseFolderType = cmisSession.getTypeDefinition("cmis:folder");
Iterator<ObjectType> iterator = baseFolderType.getChildren().iterator();
Map<String, PropertyDefinition<?>> folderTypeMetadatas = getFolderType("folder_default").getPropertyDefinitions();
assertThat(folderTypeMetadatas.get(Folder.OPENING_DATE))
.has(propertyType(DATETIME)).has(updatability(READWRITE));
assertThat(folderTypeMetadatas.get(Folder.ACTUAL_TRANSFER_DATE))
.has(propertyType(DATETIME)).has(updatability(READWRITE));
assertThat(folderTypeMetadatas.get(Folder.RETENTION_RULE_ENTERED))
.has(propertyType(STRING)).has(updatability(READWRITE));
assertThat(folderTypeMetadatas.get(Folder.CATEGORY_ENTERED))
.has(propertyType(STRING)).has(updatability(READWRITE));
assertThat(folderTypeMetadatas.get(Folder.ADMINISTRATIVE_UNIT_ENTERED))
.has(propertyType(STRING)).has(updatability(READWRITE));
assertThat(folderTypeMetadatas.get(Folder.FILING_SPACE_ENTERED))
.has(propertyType(STRING)).has(updatability(READWRITE));
assertThat(folderTypeMetadatas.get(Folder.COPY_STATUS_ENTERED))
.has(propertyType(STRING)).has(updatability(READWRITE));
assertThat(folderTypeMetadatas.get(Folder.EXPECTED_TRANSFER_DATE))
.has(propertyType(DATETIME)).has(updatability(READONLY));
assertThat(folderTypeMetadatas.get(Folder.RETENTION_RULE))
.has(propertyType(STRING)).has(updatability(READONLY));
assertThat(folderTypeMetadatas.get(Folder.CATEGORY))
.has(propertyType(STRING)).has(updatability(READONLY));
assertThat(folderTypeMetadatas.get(Folder.ADMINISTRATIVE_UNIT))
.has(propertyType(STRING)).has(updatability(READONLY));
assertThat(folderTypeMetadatas.get(Folder.FILING_SPACE))
.has(propertyType(STRING)).has(updatability(READONLY));
assertThat(folderTypeMetadatas.get(Folder.COPY_STATUS))
.has(propertyType(STRING)).has(updatability(READONLY));
assertThat(getAllTypeIds()).containsOnly("document_email", "folder_default", "administrativeUnit_default", "taxonomy",
"storageSpace_default", "document_default", "category_default", "collection_default");
}
private Condition<? super PropertyDefinition<?>> updatability(final Updatability expectedValue) {
return new Condition<PropertyDefinition<?>>() {
@Override
public boolean matches(PropertyDefinition<?> value) {
assertThat(value.getUpdatability()).isEqualTo(expectedValue);
return true;
}
};
}
private Condition<? super PropertyDefinition<?>> propertyType(final PropertyType expectedValue) {
return new Condition<PropertyDefinition<?>>() {
@Override
public boolean matches(PropertyDefinition<?> value) {
assertThat(value.getPropertyType().value()).isEqualTo(expectedValue.value());
return true;
}
};
}
private List<String> getAllTypeIds() {
List<String> ids = new ArrayList<>();
ObjectType baseFolderType = cmisSession.getTypeDefinition("cmis:folder");
Iterator<ObjectType> iterator = baseFolderType.getChildren().iterator();
while (iterator.hasNext()) {
ObjectType objectType = iterator.next();
ids.add(objectType.getId());
}
return ids;
}
private ObjectType getFolderType(String id) {
ObjectType baseFolderType = cmisSession.getTypeDefinition("cmis:folder");
Iterator<ObjectType> iterator = baseFolderType.getChildren().iterator();
while (iterator.hasNext()) {
ObjectType objectType = iterator.next();
if (id.equals(objectType.getId())) {
return objectType;
}
}
throw new RuntimeException("No such object type with id : " + id);
}
}