package com.constellio.app.modules.es.connectors.smb;
import static com.constellio.app.modules.es.constants.ESTaxonomies.SMB_FOLDERS;
import static com.constellio.model.entities.records.Record.PUBLIC_TOKEN;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import org.assertj.core.api.ListAssert;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.modules.es.model.connectors.ConnectorDocument;
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.model.connectors.smb.ConnectorSmbFolder;
import com.constellio.app.modules.es.services.ConnectorManager;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.taxonomies.TaxonomiesSearchOptions;
import com.constellio.model.services.taxonomies.TaxonomiesSearchServices;
import com.constellio.sdk.SDKPasswords;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.annotations.InDevelopmentTest;
import com.constellio.sdk.tests.annotations.UiTest;
import com.constellio.sdk.tests.setups.Users;
@UiTest
public class StartApplicationWithSmbRecords2AcceptanceTest extends ConstellioTest {
private Users users = new Users();
private ConnectorInstance<?> connectorInstance;
private ConnectorInstance<?> anotherConnectorInstance;
private ConnectorManager connectorManager;
private RecordServices recordServices;
private ESSchemasRecordsServices es;
private String share, domain, username, password;
private String folderA = "folderA";
private String folderB = "folderB";
private String folderAA = "folderAA";
private String folderAB = "folderAB";
private String documentA1 = "documentA1";
private String documentA2 = "documentA2";
private String documentB3 = "documentB3";
private String documentAA4 = "documentAA4";
private String documentAA5 = "documentAA5";
private String fetchedFolderFromAnotherConnector = "fetchedFolderFromAnotherConnector";
private String fetchedFolderOfPreviousTraversalFromAnotherConnector = "fetchedFolderOfPreviousTraversalFromAnotherConnector";
private String unfetchedFolderFromAnotherConnector = "unfetchedFolderFromAnotherConnector";
private String fetchedFolder = "fetchedFolder";
private String fetchedFolderOfPreviousTraversal = "fetchedFolderOfPreviousTraversal";
private String unfetchedFolder = "unfetchedFolder";
private String fetchedDocument = "fetchedDocument";
private String fetchedDocumentOfPreviousTraversal = "fetchedDocumentOfPreviousTraversal";
private String unfetchedDocument = "unfetchedDocument";
private TaxonomiesSearchOptions defaultOptions = new TaxonomiesSearchOptions();
private User userWithoutTokens;
private User userWithToken1;
private User userWithToken1And2;
private User userWithCollectionReadAccess;
@Before
public void setUp()
throws Exception {
prepareSystem(withZeCollection().withConstellioESModule().withAllTestUsers());
inCollection(zeCollection).giveReadAccessTo(gandalf);
Users users = new Users().setUp(getModelLayerFactory().newUserServices());
es = new ESSchemasRecordsServices(zeCollection, getAppLayerFactory());
recordServices = getModelLayerFactory().newRecordServices();
connectorManager = es.getConnectorManager();
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"));
userWithoutTokens = users.sasquatchIn(zeCollection);
userWithCollectionReadAccess = users.gandalfIn(zeCollection);
userWithToken1 = users.bobIn(zeCollection);
userWithToken1And2 = users.chuckNorrisIn(zeCollection);
connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance().setCode("zeConnector").setEnabled(false)
.setSeeds(asList(share)).setUsername(username).setPassword(password).setDomain(domain)
.setTitle("ze connector").setTraversalCode("zeTraversal"));
anotherConnectorInstance = connectorManager
.createConnector(es.newConnectorSmbInstance().setCode("anotherConnector").setEnabled(false)
.setSeeds(asList(share)).setUsername(username).setPassword(password).setDomain(domain)
.setTitle("another connector").setTraversalCode("anotherConnectorTraversal"));
}
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(folderAB, connectorInstance))
.setTitle("AB").setUrl("smb://A/B/");
transaction.add(es.newConnectorSmbDocumentWithId(documentA1, connectorInstance))
.setTitle("1.txt").setUrl("smb://A/1.txt").setParent(folderA).setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentA2, connectorInstance))
.setTitle("2.txt").setUrl("smb://A/2.txt").setParent(folderA).setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentB3, connectorInstance))
.setTitle("3.txt").setUrl("smb://B/3.txt").setParent(folderB).setManualTokens("rtoken1");
transaction.add(es.newConnectorSmbDocumentWithId(documentAA4, connectorInstance))
.setTitle("4.txt").setUrl("smb://A/A/4.txt").setParent(folderAA).setManualTokens(PUBLIC_TOKEN);
transaction.add(es.newConnectorSmbDocumentWithId(documentAA5, connectorInstance))
.setTitle("5.txt").setUrl("smb://A/A/5.txt").setParent(folderAA).setManualTokens("rtoken2");
recordServices.execute(transaction);
}
@Test
@InDevelopmentTest
public void givenFetchedAndUnfetchedRecordsOfDifferentConnectorsAndTraversalThenReturnUnfetchedBeforeFetchedOfPreviousTraversals()
throws Exception {
recordServices.update(connectorInstance.setTraversalCode("current"));
Transaction transaction = new Transaction();
LocalDateTime shishOClock = new LocalDateTime();
transaction.add(es.newConnectorSmbFolderWithId(fetchedFolderFromAnotherConnector, anotherConnectorInstance))
.setTitle("A").setUrl("smb://A/").setFetched(true).setTraversalCode("current");
transaction.add(es.newConnectorSmbFolderWithId(fetchedFolderOfPreviousTraversalFromAnotherConnector,
anotherConnectorInstance))
.setTitle("B").setUrl("smb://B/").setFetched(true).setTraversalCode("previous");
transaction.add(es.newConnectorSmbFolderWithId(unfetchedFolderFromAnotherConnector, anotherConnectorInstance))
.setTitle("AA").setUrl("smb://A/A/").setFetched(false);
transaction.add(es.newConnectorSmbFolderWithId(fetchedFolder, connectorInstance))
.setTitle("A").setUrl("smb://A/").setFetched(true).setTraversalCode("current")
.setModifiedOn(shishOClock.plusSeconds(1));
transaction.add(es.newConnectorSmbFolderWithId(fetchedFolderOfPreviousTraversal, connectorInstance))
.setTitle("B").setUrl("smb://B/").setFetched(true).setTraversalCode("previous")
.setModifiedOn(shishOClock.plusSeconds(2));
transaction.add(es.newConnectorSmbFolderWithId(unfetchedFolder, connectorInstance))
.setTitle("AA").setUrl("smb://A/A/").setFetched(false)
.setModifiedOn(shishOClock.plusSeconds(6));
transaction.add(es.newConnectorSmbDocumentWithId(fetchedDocument, connectorInstance))
.setTitle("1.txt").setUrl("smb://A/1.txt").setParent(fetchedFolder).setFetched(true).setTraversalCode("current")
.setModifiedOn(shishOClock.plusSeconds(3));
transaction.add(es.newConnectorSmbDocumentWithId(fetchedDocumentOfPreviousTraversal, connectorInstance))
.setTitle("2.txt").setUrl("smb://A/2.txt").setParent(fetchedFolder).setFetched(true).setTraversalCode("previous")
.setModifiedOn(shishOClock.plusSeconds(4));
transaction.add(es.newConnectorSmbDocumentWithId(unfetchedDocument, connectorInstance))
.setTitle("3.txt").setUrl("smb://B/3.txt").setParent(fetchedFolder).setFetched(false)
.setModifiedOn(shishOClock.plusSeconds(5));
recordServices.execute(transaction);
List<ConnectorDocument<?>> documents = es.searchConnectorDocuments(es.connectorDocumentsToFetchQuery(connectorInstance));
assertThat(documents).extracting("id").isEqualTo(asList(
unfetchedDocument,
unfetchedFolder,
fetchedFolderOfPreviousTraversal,
fetchedDocumentOfPreviousTraversal
));
assertThat(documents).extractingResultOf("getClass").isEqualTo(asList(
ConnectorSmbDocument.class,
ConnectorSmbFolder.class,
ConnectorSmbFolder.class,
ConnectorSmbDocument.class
));
newWebDriver(loggedAsUserInCollection(admin, zeCollection));
waitUntilICloseTheBrowsers();
}
// @Test
// @InDevelopmentTest
// public void givenFolderAndDocumentsThenAllAppearsInTaxonomyForAUserWithCollectionReadAccess()
// throws Exception {
//
// givenFetchedFoldersAndDocuments();
//
// assertThatVisibleRootRecordsFor(userWithCollectionReadAccess).containsOnly(folderA, folderB);
// assertThatVisibleChildRecordsFor(userWithCollectionReadAccess).in(folderA)
// .containsOnly(folderAA, documentA1, documentA2);
// assertThatVisibleChildRecordsFor(userWithCollectionReadAccess).in(folderB).containsOnly(documentB3);
// assertThatVisibleChildRecordsFor(userWithCollectionReadAccess).in(folderAA).containsOnly(documentAA4, documentAA5);
// assertThatVisibleChildRecordsFor(userWithCollectionReadAccess).in(folderAB).isEmpty();
//
// newWebDriver();
// waitUntilICloseTheBrowsers();
// }
@Test
@InDevelopmentTest
public void givenFolderAndDocumentsThenPublicOnesAppearsInTaxonomyForAUserWithoutTokensAndWithoutReadAccess()
throws Exception {
givenFetchedFoldersAndDocuments();
assertThatVisibleRootRecordsFor(userWithoutTokens).containsOnly(folderA);
assertThatVisibleChildRecordsFor(userWithoutTokens).in(folderA).containsOnly(folderAA, documentA1, documentA2);
assertThatVisibleChildRecordsFor(userWithoutTokens).in(folderB).isEmpty();
assertThatVisibleChildRecordsFor(userWithoutTokens).in(folderAA).containsOnly(documentAA4);
assertThatVisibleChildRecordsFor(userWithoutTokens).in(folderAB).isEmpty();
}
@Test
public void givenFolderAndDocumentsThenSecuredOnesAppearsInTaxonomyForAUserWithTokensAndWithoutReadAccess()
throws Exception {
givenFetchedFoldersAndDocuments();
getDataLayerFactory().getDataLayerLogger().setPrintAllQueriesLongerThanMS(0);
assertThatVisibleRootRecordsFor(userWithToken1).containsOnly(folderA, folderB);
assertThatVisibleChildRecordsFor(userWithToken1).in(folderA).containsOnly(folderAA, documentA1, documentA2);
assertThatVisibleChildRecordsFor(userWithToken1).in(folderB).containsOnly(documentB3);
assertThatVisibleChildRecordsFor(userWithToken1).in(folderAA).containsOnly(documentAA4);
assertThatVisibleChildRecordsFor(userWithToken1).in(folderAB).isEmpty();
assertThatVisibleRootRecordsFor(userWithToken1And2).containsOnly(folderA, folderB);
assertThatVisibleChildRecordsFor(userWithToken1And2).in(folderA).containsOnly(folderAA, documentA1, documentA2);
assertThatVisibleChildRecordsFor(userWithToken1And2).in(folderB).contains(documentB3);
assertThatVisibleChildRecordsFor(userWithToken1And2).in(folderAA).containsOnly(documentAA4, documentAA5);
assertThatVisibleChildRecordsFor(userWithToken1And2).in(folderAB).isEmpty();
}
private ChildRecordAssertPreparator assertThatVisibleChildRecordsFor(User user) {
return new ChildRecordAssertPreparator(user);
}
private ListAssert<Object> assertThatVisibleRootRecordsFor(User user) {
TaxonomiesSearchServices taxonomiesSearchServices = getModelLayerFactory().newTaxonomiesSearchService();
return assertThat(taxonomiesSearchServices.getVisibleRootConcept(user, zeCollection, SMB_FOLDERS, defaultOptions))
.extracting("id");
}
private class ChildRecordAssertPreparator {
private User user;
private ChildRecordAssertPreparator(User user) {
this.user = user;
}
private ListAssert<Object> in(String recordId) {
Record record = getModelLayerFactory().newRecordServices().getDocumentById(recordId);
TaxonomiesSearchServices taxonomiesSearchServices = getModelLayerFactory().newTaxonomiesSearchService();
return assertThat(taxonomiesSearchServices.getVisibleChildConcept(user, SMB_FOLDERS, record, defaultOptions))
.extracting("id");
}
}
}