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.cache.SmbConnectorContextServices;
import com.constellio.app.modules.es.connectors.smb.service.SmbFileDTO;
import com.constellio.app.modules.es.connectors.smb.service.SmbFileDTO.SmbFileDTOStatus;
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.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.model.services.search.query.logical.LogicalSearchQueryOperators;
import com.constellio.sdk.tests.ConstellioTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.List;
import static com.constellio.app.modules.es.sdk.ESTestUtils.assertThatEventsObservedBy;
import static com.constellio.app.modules.es.sdk.TestConnectorEvent.deleteEvent;
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.when;
public class SmbDeleteJobAcceptanceTest extends ConstellioTest {
@Mock private ConnectorSmb connector;
private ESSchemasRecordsServices es;
private ConnectorSmbInstance connectorInstance;
private ConnectorLogger logger;
private TestConnectorEventObserver eventObserver;
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;
@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);
SmbConnectorContextServices contextServices = new SmbConnectorContextServices(es);
context = contextServices.createContext(connectorInstance.getId());
when(connector.getContext()).thenReturn(context);
eventObserver = new TestConnectorEventObserver(es, new DefaultConnectorEventObserver(es, logger, SmbTestParams.CONNECTOR_OBSERVER));
smbRecordService = new SmbRecordService(es, connectorInstance);
}
@Test
public void givenNoRecordWhenExecutingDeleteJobThenDoNothing()
throws RecordServicesException {
SmbFileDTO smbFileDTO = new SmbFileDTO();
smbFileDTO.setStatus(SmbFileDTOStatus.DELETE_DTO);
SmbShareService smbService = new FakeSmbService(smbFileDTO);
JobParams jobParams = new JobParams(connector, eventObserver,smbUtils, connectorInstance, smbService,smbRecordService, null, null, FILE_URL, null);
SmbDeleteJob deleteJob = new SmbDeleteJob(jobParams);
deleteJob.execute(connector);
assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbDocument.url())
.isEmpty();
}
@Test
public void givenExistingFileRecordWhenExecutingDeleteJobThenDeleteRecord()
throws RecordServicesException {
ConnectorSmbDocument connectorSmbDocument = es.newConnectorSmbDocument(connectorInstance)
.setUrl(FILE_URL)
.setConnector(connectorInstance)
.setTraversalCode(SmbTestParams.TRAVERSAL_CODE)
.setFetched(true);
es.getRecordServices()
.add(connectorSmbDocument);
SmbFileDTO smbFileDTO = new SmbFileDTO();
smbFileDTO.setStatus(SmbFileDTOStatus.DELETE_DTO);
SmbShareService smbService = new FakeSmbService(smbFileDTO);
JobParams jobParams = new JobParams(connector, eventObserver,smbUtils, connectorInstance, smbService,smbRecordService, null, null, FILE_URL, null);
SmbDeleteJob deleteJob = new SmbDeleteJob(jobParams);
deleteJob.execute(connector);
assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbDocument.url())
.containsOnly(deleteEvent(es.newConnectorSmbDocument(connectorInstance)
.setUrl(FILE_URL)));
}
@Test
public void givenExistingFolderRecordWithContentWhenExecutingDeleteJobThenDeleteRecordAndChildren()
throws RecordServicesException {
ConnectorSmbFolder connectorSmbFolder = es.newConnectorSmbFolder(connectorInstance)
.setUrl(FOLDER_URL)
.setConnector(connectorInstance)
.setTraversalCode(SmbTestParams.TRAVERSAL_CODE)
.setFetched(true);
es.getRecordServices()
.add(connectorSmbFolder);
ConnectorSmbDocument connectorSmbDocument = es.newConnectorSmbDocument(connectorInstance)
.setUrl(FILE_URL)
.setConnector(connectorInstance)
.setTraversalCode(SmbTestParams.TRAVERSAL_CODE)
.setFetched(true)
.setParent(connectorSmbFolder.getId());
es.getRecordServices()
.add(connectorSmbDocument);
SmbFileDTO smbFileDTO = new SmbFileDTO();
smbFileDTO.setStatus(SmbFileDTOStatus.DELETE_DTO);
SmbShareService smbService = new FakeSmbService(smbFileDTO);
JobParams jobParams = new JobParams(connector, eventObserver,smbUtils, connectorInstance, smbService,smbRecordService, null, null, FILE_URL, null);
SmbDeleteJob deleteJob = new SmbDeleteJob(jobParams);
deleteJob.execute(connector);
List<ConnectorSmbDocument> documents = es.searchConnectorSmbDocuments(LogicalSearchQueryOperators.from(es.connectorSmbDocument.schema())
.where(es.connectorSmbDocument.url())
.isEqualTo(FILE_URL));
assertThat(documents).isEmpty();
}
@Test
public void givenRejectedUrlWhenDeletingThenDeleteRecord()
throws RecordServicesException {
when(smbUtils.isAccepted(anyString(), any(ConnectorSmbInstance.class))).thenReturn(false);
ConnectorSmbDocument connectorSmbDocument = es.newConnectorSmbDocument(connectorInstance)
.setUrl(FILE_URL)
.setConnector(connectorInstance)
.setTraversalCode(SmbTestParams.TRAVERSAL_CODE)
.setFetched(true);
es.getRecordServices()
.add(connectorSmbDocument);
es.getRecordServices().flush();
SmbFileDTO smbFileDTO = new SmbFileDTO();
smbFileDTO.setStatus(SmbFileDTOStatus.FULL_DTO);
SmbShareService smbService = new FakeSmbService(smbFileDTO);
JobParams jobParams = new JobParams(connector, eventObserver,smbUtils, connectorInstance, smbService,smbRecordService, null, null, FILE_URL, null);
SmbDeleteJob deleteJob = new SmbDeleteJob(jobParams);
deleteJob.execute(connector);
assertThatEventsObservedBy(eventObserver).comparingRecordsUsing(es.connectorSmbDocument.url())
.containsOnly(deleteEvent(es.newConnectorSmbDocument(connectorInstance)
.setUrl(FILE_URL)));
}
@After
public void after() {
eventObserver.close();
}
}