package com.constellio.app.services.extensions.plugins; import static com.constellio.app.services.extensions.plugins.ConstellioPluginConfigurationManager.PLUGINS_CONFIG_PATH; import static com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginStatus.DISABLED; import static com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginStatus.ENABLED; import static com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginStatus.INVALID; import static com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginStatus.READY_TO_INSTALL; import static com.constellio.app.services.extensions.plugins.PluginActivationFailureCause.CANNOT_INSTALL_OLDER_VERSION; import static org.assertj.core.api.Assertions.assertThat; import org.jdom2.Document; import org.jdom2.Element; import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; import com.constellio.app.modules.rm.RMTestRecords; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.services.extensions.plugins.ConstellioPluginConfigurationManagerRuntimeException.ConstellioPluginConfigurationManagerRuntimeException_CouldNotDisableInvalidPlugin; import com.constellio.app.services.extensions.plugins.ConstellioPluginConfigurationManagerRuntimeException.ConstellioPluginConfigurationManagerRuntimeException_CouldNotDisableReadyToInstallPlugin; import com.constellio.app.services.extensions.plugins.ConstellioPluginConfigurationManagerRuntimeException.ConstellioPluginConfigurationManagerRuntimeException_CouldNotEnableInvalidPlugin; import com.constellio.app.services.extensions.plugins.ConstellioPluginConfigurationManagerRuntimeException.ConstellioPluginConfigurationManagerRuntimeException_InvalidPluginWithNoStatus; import com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginInfo; import com.constellio.data.dao.managers.config.ConfigManager; import com.constellio.data.dao.managers.config.DocumentAlteration; import com.constellio.data.dao.managers.config.values.XMLConfiguration; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.setups.Users; public class ConstellioPluginConfigurationManagerAcceptanceTest extends ConstellioTest { Users users = new Users(); RMSchemasRecordsServices rm; RMTestRecords records = new RMTestRecords(zeCollection); ConstellioPluginConfigurationManager pluginConfigManger; private ConfigManager configManager; @Before public void setUp() throws Exception { prepareSystem( withZeCollection().withConstellioRMModule().withAllTestUsers().withRMTest(records) ); rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); configManager = getModelLayerFactory().getDataLayerFactory().getConfigManager(); pluginConfigManger = new ConstellioPluginConfigurationManager(configManager); } @Test public void assertThatPluginFileExists() throws Exception { assertThat(configManager.exist(PLUGINS_CONFIG_PATH)).isTrue(); } @Test public void givenConfigFileExistsWhenCreateConfigFileIfNotExistThenNotReplaced() throws Exception { configManager.updateXML(PLUGINS_CONFIG_PATH, new DocumentAlteration() { @Override public void alter(Document document) { document.setRootElement(new Element("zeRoot")); } }); pluginConfigManger.createConfigFileIfNotExist(); XMLConfiguration text = configManager.getXML(PLUGINS_CONFIG_PATH); assertThat(text.getDocument().getRootElement().getName()).isEqualTo("zeRoot"); } @Test public void givenPluginInfoWithNullValuesWhenAddPluginAndGetItThenPluginInfoLoadedCorrectly() throws Exception { ConstellioPluginInfo expectedPluginInfo = new ConstellioPluginInfo().setCode("zeCode").setTitle("zeTitle"); pluginConfigManger.addOrUpdatePlugin(expectedPluginInfo); ConstellioPluginInfo pluginInfo = pluginConfigManger.getPluginInfo("zeCode"); assertThat(pluginInfo).isEqualToComparingFieldByField(expectedPluginInfo); } @Test public void givenPluginInfoWithValidValuesWhenAddPluginAndGetItThenPluginInfoLoadedCorrectly() throws Exception { ConstellioPluginInfo expectedPluginInfo = new ConstellioPluginInfo() .setCode("zeCode") .setTitle("zeTitle") .setPluginActivationFailureCause(CANNOT_INSTALL_OLDER_VERSION) .setPluginStatus(INVALID) .setLastInstallDate(new LocalDate()) .setRequiredConstellioVersion("5.1") .setVersion("9.0.1"); pluginConfigManger.addOrUpdatePlugin(expectedPluginInfo); ConstellioPluginInfo pluginInfo = pluginConfigManger.getPluginInfo("zeCode"); assertThat(pluginInfo).isEqualToComparingFieldByField(expectedPluginInfo); } @Test public void whenInstallPluginThenInstalledWithCurrentDateAndWithoutErrorsAndWithWriteStatus() throws Exception { LocalDate now = LocalDate.now(); givenTimeIs(now); pluginConfigManger.installPlugin("zePluginId", "zePluginTitle", "version", "rVersion"); ConstellioPluginInfo pluginInfo = pluginConfigManger.getPluginInfo("zePluginId"); assertThat(pluginInfo.getLastInstallDate()).isEqualTo(now); assertThat(pluginInfo.getVersion()).isEqualTo("version"); assertThat(pluginInfo.getRequiredConstellioVersion()).isEqualTo("rVersion"); assertThat(pluginInfo.getPluginStatus()).isEqualTo(READY_TO_INSTALL); assertThat(pluginInfo.getPluginActivationFailureCause()).isNull(); } @Test public void givenInstalledPluginWhenInstallPluginThenUpdatedCorrectly() throws Exception { //first install LocalDate now = LocalDate.now(); givenTimeIs(now); pluginConfigManger.installPlugin("zePluginId", "zePluginTitle", "version", "rVersion"); //update of status pluginConfigManger.markPluginAsEnabled("zePluginId"); //second install LocalDate after = now.plusDays(1); givenTimeIs(after); pluginConfigManger.installPlugin("zePluginId", "zePluginTitle", "version2", "rVersion2"); ConstellioPluginInfo pluginInfo = pluginConfigManger.getPluginInfo("zePluginId"); assertThat(pluginInfo.getLastInstallDate()).isEqualTo(after); assertThat(pluginInfo.getVersion()).isEqualTo("version2"); assertThat(pluginInfo.getRequiredConstellioVersion()).isEqualTo("rVersion2"); assertThat(pluginInfo.getPluginStatus()).isEqualTo(READY_TO_INSTALL); assertThat(pluginInfo.getPluginActivationFailureCause()).isNull(); } @Test public void givenPluginInfoWhenAddPluginAndGetItThenPluginInfoLoadedCorrectly() throws Exception { ConstellioPluginInfo expectedPluginInfo = new ConstellioPluginInfo() .setCode("zeCode") .setTitle("zeTitle") .setPluginActivationFailureCause(CANNOT_INSTALL_OLDER_VERSION) .setPluginStatus(INVALID) .setLastInstallDate(new LocalDate()) .setRequiredConstellioVersion("5.1") .setVersion("9.0.1"); pluginConfigManger.addOrUpdatePlugin(expectedPluginInfo); ConstellioPluginInfo pluginInfo = pluginConfigManger.getPluginInfo("zeCode"); assertThat(pluginInfo).isEqualToComparingFieldByField(expectedPluginInfo); } ConstellioPluginInfo pluginWithDisabledStatus = new ConstellioPluginInfo().setCode("pluginWithDisabledStatus") .setPluginStatus(DISABLED).setTitle("pluginWithDisabledStatus"); ConstellioPluginInfo pluginWithEnabledStatus = new ConstellioPluginInfo().setCode("pluginWithEnabledStatus") .setPluginStatus(ENABLED).setTitle("pluginWithEnabledStatus"); ConstellioPluginInfo pluginWithReadyToInstallStatus = new ConstellioPluginInfo().setCode("pluginWithReadyToInstallStatus") .setPluginStatus(READY_TO_INSTALL).setTitle("pluginWithReadyToInstallStatus"); ConstellioPluginInfo pluginWithInvalidStatus = new ConstellioPluginInfo().setCode("pluginWithInvalidStatus") .setPluginStatus(INVALID).setTitle("pluginWithInvalidStatus"); ConstellioPluginInfo pluginWithNullStatus = new ConstellioPluginInfo().setCode("pluginWithNullStatus") .setTitle("pluginWithNullStatus"); @Test public void whenSaveSeveralPluginsThenSavedCorrectly() throws Exception { saveTestPlugins(); ConstellioPluginInfo reLoadedPluginWithDisabledStatus = pluginConfigManger .getPluginInfo(pluginWithDisabledStatus.getCode()); assertThat(reLoadedPluginWithDisabledStatus).isEqualToComparingFieldByField(pluginWithDisabledStatus); ConstellioPluginInfo reLoadedPluginWithEnabledStatus = pluginConfigManger .getPluginInfo(pluginWithEnabledStatus.getCode()); assertThat(reLoadedPluginWithEnabledStatus).isEqualToComparingFieldByField(pluginWithEnabledStatus); ConstellioPluginInfo reLoadedPluginWithReadyToInstallStatus = pluginConfigManger .getPluginInfo(pluginWithReadyToInstallStatus.getCode()); assertThat(reLoadedPluginWithReadyToInstallStatus).isEqualToComparingFieldByField(pluginWithReadyToInstallStatus); ConstellioPluginInfo reLoadedPluginWithInvalidStatus = pluginConfigManger .getPluginInfo(pluginWithInvalidStatus.getCode()); assertThat(reLoadedPluginWithInvalidStatus).isEqualToComparingFieldByField(pluginWithInvalidStatus); ConstellioPluginInfo reLoadedPluginWithNullStatus = pluginConfigManger .getPluginInfo(pluginWithNullStatus.getCode()); assertThat(reLoadedPluginWithNullStatus).isEqualToComparingFieldByField(pluginWithNullStatus); } @Test public void givenExistingPluginsWhenUpdatePluginThenUpdatedCorrectly() throws Exception { saveTestPlugins(); pluginWithDisabledStatus = pluginWithDisabledStatus.setPluginStatus(ENABLED) .setPluginActivationFailureCause(CANNOT_INSTALL_OLDER_VERSION) .setLastInstallDate(LocalDate.now()) .setRequiredConstellioVersion("dd") .setVersion("aa"); pluginConfigManger.addOrUpdatePlugin(pluginWithDisabledStatus); ConstellioPluginInfo reLoadedPluginWithDisabledStatus = pluginConfigManger .getPluginInfo(pluginWithDisabledStatus.getCode()); assertThat(reLoadedPluginWithDisabledStatus).isEqualToComparingFieldByField(pluginWithDisabledStatus); } @Test public void whenMarkPluginAsEnabledThenBehavesAsExpected() throws Exception { saveTestPlugins(); try { pluginConfigManger.markPluginAsEnabled(pluginWithNullStatus.getCode()); } catch (ConstellioPluginConfigurationManagerRuntimeException_InvalidPluginWithNoStatus e) { //OK } try { pluginConfigManger.markPluginAsEnabled(pluginWithInvalidStatus.getCode()); } catch (ConstellioPluginConfigurationManagerRuntimeException_CouldNotEnableInvalidPlugin e) { //OK } pluginConfigManger.markPluginAsEnabled(pluginWithDisabledStatus.getCode()); assertThat(pluginConfigManger.getPluginInfo(pluginWithDisabledStatus.getCode()).getPluginStatus()).isEqualTo(ENABLED); pluginConfigManger.markPluginAsEnabled(pluginWithEnabledStatus.getCode()); assertThat(pluginConfigManger.getPluginInfo(pluginWithEnabledStatus.getCode()).getPluginStatus()).isEqualTo(ENABLED); pluginConfigManger.markPluginAsEnabled(pluginWithReadyToInstallStatus.getCode()); assertThat(pluginConfigManger.getPluginInfo(pluginWithReadyToInstallStatus.getCode()).getPluginStatus()) .isEqualTo(ENABLED); } @Test public void whenMarkPluginAsDisabledThenBehavesAsExpected() throws Exception { saveTestPlugins(); try { pluginConfigManger.markPluginAsDisabled(pluginWithNullStatus.getCode()); } catch (ConstellioPluginConfigurationManagerRuntimeException_InvalidPluginWithNoStatus e) { //OK } try { pluginConfigManger.markPluginAsDisabled(pluginWithInvalidStatus.getCode()); } catch (ConstellioPluginConfigurationManagerRuntimeException_CouldNotDisableInvalidPlugin e) { //OK } try { pluginConfigManger.markPluginAsDisabled(pluginWithReadyToInstallStatus.getCode()); } catch (ConstellioPluginConfigurationManagerRuntimeException_CouldNotDisableReadyToInstallPlugin e) { //OK } pluginConfigManger.markPluginAsDisabled(pluginWithDisabledStatus.getCode()); assertThat(pluginConfigManger.getPluginInfo(pluginWithDisabledStatus.getCode()).getPluginStatus()).isEqualTo(DISABLED); pluginConfigManger.markPluginAsDisabled(pluginWithEnabledStatus.getCode()); assertThat(pluginConfigManger.getPluginInfo(pluginWithEnabledStatus.getCode()).getPluginStatus()).isEqualTo(DISABLED); } private void saveTestPlugins() { pluginConfigManger.addOrUpdatePlugin(pluginWithDisabledStatus); pluginConfigManger.addOrUpdatePlugin(pluginWithEnabledStatus); pluginConfigManger.addOrUpdatePlugin(pluginWithReadyToInstallStatus); pluginConfigManger.addOrUpdatePlugin(pluginWithInvalidStatus); pluginConfigManger.addOrUpdatePlugin(pluginWithNullStatus); } }