package com.constellio.app.modules.es.connectors.smb.jobmanagement;
import com.constellio.app.modules.es.connectors.smb.ConnectorSmb;
import com.constellio.app.modules.es.connectors.smb.cache.SmbConnectorContext;
import com.constellio.app.modules.es.connectors.smb.cache.SmbConnectorContextServices;
import com.constellio.app.modules.es.connectors.smb.jobmanagement.SmbJobFactoryImpl.SmbJobCategory;
import com.constellio.app.modules.es.connectors.smb.jobs.*;
import com.constellio.app.modules.es.connectors.smb.service.SmbModificationIndicator;
import com.constellio.app.modules.es.connectors.smb.service.SmbRecordService;
import com.constellio.app.modules.es.connectors.smb.service.SmbShareService;
import com.constellio.app.modules.es.connectors.smb.testutils.SmbTestParams;
import com.constellio.app.modules.es.connectors.smb.utils.ConnectorSmbUtils;
import com.constellio.app.modules.es.connectors.spi.ConnectorJob;
import com.constellio.app.modules.es.connectors.spi.ConnectorLogger;
import com.constellio.app.modules.es.connectors.spi.ConsoleConnectorLogger;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbDocument;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbFolder;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbInstance;
import com.constellio.app.modules.es.sdk.TestConnectorEventObserver;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.app.modules.es.services.crawler.DefaultConnectorEventObserver;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.sdk.tests.ConstellioTest;
import org.joda.time.LocalDateTime;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.*;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
public class SmbJobFactoryImplAcceptanceTest extends ConstellioTest {
@Mock private ConnectorSmb connector;
private ESSchemasRecordsServices es;
private ConnectorSmbInstance connectorInstance;
@Mock private SmbShareService smbService;
private ConnectorLogger logger;
private TestConnectorEventObserver eventObserver;
private ConnectorSmbUtils smbUtils;
private SmbRecordService smbRecordService;
private SmbDocumentOrFolderUpdater updater;
private SmbJobFactory jobFactory;
private SmbConnectorContext context;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
prepareSystem(withZeCollection().withConstellioESModule()
.withAllTestUsers());
es = new ESSchemasRecordsServices(zeCollection, getAppLayerFactory());
smbUtils = new ConnectorSmbUtils();
connectorInstance = es.newConnectorSmbInstance()
.setDomain(SmbTestParams.DOMAIN)
.setUsername(SmbTestParams.USERNAME)
.setPassword(SmbTestParams.PASSWORD)
.setSeeds(asList(SmbTestParams.EXISTING_SHARE))
.setCode(SmbTestParams.INSTANCE_CODE)
.setTraversalCode(SmbTestParams.TRAVERSAL_CODE)
.setInclusions(asList(SmbTestParams.EXISTING_SHARE))
.setExclusions(asList(""))
.setTitle(SmbTestParams.CONNECTOR_TITLE);
es.getConnectorManager()
.createConnector(connectorInstance);
logger = new ConsoleConnectorLogger();
when(connector.getLogger()).thenReturn(logger);
eventObserver = new TestConnectorEventObserver(es, new DefaultConnectorEventObserver(es, logger, SmbTestParams.CONNECTOR_OBSERVER));
smbRecordService = new SmbRecordService(es, connectorInstance);
updater = new SmbDocumentOrFolderUpdater(connectorInstance, smbRecordService);
SmbConnectorContextServices contextServices = new SmbConnectorContextServices(es);
context = contextServices.createContext(connectorInstance.getId());
when(connector.getContext()).thenReturn(context);
jobFactory = new SmbJobFactoryImpl(connector, connectorInstance, eventObserver, smbService, smbUtils, smbRecordService, updater);
}
@Test
public void givenAnAcceptedUrlWhenCreatingDispatchJobThenGetDispatchJob() {
ConnectorJob job = jobFactory.get(SmbJobCategory.DISPATCH, SmbTestParams.EXISTING_SHARE + SmbTestParams.EXISTING_FOLDER, "");
assertThat(job).isInstanceOf(SmbDispatchJob.class);
}
@Test
public void givenAnAcceptedNewDocumentUrlWhenCreatingRetrievalJobThenGetRetrievalJob() {
ConnectorJob job = jobFactory.get(SmbJobCategory.RETRIEVAL, SmbTestParams.EXISTING_SHARE + "newFile.txt", "");
assertThat(job).isInstanceOf(SmbNewDocumentRetrievalJob.class);
}
@Test
public void givenAnAcceptedModifiedDocumentUrlWhenCreatingRetrievalJobThenGetRetrievalJob()
throws RecordServicesException {
String url = SmbTestParams.EXISTING_SHARE + "modifiedFile.txt";
String permissionsHash = "someHash";
long size = 10;
long lastModified = System.currentTimeMillis();
SmbModificationIndicator modInfo = new SmbModificationIndicator(permissionsHash, 15D, lastModified);
ConnectorSmbDocument document = es.newConnectorSmbDocument(connectorInstance);
document.setUrl(url);
document.setPermissionsHash(permissionsHash);
document.setSize(size);
document.setLastModified(new LocalDateTime(lastModified));
when(smbService.getModificationIndicator(anyString())).thenReturn(modInfo);
es.getRecordServices()
.update(document.getWrappedRecord());
es.getRecordServices()
.flush();
ConnectorJob job = jobFactory.get(SmbJobCategory.RETRIEVAL, url, "");
assertThat(job).isInstanceOf(SmbNewDocumentRetrievalJob.class);
}
@Test
public void givenAnAcceptedNonModifiedDocumentUrlWhenCreatingRetrievalJobThenGetRetrievalJob()
throws RecordServicesException {
ConnectorSmbFolder folder = es.newConnectorSmbFolder(connectorInstance);
folder.setUrl(SmbTestParams.EXISTING_SHARE);
es.getRecordServices()
.update(folder.getWrappedRecord());
es.getRecordServices()
.flush();
String url = SmbTestParams.EXISTING_SHARE + "nonModifiedFile.txt";
String permissionsHash = "someHash";
long size = 10;
long lastModified = System.currentTimeMillis();
SmbModificationIndicator modInfo = new SmbModificationIndicator(permissionsHash, 10, lastModified);
modInfo.setParentId(folder.getId());
ConnectorSmbDocument document = es.newConnectorSmbDocument(connectorInstance);
document.setUrl(url);
document.setPermissionsHash(permissionsHash);
document.setSize(size);
document.setLastModified(new LocalDateTime(lastModified));
document.setParent(folder.getId());
when(smbService.getModificationIndicator(anyString())).thenReturn(modInfo);
es.getRecordServices()
.update(document.getWrappedRecord());
es.getRecordServices()
.flush();
context.traverseModified(url, modInfo, folder.getUrl(), null);
ConnectorJob job = jobFactory.get(SmbJobCategory.RETRIEVAL, url, folder.getUrl());
assertThat(job).isInstanceOf(SmbUnmodifiedRetrievalJob.class);
}
@Test
public void givenNonModifiedDocumentWithoutParentWhenCreatingRetrievalJobThenGetRetrievalJob()
throws RecordServicesException {
String url = SmbTestParams.EXISTING_SHARE + "nonModifiedFile.txt";
String permissionsHash = "someHash";
long size = 10;
long lastModified = System.currentTimeMillis();
SmbModificationIndicator modInfo = new SmbModificationIndicator("someHash", 10D, System.currentTimeMillis());
ConnectorSmbDocument document = es.newConnectorSmbDocument(connectorInstance);
document.setUrl(url);
document.setPermissionsHash(permissionsHash);
document.setSize(size);
document.setLastModified(new LocalDateTime(lastModified));
when(smbService.getModificationIndicator(anyString())).thenReturn(modInfo);
es.getRecordServices()
.update(document.getWrappedRecord());
es.getRecordServices()
.flush();
ConnectorJob job = jobFactory.get(SmbJobCategory.RETRIEVAL, url, "");
assertThat(job).isInstanceOf(SmbNewDocumentRetrievalJob.class);
}
@Test
public void givenAnAcceptedFolderUrlWhenCreatingRetrievalJobThenGetRetrievalJob() {
ConnectorJob job = jobFactory.get(SmbJobCategory.RETRIEVAL, SmbTestParams.EXISTING_SHARE + SmbTestParams.EXISTING_FOLDER, "");
assertThat(job).isInstanceOf(SmbNewFolderRetrievalJob.class);
}
@Test
public void givenAnAcceptedUrlWhenCreatingDeleteJobThenGetDeleteJob() {
ConnectorJob job = jobFactory.get(SmbJobCategory.DELETE, SmbTestParams.EXISTING_SHARE + SmbTestParams.EXISTING_FOLDER, "");
assertThat(job).isInstanceOf(SmbDeleteJob.class);
}
@Test
public void givenANonAcceptedUrlWhenCreatingDispatchJobThenGetDispatchJob() {
ConnectorJob job = jobFactory.get(SmbJobCategory.DISPATCH, SmbTestParams.DIFFERENT_SHARE + SmbTestParams.EXISTING_FOLDER, "");
assertThat(job).isInstanceOf(SmbDeleteJob.class);
}
@Test
public void givenANonAcceptedUrlWhenCreatingRetrievalJobThenGetDeleteJob() {
ConnectorJob job = jobFactory.get(SmbJobCategory.RETRIEVAL, SmbTestParams.DIFFERENT_SHARE + SmbTestParams.EXISTING_FILE, "");
assertThat(job).isInstanceOf(SmbDeleteJob.class);
}
@Test
public void givenANonAcceptedUrlWhenCreatingDeleteJobThenGetDeleteJob() {
ConnectorJob job = jobFactory.get(SmbJobCategory.DELETE, SmbTestParams.DIFFERENT_SHARE + SmbTestParams.EXISTING_FILE, "");
assertThat(job).isInstanceOf(SmbDeleteJob.class);
}
@Test
public void givenFactoryResetWhenGettingJobForGivenUrlThenGetJobForGivenUrl() {
ConnectorJob job = jobFactory.get(SmbJobCategory.RETRIEVAL, SmbTestParams.EXISTING_SHARE + SmbTestParams.EXISTING_FILE, "");
assertThat(job).isNotNull()
.isNotInstanceOf(SmbNullJob.class);
ConnectorJob job2 = jobFactory.get(SmbJobCategory.RETRIEVAL, SmbTestParams.EXISTING_SHARE + SmbTestParams.EXISTING_FILE, "");
assertThat(job2).isNotInstanceOf(SmbNullJob.class);
assertThat(job2).isInstanceOf(SmbNewDocumentRetrievalJob.class);
}
@Test
public void givenAnAcceptedUrlWhenCreatingSeedJobThenGetSeedJob() {
ConnectorJob job = jobFactory.get(SmbJobCategory.SEED, SmbTestParams.EXISTING_SHARE, "");
assertThat(job).isInstanceOf(SmbSeedJob.class);
}
@After
public void after() {
eventObserver.close();
}
}