496 lines
18 KiB
Java
496 lines
18 KiB
Java
package world.bentobox.bentobox.managers;
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.assertFalse;
|
|
import static org.junit.Assert.assertNotNull;
|
|
import static org.junit.Assert.assertNull;
|
|
import static org.junit.Assert.assertTrue;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
import static org.mockito.ArgumentMatchers.eq;
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.never;
|
|
import static org.mockito.Mockito.verify;
|
|
import static org.mockito.Mockito.when;
|
|
|
|
import java.io.File;
|
|
import java.nio.file.Files;
|
|
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.configuration.InvalidConfigurationException;
|
|
import org.bukkit.configuration.file.YamlConfiguration;
|
|
import org.bukkit.event.Listener;
|
|
import org.bukkit.generator.ChunkGenerator;
|
|
import org.bukkit.permissions.PermissionDefault;
|
|
import org.bukkit.plugin.PluginManager;
|
|
import org.bukkit.util.permissions.DefaultPermissions;
|
|
import org.eclipse.jdt.annotation.NonNull;
|
|
import org.eclipse.jdt.annotation.Nullable;
|
|
import org.junit.After;
|
|
import org.junit.Before;
|
|
import org.junit.Test;
|
|
import org.junit.runner.RunWith;
|
|
import org.mockito.Mock;
|
|
import org.mockito.Mockito;
|
|
import org.powermock.api.mockito.PowerMockito;
|
|
import org.powermock.core.classloader.annotations.PrepareForTest;
|
|
import org.powermock.modules.junit4.PowerMockRunner;
|
|
import org.powermock.reflect.Whitebox;
|
|
|
|
import com.github.puregero.multilib.MultiLib;
|
|
|
|
import world.bentobox.bentobox.BentoBox;
|
|
import world.bentobox.bentobox.Settings;
|
|
import world.bentobox.bentobox.api.addons.Addon;
|
|
import world.bentobox.bentobox.api.addons.Addon.State;
|
|
import world.bentobox.bentobox.api.addons.AddonDescription;
|
|
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
|
import world.bentobox.bentobox.api.addons.exceptions.InvalidAddonDescriptionException;
|
|
import world.bentobox.bentobox.api.configuration.WorldSettings;
|
|
import world.bentobox.bentobox.database.DatabaseSetup.DatabaseType;
|
|
import world.bentobox.bentobox.database.objects.DataObject;
|
|
|
|
@RunWith(PowerMockRunner.class)
|
|
@PrepareForTest({ Bukkit.class, BentoBox.class, DefaultPermissions.class, MultiLib.class })
|
|
public class AddonsManagerTest {
|
|
|
|
private BentoBox plugin;
|
|
private AddonsManager am;
|
|
@Mock
|
|
private PluginManager pm;
|
|
@Mock
|
|
private CommandsManager cm;
|
|
|
|
/**
|
|
*/
|
|
@Before
|
|
public void setup() throws Exception {
|
|
PowerMockito.mockStatic(Bukkit.class);
|
|
when(Bukkit.getPluginManager()).thenReturn(pm);
|
|
// Set up plugin
|
|
plugin = mock(BentoBox.class);
|
|
Whitebox.setInternalState(BentoBox.class, "instance", plugin);
|
|
FlagsManager fm = mock(FlagsManager.class);
|
|
when(plugin.getFlagsManager()).thenReturn(fm);
|
|
|
|
am = new AddonsManager(plugin);
|
|
|
|
// Command Manager
|
|
when(plugin.getCommandsManager()).thenReturn(cm);
|
|
Settings s = mock(Settings.class);
|
|
when(s.getDatabaseType()).thenReturn(DatabaseType.MYSQL);
|
|
// settings
|
|
when(plugin.getSettings()).thenReturn(s);
|
|
|
|
PowerMockito.mockStatic(DefaultPermissions.class);
|
|
|
|
PowerMockito.mockStatic(MultiLib.class, Mockito.RETURNS_MOCKS);
|
|
}
|
|
|
|
/**
|
|
*/
|
|
@After
|
|
public void tearDown() throws Exception {
|
|
// Delete the addons folder
|
|
File f = new File(plugin.getDataFolder(), "addons");
|
|
Files.deleteIfExists(f.toPath());
|
|
Mockito.framework().clearInlineMocks();
|
|
}
|
|
|
|
// TODO - add test cases that actually load an addon
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#AddonsManager(world.bentobox.bentobox.BentoBox)}.
|
|
*/
|
|
@Test
|
|
public void testAddonsManager() {
|
|
AddonsManager addonsManager = new AddonsManager(plugin);
|
|
|
|
assertNotNull(addonsManager.getAddons());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#loadAddons()}.
|
|
*/
|
|
@Test
|
|
public void testLoadAddonsNoAddons() {
|
|
am.loadAddons();
|
|
verify(plugin, never()).logError("Cannot create addons folder!");
|
|
verify(plugin).log("Loaded 0 addons.");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#enableAddons()}.
|
|
*/
|
|
@Test
|
|
public void testEnableAddonsNoAddon() {
|
|
am.enableAddons();
|
|
verify(plugin, never()).log("Enabling addons...");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#reloadAddons()}.
|
|
*/
|
|
@Test
|
|
public void testReloadAddonsNoAddons() {
|
|
am.reloadAddons();
|
|
verify(plugin, never()).log("Disabling addons...");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getAddonByName(java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testGetAddonByNameNoAddons() {
|
|
assertFalse(am.getAddonByName("name").isPresent());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#disableAddons()}.
|
|
*/
|
|
@Test
|
|
public void testDisableAddonsNoAddons() {
|
|
am.disableAddons();
|
|
verify(plugin, never()).log("Disabling addons...");
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getAddons()}.
|
|
*/
|
|
@Test
|
|
public void testGetAddonsNoAddons() {
|
|
assertTrue(am.getAddons().isEmpty());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getGameModeAddons()}.
|
|
*/
|
|
@Test
|
|
public void testGetGameModeAddonsNoAddons() {
|
|
assertTrue(am.getGameModeAddons().isEmpty());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getLoadedAddons()}.
|
|
*/
|
|
@Test
|
|
public void testGetLoadedAddonsnoAddons() {
|
|
assertTrue(am.getLoadedAddons().isEmpty());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getEnabledAddons()}.
|
|
*/
|
|
@Test
|
|
public void testGetEnabledAddonsNoAddons() {
|
|
assertTrue(am.getEnabledAddons().isEmpty());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getLoader(world.bentobox.bentobox.api.addons.Addon)}.
|
|
*/
|
|
@Test
|
|
public void testGetLoaderNoSuchAddon() {
|
|
Addon addon = mock(Addon.class);
|
|
assertNull(am.getLoader(addon));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getClassByName(java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testGetClassByNameNull() {
|
|
assertNull(am.getClassByName("name"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#setClass(java.lang.String, java.lang.Class)}.
|
|
*/
|
|
@Test
|
|
public void testSetClass() {
|
|
am.setClass("name", Class.class);
|
|
assertNotNull(am.getClassByName("name"));
|
|
assertEquals(Class.class, am.getClassByName("name"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getDefaultWorldGenerator(java.lang.String, java.lang.String)}.
|
|
*/
|
|
@Test
|
|
public void testGetDefaultWorldGeneratorNoWorlds() {
|
|
assertNull(am.getDefaultWorldGenerator("BSkyBlock", ""));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#registerListener(world.bentobox.bentobox.api.addons.Addon, org.bukkit.event.Listener)}.
|
|
*/
|
|
@Test
|
|
public void testRegisterListener() {
|
|
@NonNull
|
|
Addon addon = mock(Addon.class);
|
|
|
|
@NonNull
|
|
Listener listener = mock(Listener.class);
|
|
am.registerListener(addon, listener);
|
|
verify(pm).registerEvents(listener, plugin);
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getDataObjects()}.
|
|
*/
|
|
@Test
|
|
public void testGetDataObjectsNone() {
|
|
assertTrue(am.getDataObjects().isEmpty());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#getDataObjects()}.
|
|
*/
|
|
@Test
|
|
public void testGetDataObjects() {
|
|
am.setClass("dataobj", DataObject.class);
|
|
assertFalse(am.getDataObjects().isEmpty());
|
|
assertEquals(1, am.getDataObjects().size());
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxSnapshotNoAPIVersion() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1-SNAPSHOT-b1642"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxReleaseAPIVersion() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").apiVersion("1.0.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxSnapshotAPIVersion() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").apiVersion("1.0.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1-SNAPSHOT-b1642"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxReleaseNoAPIVersion() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.0.1"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxSnapshotAPIVersionVariableDigits() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.1").apiVersion("1.2.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.2-SNAPSHOT-b1642"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxOldSnapshot() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.0.1-SNAPSHOT-b1642"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxOldRelease() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.0.1"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxOldReleaseLong() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.11.1.11.1.1"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxOldReleaseLongAPI() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1.0.0.0.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.11.1"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link AddonsManager#isAddonCompatibleWithBentoBox(Addon, String)}.
|
|
* Prevents regression on <a href="https://github.com/BentoBoxWorld/BentoBox/issues/1346">issue 1346</a>.
|
|
*/
|
|
@Test
|
|
public void testIsAddonCompatibleWithBentoBoxNewRelease() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.13.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertTrue(am.isAddonCompatibleWithBentoBox(addon, "1.14.0-SNAPSHOT-b1777"));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#setPerms(Addon)}
|
|
*/
|
|
@Test
|
|
public void testSetPermsNoPerms() {
|
|
Addon addon = mock(Addon.class);
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1.0.0.0.1").build();
|
|
when(addon.getDescription()).thenReturn(addonDesc);
|
|
assertFalse(am.setPerms(addon));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#setPerms(Addon)}
|
|
*/
|
|
@Test
|
|
public void testSetPermsHasPerms() throws InvalidConfigurationException {
|
|
String perms =
|
|
" '[gamemode].intopten':\n" +
|
|
" description: Player is in the top ten.\n" +
|
|
" default: true\n";
|
|
YamlConfiguration config = new YamlConfiguration();
|
|
config.loadFromString(perms);
|
|
GameModeAddon addon = new MyGameMode();
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "mygame", "1.0.0").apiVersion("1.11.1.0.0.0.1")
|
|
.permissions(config)
|
|
.build();
|
|
addon.setDescription(addonDesc);
|
|
addon.setState(State.ENABLED);
|
|
am.getAddons().add(addon);
|
|
|
|
assertTrue(am.setPerms(addon));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#setPerms(Addon)}
|
|
*/
|
|
@Test
|
|
public void testSetPermsHasPermsError() throws InvalidConfigurationException {
|
|
String perms =
|
|
" '[gamemode].intopten':\n" +
|
|
" description: Player is in the top ten.\n" +
|
|
" default: trudsfgsde\n";
|
|
YamlConfiguration config = new YamlConfiguration();
|
|
config.loadFromString(perms);
|
|
GameModeAddon addon = new MyGameMode();
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "mygame", "1.0.0").apiVersion("1.11.1.0.0.0.1")
|
|
.permissions(config)
|
|
.build();
|
|
addon.setDescription(addonDesc);
|
|
addon.setState(State.ENABLED);
|
|
am.getAddons().add(addon);
|
|
|
|
assertTrue(am.setPerms(addon));
|
|
verify(plugin).logError(eq("Addon mygame: AddonException : Permission default is invalid in addon.yml: [gamemode].intopten.default"));
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#registerPermission(org.bukkit.configuration.ConfigurationSection, String)}
|
|
*/
|
|
@Test
|
|
public void testRegisterPermissionStandardPerm() throws InvalidAddonDescriptionException, InvalidConfigurationException {
|
|
String perms =
|
|
" 'bskyblock.intopten':\n" +
|
|
" description: Player is in the top ten.\n" +
|
|
" default: true\n";
|
|
YamlConfiguration config = new YamlConfiguration();
|
|
config.loadFromString(perms);
|
|
am.registerPermission(config, "bskyblock.intopten");
|
|
PowerMockito.verifyStatic(DefaultPermissions.class);
|
|
DefaultPermissions.registerPermission(eq("bskyblock.intopten"), anyString(), any(PermissionDefault.class));
|
|
}
|
|
|
|
/**
|
|
* Test method for {@link world.bentobox.bentobox.managers.AddonsManager#registerPermission(org.bukkit.configuration.ConfigurationSection, String)}
|
|
*/
|
|
@Test
|
|
public void testRegisterPermissionGameModePerm() throws InvalidAddonDescriptionException, InvalidConfigurationException {
|
|
String perms =
|
|
" '[gamemode].intopten':\n" +
|
|
" description: Player is in the top ten.\n" +
|
|
" default: true\n";
|
|
YamlConfiguration config = new YamlConfiguration();
|
|
config.loadFromString(perms);
|
|
GameModeAddon addon = new MyGameMode();
|
|
AddonDescription addonDesc = new AddonDescription.Builder("main.class", "mygame", "1.0.0").apiVersion("1.11.1.0.0.0.1")
|
|
.permissions(config)
|
|
.build();
|
|
addon.setDescription(addonDesc);
|
|
addon.setState(State.ENABLED);
|
|
am.getAddons().add(addon);
|
|
am.registerPermission(config, "[gamemode].intopten");
|
|
PowerMockito.verifyStatic(DefaultPermissions.class);
|
|
DefaultPermissions.registerPermission(eq("mygame.intopten"), anyString(), any(PermissionDefault.class));
|
|
}
|
|
|
|
|
|
|
|
class MyGameMode extends GameModeAddon {
|
|
|
|
@Override
|
|
public void createWorlds() {
|
|
}
|
|
|
|
@Override
|
|
public WorldSettings getWorldSettings() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public @Nullable ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void saveWorldSettings() {
|
|
}
|
|
|
|
@Override
|
|
public void onEnable() {
|
|
}
|
|
|
|
@Override
|
|
public void onDisable() {
|
|
}
|
|
|
|
}
|
|
}
|