package com.constellio.model.utils;
import static com.constellio.data.conf.HashingEncoding.BASE64;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import java.util.Arrays;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.data.dao.managers.config.ConfigManager;
import com.constellio.data.dao.managers.config.DocumentAlteration;
import com.constellio.data.dao.managers.config.FileSystemConfigManager;
import com.constellio.data.io.services.facades.IOServices;
import com.constellio.data.utils.hashing.HashingService;
import com.constellio.model.services.collections.CollectionsListManager;
import com.constellio.sdk.tests.ConstellioTest;
public class OneXMLConfigPerCollectionManagerAcceptanceTest extends ConstellioTest {
String filePath = "/subFolder/zeConfig.xml";
XMLConfigReader<String> configReader;
OneXMLConfigPerCollectionManager<String> manager;
ConfigManager configManager;
DocumentAlteration createEmptyFileDocumentAlteration;
CollectionsListManager collectionsListManager;
@Mock OneXMLConfigPerCollectionManagerListener managerListener, otherManagerListener;
List<String> languages = Arrays.asList("fr");
@Before
public void setUp()
throws Exception {
configReader = new XMLConfigReader<String>() {
@Override
public String read(String collection, Document document) {
return document.getRootElement().getAttributeValue("value");
}
};
createEmptyFileDocumentAlteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
Element element = new Element("root");
element.setAttribute("value", "A");
document.addContent(element);
}
};
IOServices ioServices = getIOLayerFactory().newIOServices();
HashingService hashingServices = getIOLayerFactory().newHashingService(BASE64);
configManager = new FileSystemConfigManager(newTempFolder(), ioServices, hashingServices);
collectionsListManager = new CollectionsListManager(configManager);
collectionsListManager.initialize();
manager = newManager(managerListener);
}
@Test
public void whenCollectionsAddedThenLoadValues()
throws Exception {
createCollectionFile("collection1");
createCollectionFile("collection2");
collectionsListManager.addCollection("collection1", languages);
collectionsListManager.addCollection("collection2", languages);
assertThat(manager.get("collection1")).isEqualTo("A");
assertThat(manager.get("collection2")).isEqualTo("A");
}
@Test
public void whenInstanciatedThenLoadValues()
throws Exception {
createCollectionFile("collection1");
createCollectionFile("collection2");
collectionsListManager.addCollection("collection1", languages);
collectionsListManager.addCollection("collection2", languages);
manager = newManager(managerListener);
assertThat(manager.get("collection1")).isEqualTo("A");
assertThat(manager.get("collection2")).isEqualTo("A");
}
@Test
public void whenValuesModifiedThenLoaded()
throws Exception {
createCollectionFile("collection1");
createCollectionFile("collection2");
collectionsListManager.addCollection("collection1", languages);
collectionsListManager.addCollection("collection2", languages);
updateCollectionValue("collection1", "B");
updateCollectionValue("collection2", "C");
assertThat(manager.get("collection1")).isEqualTo("B");
assertThat(manager.get("collection2")).isEqualTo("C");
}
@Test
public void givenModifiedValuesWhenInstanciatedThenLoadModifiedValues()
throws Exception {
createCollectionFile("collection1");
createCollectionFile("collection2");
collectionsListManager.addCollection("collection1", languages);
collectionsListManager.addCollection("collection2", languages);
updateCollectionValue("collection1", "B");
updateCollectionValue("collection2", "C");
manager = newManager(managerListener);
assertThat(manager.get("collection1")).isEqualTo("B");
assertThat(manager.get("collection2")).isEqualTo("C");
}
@Test
public void givenCollectionCreatedByOtherManagerThenLoadedAnyway()
throws Exception {
OneXMLConfigPerCollectionManager<String> otherManager = newManager(otherManagerListener);
createCollectionFile("collection1");
createCollectionFile("collection2");
collectionsListManager.addCollection("collection1", languages);
collectionsListManager.addCollection("collection2", languages);
assertThat(otherManager.get("collection1")).isEqualTo("A");
assertThat(otherManager.get("collection2")).isEqualTo("A");
}
@Test
public void givenValuesModifiedByOtherManagerThenLoadedAnyway()
throws Exception {
OneXMLConfigPerCollectionManager<String> otherManager = newManager(otherManagerListener);
createCollectionFile("collection1");
createCollectionFile("collection2");
collectionsListManager.addCollection("collection1", languages);
collectionsListManager.addCollection("collection2", languages);
updateCollectionValue("collection1", "B");
updateCollectionValue("collection2", "C");
assertThat(otherManager.get("collection1")).isEqualTo("B");
assertThat(otherManager.get("collection2")).isEqualTo("C");
}
@Test
public void givenValuesModifiedThenAllListenersOfManagersAreNotified()
throws Exception {
OneXMLConfigPerCollectionManager<String> otherManager = newManager(otherManagerListener);
verify(managerListener, never()).onValueModified(anyString(), anyString());
verify(otherManagerListener, never()).onValueModified(anyString(), anyString());
createCollectionFile("collection1");
createCollectionFile("collection2");
collectionsListManager.addCollection("collection1", languages);
collectionsListManager.addCollection("collection2", languages);
updateCollectionValue("collection1", "B");
updateCollectionValue("collection2", "C");
verify(managerListener).onValueModified("collection1", "B");
verify(managerListener).onValueModified("collection2", "C");
verify(otherManagerListener).onValueModified("collection1", "B");
verify(otherManagerListener).onValueModified("collection2", "C");
}
private void createCollectionFile(String collection) {
manager.createCollectionFile(collection, createEmptyFileDocumentAlteration);
}
private OneXMLConfigPerCollectionManager<String> newManager(OneXMLConfigPerCollectionManagerListener listener) {
return new OneXMLConfigPerCollectionManager(configManager, collectionsListManager, filePath, configReader, listener);
}
private void updateCollectionValue(String collection, final String newValue) {
manager.updateXML(collection, new DocumentAlteration() {
@Override
public void alter(Document document) {
document.getRootElement().setAttribute("value", newValue);
}
});
}
}