package com.constellio.app.modules.es.connectors.smb.queue;
import com.constellio.app.modules.es.connectors.smb.jobmanagement.SmbJobFactoryImpl.SmbJobType;
import com.constellio.app.modules.es.connectors.smb.jobs.SmbDispatchJob;
import com.constellio.app.modules.es.connectors.smb.jobs.SmbNewDocumentRetrievalJob;
import com.constellio.app.modules.es.connectors.smb.jobs.SmbNewFolderRetrievalJob;
import com.constellio.app.modules.es.connectors.smb.jobs.SmbUnmodifiedRetrievalJob;
import com.constellio.sdk.tests.ConstellioTest;
import org.junit.Test;
import org.mockito.Mockito;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
public class SmbJobQueueSortedImplAcceptanceTest extends ConstellioTest {
// First traversal
//
// smb://ip/share/
// smb://ip/share/file.txt
// smb://ip/share/file3.txt
// smb://ip/share/folder/
// smb://ip/share/folder/another_file.txt
//
// Changes after first traversal and before second traversal
//
// smb://ip/share/file4.txt <--- New file (parent share)
// smb://ip/share/file3.txt <--- Modified file (parent share)
// smb://ip/share/file.txt <--- Non modified file (parent share)
//
// smb://ip/share/folder2/ <--- New folder (parent share)
// smb://ip/share/folder2/file5.txt <--- New file (parent folder2)
@Test
public void givenFirstTraversalWhenGettingJobsThenGetJobsInExpectedOrder() {
SmbJobQueue jobQueue = new SmbJobQueueSortedImpl();
SmbNewFolderRetrievalJob shareRetrievalJob = Mockito.mock(SmbNewFolderRetrievalJob.class);
when(shareRetrievalJob.getUrl()).thenReturn("smb://ip/share/");
when(shareRetrievalJob.getType()).thenReturn(SmbJobType.NEW_FOLDER_JOB);
SmbNewDocumentRetrievalJob file3RetrievalJob = Mockito.mock(SmbNewDocumentRetrievalJob.class);
when(file3RetrievalJob.getUrl()).thenReturn("smb://ip/share/file3.txt");
when(file3RetrievalJob.getType()).thenReturn(SmbJobType.NEW_DOCUMENT_JOB);
SmbNewDocumentRetrievalJob fileRetrievalJob = Mockito.mock(SmbNewDocumentRetrievalJob.class);
when(fileRetrievalJob.getUrl()).thenReturn("smb://ip/share/file.txt");
when(fileRetrievalJob.getType()).thenReturn(SmbJobType.NEW_DOCUMENT_JOB);
SmbDispatchJob folder2DispatchJob = Mockito.mock(SmbDispatchJob.class);
when(folder2DispatchJob.getUrl()).thenReturn("smb://ip/share/folder/");
when(folder2DispatchJob.getType()).thenReturn(SmbJobType.DISPATCH_JOB);
// Add jobs in any (wrong) order
jobQueue.add(folder2DispatchJob);
jobQueue.add(fileRetrievalJob);
jobQueue.add(file3RetrievalJob);
jobQueue.add(shareRetrievalJob);
// Get jobs in the expected order
assertThat(jobQueue.poll()).isEqualTo(shareRetrievalJob);
assertThat(jobQueue.poll()).isEqualTo(fileRetrievalJob);
assertThat(jobQueue.poll()).isEqualTo(file3RetrievalJob);
assertThat(jobQueue.poll()).isEqualTo(folder2DispatchJob);
}
@Test
public void givenSecondTraversalWithChangesWhenGettingJobsThenGetJobsInExpectedOrder() {
SmbJobQueue jobQueue = new SmbJobQueueSortedImpl();
SmbNewDocumentRetrievalJob file4RetrievalJob = Mockito.mock(SmbNewDocumentRetrievalJob.class);
when(file4RetrievalJob.getUrl()).thenReturn("smb://ip/share/file4.txt");
when(file4RetrievalJob.getType()).thenReturn(SmbJobType.NEW_DOCUMENT_JOB);
SmbUnmodifiedRetrievalJob fileRetrievalJob = Mockito.mock(SmbUnmodifiedRetrievalJob.class);
when(fileRetrievalJob.getUrl()).thenReturn("smb://ip/share/file.txt");
when(fileRetrievalJob.getType()).thenReturn(SmbJobType.UNMODIFIED_JOB);
SmbDispatchJob folder2DispatchJob = Mockito.mock(SmbDispatchJob.class);
when(folder2DispatchJob.getUrl()).thenReturn("smb://ip/share/folder2/");
when(folder2DispatchJob.getType()).thenReturn(SmbJobType.DISPATCH_JOB);
// Add jobs in any (wrong) order
jobQueue.add(folder2DispatchJob);
jobQueue.add(fileRetrievalJob);
jobQueue.add(file4RetrievalJob);
// Get jobs in the expected order
assertThat(jobQueue.poll()).isEqualTo(fileRetrievalJob);
assertThat(jobQueue.poll()).isEqualTo(file4RetrievalJob);
assertThat(jobQueue.poll()).isEqualTo(folder2DispatchJob);
}
}