Extracted TestSettings utility

This commit is contained in:
Risto Lahtela 2020-11-19 16:34:52 +02:00
parent d402b1c832
commit 6292ef5f4d
6 changed files with 139 additions and 126 deletions

View File

@ -16,19 +16,16 @@
*/
package com.djrapitops.plan;
import com.djrapitops.plan.exceptions.EnableException;
import com.djrapitops.plan.settings.ConfigSettingKeyTest;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.WebserverSettings;
import com.djrapitops.plan.settings.config.paths.key.Setting;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import utilities.RandomData;
import utilities.TestSettings;
import utilities.mocks.BukkitMockComponent;
import java.nio.file.Path;
import java.util.Collection;
import static org.junit.jupiter.api.Assertions.assertTrue;
@ -51,7 +48,7 @@ class BukkitSystemTest {
}
@Test
void bukkitSystemEnables() throws EnableException {
void bukkitSystemEnables() {
try {
system.enable();
assertTrue(system.isEnabled());
@ -61,13 +58,12 @@ class BukkitSystemTest {
}
@Test
void bukkitSystemHasDefaultConfigValuesAfterEnable() throws EnableException, IllegalAccessException {
void bukkitSystemHasDefaultConfigValuesAfterEnable() throws IllegalAccessException {
try {
system.enable();
PlanConfig config = system.getConfigSystem().getConfig();
Collection<Setting> serverSettings = ConfigSettingKeyTest.getServerSettings();
ConfigSettingKeyTest.assertValidDefaultValuesForAllSettings(config, serverSettings);
TestSettings.assertValidDefaultValuesForAllSettings(config, TestSettings.getServerSettings());
} finally {
system.disable();
}

View File

@ -17,35 +17,25 @@
package com.djrapitops.plan.settings;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.*;
import com.djrapitops.plan.settings.config.paths.key.Setting;
import com.djrapitops.plugin.logging.console.TestPluginLogger;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import utilities.FieldFetcher;
import utilities.TestResources;
import utilities.TestSettings;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Test to check that configs contain all values required to run the plugin.
* <p>
* TODO Move public utility methods to an utility to make this class package private
*
* @author Rsl1122
*/
public class ConfigSettingKeyTest {
class ConfigSettingKeyTest {
public static Path temporaryFolder;
@ -54,82 +44,18 @@ public class ConfigSettingKeyTest {
temporaryFolder = tempDir;
}
public static void assertValidDefaultValuesForAllSettings(PlanConfig config, Iterable<Setting> settings) {
List<String> fails = new ArrayList<>();
for (Setting<?> setting : settings) {
checkSettingForFailures(config, setting).ifPresent(fails::add);
}
assertTrue(fails.isEmpty(), fails::toString);
}
private static Optional<String> checkSettingForFailures(PlanConfig config, Setting<?> setting) {
try {
if (!config.contains(setting.getPath())) {
return Optional.of("Did not contain " + setting.getPath());
} else {
config.get(setting);
return Optional.empty();
}
} catch (IllegalStateException validationFailed) {
return Optional.of(validationFailed.getMessage());
}
}
public static Collection<Setting> getServerSettings() throws IllegalAccessException {
List<Setting> settings = new ArrayList<>();
for (Class settingKeyClass : new Class[]{
DatabaseSettings.class,
DataGatheringSettings.class,
DisplaySettings.class,
ExportSettings.class,
FormatSettings.class,
PluginSettings.class,
TimeSettings.class,
WebserverSettings.class
}) {
settings.addAll(FieldFetcher.getPublicStaticFields(settingKeyClass, Setting.class));
}
return settings;
}
public static Collection<Setting> getProxySettings() throws IllegalAccessException {
List<Setting> settings = new ArrayList<>();
for (Class settingKeyClass : new Class[]{
DatabaseSettings.class,
DisplaySettings.class,
ExportSettings.class,
FormatSettings.class,
PluginSettings.class,
ProxySettings.class,
TimeSettings.class,
WebserverSettings.class
}) {
settings.addAll(FieldFetcher.getPublicStaticFields(settingKeyClass, Setting.class));
}
// Server settings contained in the key classes, remove
settings.remove(PluginSettings.SERVER_NAME);
settings.remove(PluginSettings.PROXY_COPY_CONFIG);
settings.remove(DatabaseSettings.TYPE);
settings.remove(DisplaySettings.WORLD_ALIASES);
settings.remove(DatabaseSettings.H2_USER);
settings.remove(DatabaseSettings.H2_PASS);
return settings;
}
@Test
@DisplayName("config.yml has valid default values")
void serverConfigHasValidDefaultValues() throws IOException, IllegalAccessException {
PlanConfig planConfig = createConfig("config.yml");
Collection<Setting> settings = getServerSettings();
assertValidDefaultValuesForAllSettings(planConfig, settings);
PlanConfig config = createConfig("config.yml");
TestSettings.assertValidDefaultValuesForAllSettings(config, TestSettings.getServerSettings());
}
@Test
@DisplayName("bungeeconfig.yml has valid default values")
void proxyConfigHasValidDefaultValues() throws IOException, IllegalAccessException {
PlanConfig planConfig = createConfig("bungeeconfig.yml");
Collection<Setting> settings = getProxySettings();
assertValidDefaultValuesForAllSettings(planConfig, settings);
PlanConfig config = createConfig("bungeeconfig.yml");
TestSettings.assertValidDefaultValuesForAllSettings(config, TestSettings.getProxySettings());
}
private PlanConfig createConfig(String copyDefaultSettingsFrom) throws IOException {

View File

@ -16,10 +16,8 @@
*/
package com.djrapitops.plan.settings.config.changes;
import com.djrapitops.plan.settings.ConfigSettingKeyTest;
import com.djrapitops.plan.settings.config.ConfigReader;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.key.Setting;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.djrapitops.plugin.logging.console.PluginLogger;
import com.djrapitops.plugin.logging.console.TestPluginLogger;
@ -29,6 +27,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.mockito.Mockito;
import utilities.TestResources;
import utilities.TestSettings;
import java.io.File;
import java.io.IOException;
@ -36,7 +35,6 @@ import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.Collection;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ -87,77 +85,75 @@ class ConfigUpdaterTest {
@Test
void serverConfigIsPatchedCorrectly() throws IOException, IllegalAccessException {
Path config = tempDir.resolve("oldconfig.yml");
Files.copy(oldConfig.toPath(), config, StandardCopyOption.REPLACE_EXISTING);
Path configPath = tempDir.resolve("oldconfig.yml");
Files.copy(oldConfig.toPath(), configPath, StandardCopyOption.REPLACE_EXISTING);
PlanConfig planConfig = new PlanConfig(config.toFile(), null, null, new TestPluginLogger());
PlanConfig config = new PlanConfig(configPath.toFile(), null, null, new TestPluginLogger());
UNDER_TEST.applyConfigUpdate(planConfig);
UNDER_TEST.applyConfigUpdate(config);
// Ensure that added settings are present
copyMissingFrom(planConfig, newConfig);
copyMissingFrom(config, newConfig);
Collection<Setting> settings = ConfigSettingKeyTest.getServerSettings();
ConfigSettingKeyTest.assertValidDefaultValuesForAllSettings(planConfig, settings);
TestSettings.assertValidDefaultValuesForAllSettings(config, TestSettings.getServerSettings());
}
@Test
void proxyConfigIsPatchedCorrectly() throws IOException, IllegalAccessException {
Path config = tempDir.resolve("oldconfig.yml");
Files.copy(oldBungeeConfig.toPath(), config, StandardCopyOption.REPLACE_EXISTING);
Path configPath = tempDir.resolve("oldconfig.yml");
Files.copy(oldBungeeConfig.toPath(), configPath, StandardCopyOption.REPLACE_EXISTING);
PlanConfig planConfig = new PlanConfig(config.toFile(), null, null, new TestPluginLogger());
PlanConfig config = new PlanConfig(configPath.toFile(), null, null, new TestPluginLogger());
UNDER_TEST.applyConfigUpdate(planConfig);
UNDER_TEST.applyConfigUpdate(config);
// Ensure that added settings are present
copyMissingFrom(planConfig, newBungeeConfig);
copyMissingFrom(config, newBungeeConfig);
Collection<Setting> settings = ConfigSettingKeyTest.getProxySettings();
ConfigSettingKeyTest.assertValidDefaultValuesForAllSettings(planConfig, settings);
TestSettings.assertValidDefaultValuesForAllSettings(config, TestSettings.getProxySettings());
}
private void copyMissingFrom(PlanConfig planConfig, Path newBungeeConfig) throws IOException {
private void copyMissingFrom(PlanConfig config, Path newBungeeConfig) throws IOException {
try (ConfigReader reader = new ConfigReader(newBungeeConfig)) {
planConfig.copyMissing(reader.read());
config.copyMissing(reader.read());
}
}
@Test
void serverMoveChangesDoNotLeaveNewEmptyValues() throws IOException {
Path config = tempDir.resolve("oldconfig.yml");
Files.copy(oldConfig.toPath(), config, StandardCopyOption.REPLACE_EXISTING);
Path configPath = tempDir.resolve("oldconfig.yml");
Files.copy(oldConfig.toPath(), configPath, StandardCopyOption.REPLACE_EXISTING);
PlanConfig planConfig = new PlanConfig(config.toFile(), null, null, new TestPluginLogger());
PlanConfig config = new PlanConfig(configPath.toFile(), null, null, new TestPluginLogger());
ConfigChange[] changes = UNDER_TEST.configEnhancementPatch();
assertMoveChangesAreAppliedProperly(planConfig, changes);
assertMoveChangesAreAppliedProperly(config, changes);
}
@Test
void proxyMoveChangesDoNotLeaveNewEmptyValues() throws IOException {
Path config = tempDir.resolve("oldconfig.yml");
Files.copy(oldBungeeConfig.toPath(), config, StandardCopyOption.REPLACE_EXISTING);
Path configPath = tempDir.resolve("oldconfig.yml");
Files.copy(oldBungeeConfig.toPath(), configPath, StandardCopyOption.REPLACE_EXISTING);
PlanConfig planConfig = new PlanConfig(config.toFile(), null, null, new TestPluginLogger());
PlanConfig config = new PlanConfig(configPath.toFile(), null, null, new TestPluginLogger());
ConfigChange[] changes = UNDER_TEST.configEnhancementPatch();
assertMoveChangesAreAppliedProperly(planConfig, changes);
assertMoveChangesAreAppliedProperly(config, changes);
}
private void assertMoveChangesAreAppliedProperly(PlanConfig planConfig, ConfigChange[] changes) {
private void assertMoveChangesAreAppliedProperly(PlanConfig config, ConfigChange[] changes) {
for (ConfigChange change : changes) {
if (change.hasBeenApplied(planConfig)) {
if (change.hasBeenApplied(config)) {
continue;
}
if (change instanceof ConfigChange.Moved) {
ConfigChange.Moved move = (ConfigChange.Moved) change;
String expected = planConfig.getString(move.oldPath);
String expected = config.getString(move.oldPath);
move.apply(planConfig);
move.apply(config);
assertEquals(expected, planConfig.getString(move.newPath));
assertEquals(expected, config.getString(move.newPath));
}
}
}

View File

@ -0,0 +1,95 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package utilities;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.*;
import com.djrapitops.plan.settings.config.paths.key.Setting;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Utility for testing that configs contain all appropriate values.
*/
public class TestSettings {
public static void assertValidDefaultValuesForAllSettings(PlanConfig config, Iterable<Setting> settings) {
List<String> fails = new ArrayList<>();
for (Setting<?> setting : settings) {
checkSettingForFailures(config, setting).ifPresent(fails::add);
}
assertTrue(fails.isEmpty(), fails::toString);
}
private static Optional<String> checkSettingForFailures(PlanConfig config, Setting<?> setting) {
try {
if (!config.contains(setting.getPath())) {
return Optional.of("Did not contain " + setting.getPath());
} else {
config.get(setting);
return Optional.empty();
}
} catch (IllegalStateException validationFailed) {
return Optional.of(validationFailed.getMessage());
}
}
public static Collection<Setting> getServerSettings() throws IllegalAccessException {
List<Setting> settings = new ArrayList<>();
for (Class settingKeyClass : new Class[]{
DatabaseSettings.class,
DataGatheringSettings.class,
DisplaySettings.class,
ExportSettings.class,
FormatSettings.class,
PluginSettings.class,
TimeSettings.class,
WebserverSettings.class
}) {
settings.addAll(FieldFetcher.getPublicStaticFields(settingKeyClass, Setting.class));
}
return settings;
}
public static Collection<Setting> getProxySettings() throws IllegalAccessException {
List<Setting> settings = new ArrayList<>();
for (Class settingKeyClass : new Class[]{
DatabaseSettings.class,
DisplaySettings.class,
ExportSettings.class,
FormatSettings.class,
PluginSettings.class,
ProxySettings.class,
TimeSettings.class,
WebserverSettings.class
}) {
settings.addAll(FieldFetcher.getPublicStaticFields(settingKeyClass, Setting.class));
}
// Server settings contained in the key classes, remove
settings.remove(PluginSettings.SERVER_NAME);
settings.remove(PluginSettings.PROXY_COPY_CONFIG);
settings.remove(DatabaseSettings.TYPE);
settings.remove(DisplaySettings.WORLD_ALIASES);
settings.remove(DatabaseSettings.H2_USER);
settings.remove(DatabaseSettings.H2_PASS);
return settings;
}
}

View File

@ -17,7 +17,6 @@
package com.djrapitops.plan;
import com.djrapitops.plan.exceptions.EnableException;
import com.djrapitops.plan.settings.ConfigSettingKeyTest;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.WebserverSettings;
import com.djrapitops.plan.settings.config.paths.key.Setting;
@ -25,6 +24,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import utilities.RandomData;
import utilities.TestSettings;
import utilities.mocks.NukkitMockComponent;
import java.nio.file.Path;
@ -65,8 +65,8 @@ class NukkitSystemTest {
system.enable();
PlanConfig config = system.getConfigSystem().getConfig();
Collection<Setting> serverSettings = ConfigSettingKeyTest.getServerSettings();
ConfigSettingKeyTest.assertValidDefaultValuesForAllSettings(config, serverSettings);
Collection<Setting> serverSettings = TestSettings.getServerSettings();
TestSettings.assertValidDefaultValuesForAllSettings(config, serverSettings);
} finally {
system.disable();
}

View File

@ -17,7 +17,6 @@
package com.djrapitops.plan;
import com.djrapitops.plan.exceptions.EnableException;
import com.djrapitops.plan.settings.ConfigSettingKeyTest;
import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.WebserverSettings;
import com.djrapitops.plan.settings.config.paths.key.Setting;
@ -25,6 +24,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import utilities.RandomData;
import utilities.TestSettings;
import utilities.mocks.SpongeMockComponent;
import java.nio.file.Path;
@ -67,8 +67,8 @@ class SpongeSystemTest {
system.enable();
PlanConfig config = system.getConfigSystem().getConfig();
Collection<Setting> serverSettings = ConfigSettingKeyTest.getServerSettings();
ConfigSettingKeyTest.assertValidDefaultValuesForAllSettings(config, serverSettings);
Collection<Setting> serverSettings = TestSettings.getServerSettings();
TestSettings.assertValidDefaultValuesForAllSettings(config, serverSettings);
} finally {
system.disable();
}