Document MagicGem migration workflow
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
package cn.infstar.cmagicgem.api;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import pku.yim.magicgem.api.PlayerSlotType;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
class PlayerSlotTypeCompatibilityTest {
|
||||
@Test
|
||||
void legacyIdsAndMythicSlotNamesArePreserved() {
|
||||
assertEquals(PlayerSlotType.MAINHAND, PlayerSlotType.getById(-1));
|
||||
assertEquals(PlayerSlotType.HELMET, PlayerSlotType.getById(5));
|
||||
assertEquals(PlayerSlotType.OFFHAND, PlayerSlotType.getById(45));
|
||||
assertEquals("HAND", PlayerSlotType.MAINHAND.toMMSlot());
|
||||
assertEquals(PlayerSlotType.CHESTPLATE, PlayerSlotType.getByName("CHEST"));
|
||||
assertNull(PlayerSlotType.getById(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
void materialMatchingUsesTheArmorSlot() {
|
||||
assertEquals(PlayerSlotType.HELMET, PlayerSlotType.matchType("DIAMOND_HELMET"));
|
||||
assertEquals(PlayerSlotType.CHESTPLATE, PlayerSlotType.matchType("ELYTRA"));
|
||||
assertEquals(PlayerSlotType.OFFHAND, PlayerSlotType.matchType("SHIELD"));
|
||||
assertNull(PlayerSlotType.matchType("MAINHAND"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package cn.infstar.cmagicgem.command;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
class PermissionPolicyTest {
|
||||
@Test
|
||||
void legacyAdminPermissionIncludesViewAndEmbed() {
|
||||
Set<String> permissions = Set.of("magicgem.command.admin");
|
||||
|
||||
assertTrue(PermissionPolicy.allows("view", permissions::contains));
|
||||
assertTrue(PermissionPolicy.allows("embed", permissions::contains));
|
||||
assertTrue(PermissionPolicy.allows("admin", permissions::contains));
|
||||
}
|
||||
|
||||
@Test
|
||||
void specificPermissionsDoNotGrantOtherCommands() {
|
||||
Set<String> permissions = Set.of("magicgem.command.view");
|
||||
|
||||
assertTrue(PermissionPolicy.allows("view", permissions::contains));
|
||||
assertFalse(PermissionPolicy.allows("embed", permissions::contains));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package cn.infstar.cmagicgem.migration;
|
||||
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
class LegacyDirectoryImporterTest {
|
||||
@TempDir
|
||||
Path temporaryDirectory;
|
||||
|
||||
@Test
|
||||
void mergesOldDirectoryWithoutOverwritingTargetAndKeepsConflictBackup() throws Exception {
|
||||
Path plugins = Files.createDirectory(temporaryDirectory.resolve("plugins"));
|
||||
Path source = Files.createDirectories(plugins.resolve("CMagicGem/gems"));
|
||||
Path target = Files.createDirectories(plugins.resolve("MagicGem/gems"));
|
||||
Path oldGem = source.resolve("Shared.yml");
|
||||
Path currentGem = target.resolve("Shared.yml");
|
||||
Files.writeString(oldGem, "Shared:\n Name: Old Name\n Material: DIAMOND\n OldOnly: retained\n");
|
||||
Files.writeString(currentGem, "Shared:\n Name: Current Name\n Material: DIAMOND\n CurrentOnly: retained\n");
|
||||
Files.writeString(source.resolve("Custom.yml"), "Custom:\n Name: Imported\n");
|
||||
Files.writeString(source.getParent().resolve("config.yml"), "language: en_US\nbackpack: true\nold-option: kept\n");
|
||||
Files.writeString(target.getParent().resolve("config.yml"), "language: zh_CN\nbackpack: false\n");
|
||||
|
||||
LegacyDirectoryImporter importer = importer(plugins, plugins.resolve("MagicGem"), () -> { });
|
||||
LegacyDirectoryImporter.ImportResult result = importer.importIfPresent();
|
||||
|
||||
YamlConfiguration mergedGem = load(currentGem);
|
||||
YamlConfiguration mergedConfig = load(target.getParent().resolve("config.yml"));
|
||||
assertEquals("Current Name", mergedGem.getString("Shared.Name"));
|
||||
assertEquals("retained", mergedGem.getString("Shared.OldOnly"));
|
||||
assertEquals("retained", mergedGem.getString("Shared.CurrentOnly"));
|
||||
assertTrue(Files.isRegularFile(target.resolve("Custom.yml")));
|
||||
assertEquals("zh_CN", mergedConfig.getString("language"));
|
||||
assertEquals(false, mergedConfig.getBoolean("backpack"));
|
||||
assertEquals("kept", mergedConfig.getString("old-option"));
|
||||
assertTrue(Files.isRegularFile(plugins.resolve("MagicGem/migration-backup/CMagicGem/gems/Shared.yml")));
|
||||
assertEquals("Old Name", load(oldGem).getString("Shared.Name"));
|
||||
assertTrue(result.copiedFiles() >= 1);
|
||||
assertTrue(result.mergedFiles() >= 2);
|
||||
assertTrue(result.conflictFiles() >= 1);
|
||||
|
||||
LegacyDirectoryImporter.ImportResult repeated = importer.importIfPresent();
|
||||
assertTrue(repeated.alreadyMigrated());
|
||||
assertEquals(0, repeated.copiedFiles());
|
||||
}
|
||||
|
||||
@Test
|
||||
void oldConfigurationOverridesBundledDefaultsWhenTargetHasNoConfig() throws Exception {
|
||||
Path plugins = Files.createDirectory(temporaryDirectory.resolve("plugins"));
|
||||
Path source = Files.createDirectories(plugins.resolve("CMagicGem"));
|
||||
Path target = plugins.resolve("MagicGem");
|
||||
Files.writeString(source.resolve("config.yml"), "lang: en_US\nbackpack: true\n");
|
||||
Runnable createDefaults = () -> {
|
||||
try {
|
||||
Files.createDirectories(target);
|
||||
Files.writeString(target.resolve("config.yml"), "language: zh_CN\nbackpack: false\nworkbench: true\n");
|
||||
} catch (IOException exception) {
|
||||
throw new IllegalStateException(exception);
|
||||
}
|
||||
};
|
||||
|
||||
LegacyDirectoryImporter.ImportResult result = importer(plugins, target, createDefaults).importIfPresent();
|
||||
|
||||
YamlConfiguration config = load(target.resolve("config.yml"));
|
||||
assertEquals("en_US", config.getString("language"));
|
||||
assertEquals(true, config.getBoolean("backpack"));
|
||||
assertEquals(true, config.getBoolean("workbench"));
|
||||
assertTrue(result.configImported());
|
||||
}
|
||||
|
||||
@Test
|
||||
void originalMagicGemDirectoryIsTreatedAsTheActiveTarget() throws Exception {
|
||||
Path plugins = Files.createDirectory(temporaryDirectory.resolve("plugins"));
|
||||
Path target = Files.createDirectory(plugins.resolve("MagicGem"));
|
||||
|
||||
LegacyDirectoryImporter.ImportResult result = importer(plugins, target, () -> { }).importIfPresent();
|
||||
|
||||
assertFalse(result.alreadyMigrated());
|
||||
assertFalse(Files.exists(target.resolve(".migration-cmagicgem-v1.complete")));
|
||||
}
|
||||
|
||||
private LegacyDirectoryImporter importer(Path plugins, Path target, Runnable saveDefaults) {
|
||||
return new LegacyDirectoryImporter(plugins, target, saveDefaults, Logger.getLogger("migration-test"));
|
||||
}
|
||||
|
||||
private YamlConfiguration load(Path path) {
|
||||
return YamlConfiguration.loadConfiguration(path.toFile());
|
||||
}
|
||||
}
|
||||
@@ -23,13 +23,19 @@ class BundledConfigurationTest {
|
||||
private final DirectiveParser parser = new DirectiveParser();
|
||||
|
||||
@Test
|
||||
void pluginDescriptorOnlyRegistersNewCommandNames() {
|
||||
void pluginDescriptorKeepsLegacyCommandAndPermissionCompatibility() {
|
||||
YamlConfiguration descriptor = YamlConfiguration.loadConfiguration(new File("src/main/resources/plugin.yml"));
|
||||
|
||||
assertNotNull(descriptor.getConfigurationSection("commands.cmgem"));
|
||||
assertTrue(descriptor.getStringList("commands.cmgem.aliases").contains("cmg"));
|
||||
assertNull(descriptor.getConfigurationSection("commands.mgem"));
|
||||
assertTrue(descriptor.getString("name").equalsIgnoreCase("MagicGem"));
|
||||
assertTrue(descriptor.getString("main").equals("pku.yim.magicgem.MagicGem"));
|
||||
assertNotNull(descriptor.getConfigurationSection("commands.mgem"));
|
||||
assertTrue(descriptor.getStringList("commands.mgem.aliases").contains("cmg"));
|
||||
assertTrue(descriptor.getStringList("commands.mgem.aliases").contains("cmgem"));
|
||||
assertNull(descriptor.getConfigurationSection("commands.cmgem"));
|
||||
assertNull(descriptor.getConfigurationSection("commands.magicgem"));
|
||||
assertNotNull(descriptor.getConfigurationSection("permissions.magicgem.command.admin"));
|
||||
assertNotNull(descriptor.getConfigurationSection("permissions.magicgem.command.view"));
|
||||
assertNotNull(descriptor.getConfigurationSection("permissions.magicgem.command.embed"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user