package com.constellio.app.modules.robots.ui.pages;
import com.constellio.app.modules.complementary.esRmRobots.services.SmbClassifyServices;
import com.constellio.app.modules.es.connectors.smb.ConnectorSmb;
import com.constellio.app.modules.es.connectors.smb.ConnectorSmbRuntimeException.ConnectorSmbRuntimeException_CannotDownloadSmbDocument;
import com.constellio.app.modules.es.connectors.spi.Connector;
import com.constellio.app.modules.es.connectors.spi.ConnectorInstanciator;
import com.constellio.app.modules.es.model.connectors.ConnectorInstance;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbDocument;
import com.constellio.app.modules.es.services.ConnectorManager;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.model.enums.CopyType;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.robots.model.services.RobotsService;
import com.constellio.app.modules.robots.model.wrappers.Robot;
import com.constellio.app.modules.robots.services.RobotSchemaRecordServices;
import com.constellio.app.modules.robots.ui.navigation.RobotsNavigationConfiguration;
import com.constellio.app.services.schemasDisplay.SchemasDisplayManager;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.app.ui.pages.search.criteria.Criterion;
import com.constellio.app.ui.pages.search.criteria.CriterionFactory;
import com.constellio.app.ui.params.ParamUtils;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.model.services.search.SearchServices;
import com.constellio.sdk.SDKPasswords;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.FakeSessionContext;
import com.constellio.sdk.tests.MockedNavigation;
import com.constellio.sdk.tests.setups.Users;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.io.File;
import java.util.*;
import static com.constellio.model.entities.records.Record.PUBLIC_TOKEN;
import static com.constellio.model.entities.schemas.Schemas.AUTHORIZATIONS;
import static com.constellio.model.entities.schemas.Schemas.IS_DETACHED_AUTHORIZATIONS;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
/**
* Created by Patrick on 2015-12-15.
*/
public class AddEditRobotPresenterAcceptTest extends ConstellioTest {
MockedNavigation navigator;
@Mock AddEditRobotView view;
SessionContext sessionContext;
RobotsService robotsService;
AddEditRobotPresenter presenter;
Robot robot;
RMSchemasRecordsServices rm;
Users users = new Users();
RMTestRecords records = new RMTestRecords(zeCollection);
RecordServices recordServices;
SearchServices searchServices;
private ConnectorInstance<?> connectorInstance;
private ConnectorInstance<?> anotherConnectorInstance;
private ConnectorManager connectorManager;
private ESSchemasRecordsServices es;
private RobotSchemaRecordServices robotsSchemas;
private String share, domain, username, password;
private String folderA = "folderA";
private String folderB = "folderB";
private String folderAA = "folderAA";
private String folderAAA = "folderAAA";
private String folderAAB = "folderAAB";
private String folderABA = "folderABA";
private String folderAB = "folderAB";
private String documentA1 = "documentA1";
private String documentA2 = "documentA2";
private String documentB3 = "documentB3";
private String documentB3JustDeleted = "documentB3JustDeleted";
private String documentAA4 = "documentAA4";
private String documentAA5 = "documentAA5";
private String documentAAA6 = "documentAAA6";
private String documentAAB7 = "documentAAB7";
private String documentAB8 = "documentAB8";
private String documentABA9 = "documentABA9";
private SmbClassifyServices smbClassifyServices;
@Spy ConnectorSmb connectorSmb;
@Before
public void setUp()
throws Exception {
prepareSystem(withZeCollection().withConstellioRMModule().withConstellioESModule().withRobotsModule().withAllTest(users)
.withRMTest(records).withFoldersAndContainersOfEveryStatus().withDocumentsHavingContent());
when(view.getConstellioFactories()).thenReturn(getConstellioFactories());
when(view.getSessionContext()).thenReturn(FakeSessionContext.adminInCollection(zeCollection));
when(view.navigate()).thenReturn(navigator);
smbClassifyServices = new SmbClassifyServices(zeCollection, getAppLayerFactory(), users.adminIn(zeCollection));
rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
searchServices = getModelLayerFactory().newSearchServices();
robotsService = new RobotsService(zeCollection, getAppLayerFactory());
inCollection(zeCollection).giveReadAccessTo(gandalf);
Users users = new Users().setUp(getModelLayerFactory().newUserServices());
es = new ESSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
connectorManager = es.getConnectorManager();
connectorManager.setConnectorInstanciator(new ConnectorInstanciator() {
@Override
public Connector instanciate(ConnectorInstance connectorInstance) {
return connectorSmb;
}
});
share = SDKPasswords.testSmbShare();
domain = SDKPasswords.testSmbDomain();
username = SDKPasswords.testSmbUsername();
password = SDKPasswords.testSmbPassword();
recordServices.update(users.bobIn(zeCollection).setManualTokens("rtoken1"));
recordServices.update(users.chuckNorrisIn(zeCollection).setManualTokens("rtoken1", "rtoken2"));
es.getConnectorManager().setConnectorInstanciator(new ConnectorInstanciator() {
@Override
public Connector instanciate(ConnectorInstance connectorInstance) {
return connectorSmb;
}
});
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation)
throws Throwable {
ConnectorSmbDocument connectorSmbDocument = (ConnectorSmbDocument) invocation.getArguments()[0];
String resourceName = (String) invocation.getArguments()[1];
String name = connectorSmbDocument.getTitle();
try {
File file = getTestResourceFile(name);
return getIOLayerFactory().newIOServices().newFileInputStream(file, resourceName);
} catch (RuntimeException e) {
throw new ConnectorSmbRuntimeException_CannotDownloadSmbDocument(connectorSmbDocument, e);
}
}
}).when(connectorSmb).getInputStream(any(ConnectorSmbDocument.class), anyString());
connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance()
.setTitle("zeConnector")
.setCode("zeConnector")
.setEnabled(false)
.setSeeds(asList(share)).setUsername(username).setPassword(password).setDomain(domain)
.setTraversalCode("zeTraversal"));
anotherConnectorInstance = connectorManager
.createConnector(es.newConnectorSmbInstance()
.setTitle("anotherConnector")
.setCode("anotherConnector")
.setEnabled(false)
.setSeeds(asList(share)).setUsername(username).setPassword(password).setDomain(domain)
.setTraversalCode("anotherConnectorTraversal"));
es = new ESSchemasRecordsServices(zeCollection, getAppLayerFactory());
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getSchema(Folder.DEFAULT_SCHEMA).create("aCustomRequiredMetadata").setType(MetadataValueType.STRING)
.setDefaultRequirement(
true);
types.getSchema(Document.DEFAULT_SCHEMA).create("aCustomRequiredMetadata").setType(MetadataValueType.STRING)
.setDefaultRequirement(true);
}
});
robotsSchemas = new RobotSchemaRecordServices(zeCollection, getAppLayerFactory());
notAUnitItest = false;
CriterionFactory criterionFactory = new CriterionFactory();
Criterion criterion = criterionFactory.build(
"{\"schemaType\":\"connectorSmbDocument\",\"metadataCode\":\"connectorSmbDocument_default_title\",\"metadataType\":\"STRING\",\"searchOperator\":\"EQUALS\",\"value\":\"1.txt\",\"leftParens\":false,\"rightParens\":false,\"booleanOperator\":\"AND\",\"dirty\":true,\"relativeCriteria\":{}}");
robot = robotsService.newRobot((String) null)
.setSearchCriteria(Arrays.asList(criterion))
.setSchemaFilter("connectorSmbDocument")
.setCode("robot1")
.setTitle("robot1");
recordServices.add(robot.getWrappedRecord());
sessionContext = FakeSessionContext.chuckNorrisInCollection(zeCollection);
sessionContext.setCurrentLocale(Locale.FRENCH);
when(view.getSessionContext()).thenReturn(sessionContext);
when(view.getCollection()).thenReturn(zeCollection);
when(view.getConstellioFactories()).thenReturn(getConstellioFactories());
presenter = new AddEditRobotPresenter(view);
}
@Test
public void givenARobotWithASmbDocAsCriterionWhenGetDataProviderThenOk()
throws Exception {
givenFetchedFoldersAndDocuments();
Map<String, String> params = new HashMap<>();
params.put("pageMode", AddEditRobotPresenter.EDIT);
params.put("robotId", robot.getId());
String viewPath = ParamUtils.addParams(RobotsNavigationConfiguration.ADD_EDIT_ROBOT, params);
presenter.forParams(viewPath);
List<Criterion> criteria = robot.getSearchCriteria();
assertThat(presenter.getSearchResults(criteria).size()).isEqualTo(1);
}
@Test
public void givenAdvanceSearchThenMetadataChoiceIsLimitedByUsedSchemas() throws RecordServicesException {
connectWithAdmin();
List<MetadataVO> baseMetadatas = presenter.getMetadataAllowedInCriteria();
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getSchemaType(Folder.SCHEMA_TYPE).createCustomSchema("customSchema").create("newSearchableMetadata")
.setType(MetadataValueType.STRING).setSearchable(true);
}
});
SchemasDisplayManager metadataSchemasDisplayManager = getAppLayerFactory().getMetadataSchemasDisplayManager();
metadataSchemasDisplayManager.saveMetadata(metadataSchemasDisplayManager.getMetadata(zeCollection, "folder_customSchema_newSearchableMetadata")
.withVisibleInAdvancedSearchStatus(true));
assertThat(baseMetadatas).containsAll(presenter.getMetadataAllowedInCriteria());
recordServices.add(newFolder("testFolder").changeSchemaTo("folder_customSchema"));
recordServices.update(recordServices.getDocumentById("testFolder").set(IS_DETACHED_AUTHORIZATIONS, true).set(AUTHORIZATIONS, new ArrayList<>()));
List<MetadataVO> newMetadatas = presenter.getMetadataAllowedInCriteria();
newMetadatas.removeAll(baseMetadatas);
assertThat(newMetadatas.size()).isEqualTo(1);
assertThat(newMetadatas.get(0).getCode()).isEqualTo("folder_customSchema_newSearchableMetadata");
connectWithBob();
assertThat(baseMetadatas).containsAll(presenter.getMetadataAllowedInCriteria());
}
@Test
public void givenAdvanceSearchWithTaxonomiesThenIsLimitedByPermission() throws RecordServicesException {
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
MetadataSchemaTypeBuilder justeadmin = types.createNewSchemaType("justeadmin");
justeadmin.getDefaultSchema().create("code").setType(MetadataValueType.STRING);
}
});
MetadataSchemasManager metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager();
Taxonomy hiddenInHomePage = Taxonomy.createHiddenInHomePage("justeadmin", "justeadmin", zeCollection,
"justeadmin").withUserIds(asList(records.getAdmin().getId()));
getModelLayerFactory().getTaxonomiesManager().addTaxonomy(hiddenInHomePage, metadataSchemasManager);
recordServices.add(rm.newHierarchicalValueListItem("justeadmin_default").setCode("J01").set(Schemas.TITLE, "J01"));
connectWithAdmin();
List<MetadataVO> baseMetadatas = presenter.getMetadataAllowedInCriteria();
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getDefaultSchema(Folder.SCHEMA_TYPE).create("newSearchableMetadata")
.setType(MetadataValueType.REFERENCE).defineReferencesTo(types.getDefaultSchema("justeadmin")).setSearchable(true);
}
});
SchemasDisplayManager metadataSchemasDisplayManager = getAppLayerFactory().getMetadataSchemasDisplayManager();
metadataSchemasDisplayManager.saveMetadata(metadataSchemasDisplayManager.getMetadata(zeCollection, "folder_default_newSearchableMetadata")
.withVisibleInAdvancedSearchStatus(true));
List<MetadataVO> newMetadatas = presenter.getMetadataAllowedInCriteria();
newMetadatas.removeAll(baseMetadatas);
assertThat(newMetadatas.size()).isEqualTo(1);
assertThat(newMetadatas.get(0).getCode()).isEqualTo("folder_default_newSearchableMetadata");
connectWithBob();
assertThat(baseMetadatas).containsAll(presenter.getMetadataAllowedInCriteria());
}
@Test
public void givenAdvanceSearchThenDoNotShowDisabledMetadatas() throws RecordServicesException {
connectWithAdmin();
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getDefaultSchema(Folder.SCHEMA_TYPE).get(Folder.BORROWED)
.setEnabled(false);
}
});
List<MetadataVO> baseMetadatas = presenter.getMetadataAllowedInCriteria();
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getDefaultSchema(Folder.SCHEMA_TYPE).get(Folder.BORROWED)
.setEnabled(true);
}
});
List<MetadataVO> newMetadatas = presenter.getMetadataAllowedInCriteria();
newMetadatas.removeAll(baseMetadatas);
assertThat(newMetadatas.size()).isEqualTo(1);
assertThat(newMetadatas.get(0).getCode()).isEqualTo("folder_default_" + Folder.BORROWED);
}
private void connectWithAdmin() {
sessionContext = FakeSessionContext.adminInCollection(zeCollection);
sessionContext.setCurrentLocale(Locale.FRENCH);
when(view.getSessionContext()).thenReturn(sessionContext);
presenter = spy(new AddEditRobotPresenter(view));
presenter.schemaFilterSelected(Folder.SCHEMA_TYPE);
}
private void connectWithBob() {
sessionContext = FakeSessionContext.bobInCollection(zeCollection);
sessionContext.setCurrentLocale(Locale.FRENCH);
when(view.getSessionContext()).thenReturn(sessionContext);
presenter = spy(new AddEditRobotPresenter(view));
presenter.schemaFilterSelected(Folder.SCHEMA_TYPE);
}
private Folder newFolder(String title) {
return rm.newFolderWithId("testFolder").setTitle(title).setOpenDate(LocalDate.now())
.setAdministrativeUnitEntered(records.unitId_10a)
.setCategoryEntered(records.categoryId_X110)
.setRetentionRuleEntered(records.getRule2())
.setCopyStatusEntered(CopyType.PRINCIPAL)
.set("aCustomRequiredMetadata", "test");
}
// ---------------------------------------
private void givenFetchedFoldersAndDocuments()
throws RecordServicesException {
Transaction transaction = new Transaction();
transaction.add(es.newConnectorSmbFolderWithId(folderA, connectorInstance))
.setTitle("A").setUrl("smb://A/");
transaction.add(es.newConnectorSmbFolderWithId(folderB, connectorInstance))
.setTitle("B").setUrl("smb://B/");
transaction.add(es.newConnectorSmbFolderWithId(folderAA, connectorInstance))
.setTitle("AA").setUrl("smb://A/A/").setParent(folderA);
transaction.add(es.newConnectorSmbFolderWithId(folderAAA, connectorInstance))
.setTitle("AAA").setUrl("smb://A/A/A/").setParent(folderAA);
transaction.add(es.newConnectorSmbFolderWithId(folderAAB, connectorInstance))
.setTitle("AAB").setUrl("smb://A/A/B/").setParent(folderAA);
transaction.add(es.newConnectorSmbFolderWithId(folderAB, connectorInstance))
.setTitle("AB").setUrl("smb://A/B/").setParent(folderA);
transaction.add(es.newConnectorSmbFolderWithId(folderABA, connectorInstance))
.setTitle("ABA").setUrl("smb://A/B/A/").setParent(folderAB);
// SmbFile localfile;
// try {
// localfile = new SmbFile("C:\\Users\\Patrick\\Documents\\tests\\docx.docx");
// } catch (MalformedURLException e) {
// throw new RuntimeException(e);
// }
String url = "smb://A/1.txt";
// String url = localfile.getURL().getFile();
transaction.add(es.newConnectorSmbDocumentWithId(documentA1, connectorInstance))
.setTitle("1.txt").setUrl(url).setParsedContent("Document A1 content").setParent(
folderA).setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentA2, connectorInstance))
.setTitle("2.txt").setUrl("smb://A/2.txt").setParsedContent("Document A2 content").setParent(folderA)
.setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentB3, connectorInstance))
.setTitle("3.txt").setUrl("smb://B/3.txt").setParsedContent("Document B3 content").setParent(folderB)
.setManualTokens("rtoken1");
transaction.add(es.newConnectorSmbDocumentWithId(documentB3JustDeleted, connectorInstance))
.setTitle("justDeleted.txt").setUrl("smb://B/justDeleted.txt").setParsedContent("Document B3")
.setParent(folderB)
.setManualTokens("rtoken1");
transaction.add(es.newConnectorSmbDocumentWithId(documentAA4, connectorInstance))
.setTitle("4.txt").setUrl("smb://A/A/4.txt").setParsedContent("Document AA4 content").setParent(folderAA)
.setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentAA5, connectorInstance))
.setTitle("5.txt").setUrl("smb://A/A/5.txt").setParent(folderAA).setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentAAA6, connectorInstance))
.setTitle("6.txt").setUrl("smb://A/A/A/6.txt").setParent(folderAAA).setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentAAB7, connectorInstance))
.setTitle("7.txt").setUrl("smb://A/A/B/7.txt").setParent(folderAAB).setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentAB8, connectorInstance))
.setTitle("8.txt").setUrl("smb://A/B/8.txt").setParent(folderAB).setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentABA9, connectorInstance))
.setTitle("9.txt").setUrl("smb://A/B/A/9.txt").setParent(folderABA).setManualTokens(PUBLIC_TOKEN);
recordServices.execute(transaction);
}
}