package com.constellio.app.modules.es.connectors.smb.jobs; 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.jobmanagement.SmbConnectorJob; import com.constellio.app.modules.es.connectors.smb.jobmanagement.SmbDocumentOrFolderUpdater; import com.constellio.app.modules.es.connectors.smb.jobmanagement.SmbJobFactory; import com.constellio.app.modules.es.connectors.smb.jobmanagement.SmbJobFactoryImpl.SmbJobCategory; 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.FakeSmbService; 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.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.sdk.tests.ConstellioTest; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.*; import static com.constellio.app.modules.es.sdk.ESTestUtils.assertThatEventsObservedBy; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; public class SmbDispatchJobAcceptanceTest extends ConstellioTest { @Mock private ConnectorSmb connector; private ConnectorSmbInstance connectorInstance; private ESSchemasRecordsServices es; private SmbShareService smbService; private SmbJobFactory jobFactory; private ConnectorLogger logger; private TestConnectorEventObserver eventObserver; private SmbDocumentOrFolderUpdater updater; private SmbRecordService smbRecordService; @Mock private ConnectorSmbUtils smbUtils; @Mock private SmbConnectorContext context; private String SHARE_URL = SmbTestParams.EXISTING_SHARE; private String FILE_URL = SHARE_URL + SmbTestParams.FILE_NAME; private String FOLDER_URL = SHARE_URL + SmbTestParams.FOLDER_NAME; private String FILE1_URL = FOLDER_URL + "file1.txt"; private String FOLDER2_URL = FOLDER_URL + "folder2/"; @Before public void setup() { MockitoAnnotations.initMocks(this); prepareSystem(withZeCollection().withConstellioESModule() .withAllTestUsers()); es = new ESSchemasRecordsServices(zeCollection, getAppLayerFactory()); 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); } @Test public void givenNullJobInsteadOfRetrievalJobWhenExecutingDispatchThenDoNothing() { JobParams jobParams = spy(new JobParams(connector, eventObserver, smbUtils, connectorInstance, smbService,smbRecordService, updater, null, FILE_URL, SHARE_URL)); SmbNullJob nullJob = new SmbNullJob(jobParams); when(jobParams.getJobFactory()).thenReturn(new FakeSmbJobFactory(nullJob)); SmbDispatchJob dispatchJob = new SmbDispatchJob(jobParams); dispatchJob.execute(connector); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbFolder.url()) .isEmpty(); } @Test public void givenDeleteJobInsteadOfRetrievalJobWhenExecutingDispatchThenQueueDeleteJob() { JobParams jobParams = spy(new JobParams(connector, eventObserver, smbUtils, connectorInstance, smbService,smbRecordService, updater, null, FILE_URL, SHARE_URL)); SmbDeleteJob deleteJob = new SmbDeleteJob(jobParams); when(jobParams.getJobFactory()).thenReturn(new FakeSmbJobFactory(deleteJob)); ArgumentCaptor<SmbConnectorJob> argumentCaptor = ArgumentCaptor.forClass(SmbConnectorJob.class); SmbDispatchJob dispatchJob = new SmbDispatchJob(jobParams); dispatchJob.execute(connector); verify(connector, times(1)).queueJob(argumentCaptor.capture()); assertThat(argumentCaptor.getAllValues()).containsOnly(deleteJob); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbFolder.url()) .isEmpty(); } @Test public void givenRetrievalJobAndUrlIsFileWhenExecutingDispatchThenQueueRetrievalJob() { JobParams jobParams = spy(new JobParams(connector, eventObserver, smbUtils, connectorInstance, smbService,smbRecordService, updater, null, FILE_URL, SHARE_URL)); SmbNewDocumentRetrievalJob retrievalJob = new SmbNewDocumentRetrievalJob(jobParams); when(jobParams.getJobFactory()).thenReturn(new FakeSmbJobFactory(retrievalJob)); ArgumentCaptor<SmbConnectorJob> argumentCaptor = ArgumentCaptor.forClass(SmbConnectorJob.class); SmbDispatchJob dispatchJob = new SmbDispatchJob(jobParams); dispatchJob.execute(connector); verify(connector, times(1)).queueJob(argumentCaptor.capture()); assertThat(argumentCaptor.getAllValues()).containsOnly(retrievalJob); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbDocument.url()) .isEmpty(); } @Test public void givenRetrievalJobAndUrlIsShareWithContentWhenExecutingDispatchThenQueueRetrievalJobsAndDispatchJobs() { smbService = new FakeSmbService(Arrays.asList(FOLDER_URL, FILE_URL)); JobParams jobParams = spy(new JobParams(connector, eventObserver, smbUtils, connectorInstance, smbService, smbRecordService, null, null, SHARE_URL, null)); when(jobParams.getUrl()).thenReturn(SHARE_URL, FOLDER_URL, FILE_URL, FILE1_URL); SmbNewFolderRetrievalJob shareRetrievalJob = new SmbNewFolderRetrievalJob(jobParams); SmbNewDocumentRetrievalJob fileRetrievalJob = new SmbNewDocumentRetrievalJob(jobParams); SmbNewFolderRetrievalJob folderRetrievalJob = new SmbNewFolderRetrievalJob(jobParams); when(jobParams.getJobFactory()).thenReturn(new FakeSmbJobFactory(Arrays.asList(shareRetrievalJob, fileRetrievalJob, folderRetrievalJob))); when(smbUtils.isFolder(SHARE_URL)).thenReturn(true); ArgumentCaptor<SmbConnectorJob> argumentCaptor = ArgumentCaptor.forClass(SmbConnectorJob.class); SmbDispatchJob dispatchJob = new SmbDispatchJob(jobParams); dispatchJob.execute(connector); verify(connector, times(3)).queueJob(argumentCaptor.capture()); List<SmbConnectorJob> jobs = argumentCaptor.getAllValues(); assertThat(jobs).containsOnly(shareRetrievalJob, fileRetrievalJob, folderRetrievalJob); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbFolder.url()) .isEmpty(); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbDocument.url()) .isEmpty(); } @Test public void givenRetrievalJobAndUrlIsShareWithoutContentWhenExecutingDispatchThenQueueRetrievalJob() { smbService = new FakeSmbService(new ArrayList<String>()); JobParams jobParams = spy(new JobParams(connector, eventObserver,smbUtils, connectorInstance, smbService,smbRecordService, null, null, null, null)); SmbNewFolderRetrievalJob shareRetrievalJob = new SmbNewFolderRetrievalJob(jobParams); when(jobParams.getJobFactory()).thenReturn(new FakeSmbJobFactory(shareRetrievalJob)); ArgumentCaptor<SmbConnectorJob> argumentCaptor = ArgumentCaptor.forClass(SmbConnectorJob.class); SmbDispatchJob dispatchJob = new SmbDispatchJob(jobParams); dispatchJob.execute(connector); verify(connector, times(1)).queueJob(argumentCaptor.capture()); assertThat(argumentCaptor.getAllValues()).containsOnly(shareRetrievalJob); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbFolder.url()) .isEmpty(); } @Test public void givenRetrievalJobAndUrlIsFolderWithContentWhenExecutingDispatchThenQueueRetrievalJobsAndDispatchJobs() { smbService = new FakeSmbService(Arrays.asList(FILE1_URL, FOLDER2_URL)); JobParams jobParams = spy(new JobParams(connector, eventObserver,smbUtils, connectorInstance, smbService,smbRecordService, null, null, null, null)); when(jobParams.getUrl()).thenReturn(FOLDER_URL, FILE1_URL, FOLDER2_URL); SmbNewFolderRetrievalJob shareRetrievalJob = new SmbNewFolderRetrievalJob(jobParams); SmbNewDocumentRetrievalJob fileRetrievalJob = new SmbNewDocumentRetrievalJob(jobParams); SmbNewFolderRetrievalJob folderRetrievalJob = new SmbNewFolderRetrievalJob(jobParams); jobFactory = new FakeSmbJobFactory(Arrays.asList(shareRetrievalJob, fileRetrievalJob, folderRetrievalJob)); when(jobParams.getJobFactory()).thenReturn(new FakeSmbJobFactory(Arrays.asList(shareRetrievalJob, fileRetrievalJob, folderRetrievalJob))); ArgumentCaptor<SmbConnectorJob> argumentCaptor = ArgumentCaptor.forClass(SmbConnectorJob.class); when(smbUtils.isFolder(FOLDER_URL)).thenReturn(true); SmbDispatchJob dispatchJob = new SmbDispatchJob(jobParams); dispatchJob.execute(connector); verify(connector, times(3)).queueJob(argumentCaptor.capture()); List<SmbConnectorJob> jobs = argumentCaptor.getAllValues(); assertThat(jobs).contains(shareRetrievalJob, fileRetrievalJob, folderRetrievalJob); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbFolder.url()) .isEmpty(); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbDocument.url()) .isEmpty(); } @Test public void givenRetrievalJobAndUrlIsFolderWithoutContentWhenExecutingDispatchThenQueueRetrievalJob() { JobParams jobParams = spy(new JobParams(connector, eventObserver,smbUtils, connectorInstance, smbService,smbRecordService, null, null, FILE_URL, null)); SmbNewFolderRetrievalJob retrievalJob = new SmbNewFolderRetrievalJob(jobParams); when(jobParams.getSmbShareService()).thenReturn(new FakeSmbService(new ArrayList<String>())); when(jobParams.getJobFactory()).thenReturn(new FakeSmbJobFactory(retrievalJob)); ArgumentCaptor<SmbConnectorJob> argumentCaptor = ArgumentCaptor.forClass(SmbConnectorJob.class); SmbDispatchJob dispatchJob = new SmbDispatchJob(jobParams); dispatchJob.execute(connector); verify(connector, times(1)).queueJob(argumentCaptor.capture()); assertThat(argumentCaptor.getAllValues()).containsOnly(retrievalJob); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbFolder.url()) .isEmpty(); } @Test public void givenResumeIgnoreJobInsteadOfRetrievalJobWhenExecutingDispatchThenDoNothing() { JobParams jobParams = spy(new JobParams(connector, eventObserver,smbUtils, connectorInstance, smbService,smbRecordService, null, null, FILE_URL, null)); SmbUnmodifiedRetrievalJob retrievalJob = new SmbUnmodifiedRetrievalJob(jobParams); SmbJobFactory factory = spy(new FakeSmbJobFactory(retrievalJob)); when(jobParams.getJobFactory()).thenReturn(factory); when(jobParams.getSmbShareService()).thenReturn(new FakeSmbService(new ArrayList<String>())); SmbDispatchJob dispatchJob = new SmbDispatchJob(jobParams); dispatchJob.execute(connector); assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbFolder.url()) .isEmpty(); assertThat(connectorInstance.getResumeUrl()).isNull(); verify(connector, times(1)).queueJob(retrievalJob); } @After public void after() { eventObserver.close(); } private class FakeSmbJobFactory implements SmbJobFactory { private Deque<SmbConnectorJob> jobs = new ArrayDeque<>(); public FakeSmbJobFactory(SmbConnectorJob job) { this.jobs.add(job); } public FakeSmbJobFactory(List<? extends SmbConnectorJob> jobs) { this.jobs.addAll(jobs); } @Override public SmbConnectorJob get(SmbJobCategory jobType, String url, String parentUrl) { return jobs.poll(); } } }