From 02e8243bd0b98b96b081dba4754aa3d8fbf1fdcd Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 18 Oct 2019 19:32:54 -0500 Subject: [PATCH] Fixed admin register of spawn island. https://github.com/BentoBoxWorld/BentoBox/issues/991 --- .../commands/admin/AdminRegisterCommand.java | 18 ++- .../bentobox/managers/IslandsManager.java | 13 +++ src/main/resources/locales/en-US.yml | 1 + .../admin/AdminRegisterCommandTest.java | 110 +++++++++--------- .../bentobox/managers/IslandsManagerTest.java | 7 +- 5 files changed, 85 insertions(+), 64 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminRegisterCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminRegisterCommand.java index cd395783a..c7101560a 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminRegisterCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminRegisterCommand.java @@ -66,10 +66,23 @@ public class AdminRegisterCommand extends ConfirmableCommand { user.sendMessage("commands.admin.register.already-owned"); return false; } + // Check if island is spawn + if (island.map(i -> i.isSpawn()).orElse(false)) { + askConfirmation(user, user.getTranslation("commands.admin.register.island-is-spawn"), () -> register(user, targetUUID, island, closestIsland)); + return false; + } + return register(user, targetUUID, island, closestIsland); + + } + + private boolean register(User user, UUID targetUUID, Optional island, Location closestIsland) { // Register island if it exists if (!island.map(i -> { // Island exists getIslands().setOwner(user, targetUUID, i); + if (i.isSpawn()) { + getIslands().clearSpawn(i.getWorld()); + } user.sendMessage("commands.admin.register.registered-island", "[xyz]", Util.xyz(i.getCenter().toVector())); user.sendMessage("general.success"); IslandBaseEvent event = IslandEvent.builder() @@ -79,7 +92,7 @@ public class AdminRegisterCommand extends ConfirmableCommand { .involvedPlayer(targetUUID) .admin(true) .build(); - Bukkit.getServer().getPluginManager().callEvent(event); + Bukkit.getPluginManager().callEvent(event); return true; }).orElse(false)) { // Island does not exist - this is a reservation @@ -102,11 +115,12 @@ public class AdminRegisterCommand extends ConfirmableCommand { .involvedPlayer(targetUUID) .admin(true) .build(); - Bukkit.getServer().getPluginManager().callEvent(event); + Bukkit.getPluginManager().callEvent(event); }); return false; } return true; + } @Override diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java index 34570500b..f3a870990 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java @@ -789,6 +789,19 @@ public class IslandsManager { this.spawn.put(spawn.getWorld(), spawn); spawn.setSpawn(true); } + + /** + * Clears the spawn island for this world + * @param world - world + * @since 1.8.0 + */ + public void clearSpawn(World world) { + Island spawnIsland = spawn.get(Util.getWorld(world)); + if (spawnIsland != null) { + spawnIsland.setSpawn(false); + } + this.spawn.remove(world); + } /** * @param uniqueId - unique ID diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 6860d58a6..9ca25650c 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -150,6 +150,7 @@ commands: no-island-here: "&cThere is no island here. Confirm to make one." in-deletion: "&cThis island space is currently being deleted. Try later." cannot-make-island: "&cAn island cannot be placed here, sorry. See console for possible errors." + island-is-spawn: "&6Island is spawn. Are you sure? Enter command again to confirm." unregister: parameters: "" description: "unregister owner from island, but keep island blocks" diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminRegisterCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminRegisterCommandTest.java index fa4d3ea66..611b351be 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminRegisterCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminRegisterCommandTest.java @@ -2,18 +2,20 @@ package world.bentobox.bentobox.api.commands.admin; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Optional; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Server; import org.bukkit.entity.Player; import org.bukkit.plugin.PluginManager; import org.bukkit.scheduler.BukkitScheduler; @@ -21,7 +23,7 @@ import org.bukkit.util.Vector; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mockito; +import org.mockito.Mock; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @@ -47,12 +49,18 @@ import world.bentobox.bentobox.managers.PlayersManager; @PrepareForTest({Bukkit.class, BentoBox.class, User.class }) public class AdminRegisterCommandTest { + @Mock private CompositeCommand ac; private UUID uuid; + @Mock private User user; + @Mock private IslandsManager im; + @Mock private PlayersManager pm; + private UUID notUUID; + private IslandDeletionManager idm; /** @@ -71,7 +79,6 @@ public class AdminRegisterCommandTest { // Player Player p = mock(Player.class); // Sometimes use Mockito.withSettings().verboseLogging() - user = mock(User.class); when(user.isOp()).thenReturn(false); uuid = UUID.randomUUID(); notUUID = UUID.randomUUID(); @@ -84,7 +91,6 @@ public class AdminRegisterCommandTest { User.setPlugin(plugin); // Parent command has no aliases - ac = mock(CompositeCommand.class); when(ac.getSubCommandAliases()).thenReturn(new HashMap<>()); // Island World Manager @@ -93,16 +99,14 @@ public class AdminRegisterCommandTest { // Player has island to begin with - im = mock(IslandsManager.class); - when(im.hasIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(true); - when(im.hasIsland(Mockito.any(), Mockito.any(User.class))).thenReturn(true); - when(im.isOwner(Mockito.any(),Mockito.any())).thenReturn(true); - when(im.getOwner(Mockito.any(),Mockito.any())).thenReturn(uuid); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(true); + when(im.hasIsland(any(), any(User.class))).thenReturn(true); + when(im.isOwner(any(),any())).thenReturn(true); + when(im.getOwner(any(),any())).thenReturn(uuid); when(plugin.getIslands()).thenReturn(im); // Has team - pm = mock(PlayersManager.class); - when(im.inTeam(Mockito.any(), Mockito.eq(uuid))).thenReturn(true); + when(im.inTeam(any(), eq(uuid))).thenReturn(true); when(plugin.getPlayers()).thenReturn(pm); @@ -113,19 +117,17 @@ public class AdminRegisterCommandTest { // Locales LocalesManager lm = mock(LocalesManager.class); - when(lm.get(Mockito.any(), Mockito.any())).thenReturn("mock translation"); + when(lm.get(any(), any())).thenReturn("mock translation"); when(plugin.getLocalesManager()).thenReturn(lm); // Deletion Manager idm = mock(IslandDeletionManager.class); - when(idm.inDeletion(Mockito.any())).thenReturn(false); + when(idm.inDeletion(any())).thenReturn(false); when(plugin.getIslandDeletionManager()).thenReturn(idm); // Plugin Manager - Server server = mock(Server.class); PluginManager pim = mock(PluginManager.class); - when(server.getPluginManager()).thenReturn(pim); - when(Bukkit.getServer()).thenReturn(server); + when(Bukkit.getPluginManager()).thenReturn(pim); } @@ -146,10 +148,9 @@ public class AdminRegisterCommandTest { @Test public void testExecuteUnknownPlayer() { AdminRegisterCommand itl = new AdminRegisterCommand(ac); - String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(null); - assertFalse(itl.execute(user, itl.getLabel(), Arrays.asList(name))); - Mockito.verify(user).sendMessage("general.errors.unknown-player", "[name]", name[0]); + when(pm.getUUID(any())).thenReturn(null); + assertFalse(itl.execute(user, itl.getLabel(), Collections.singletonList("tastybento"))); + verify(user).sendMessage(eq("general.errors.unknown-player"), eq("[name]"), eq("tastybento")); } /** @@ -158,12 +159,11 @@ public class AdminRegisterCommandTest { @Test public void testExecutePlayerHasIsland() { AdminRegisterCommand itl = new AdminRegisterCommand(ac); - String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(notUUID); - when(im.hasIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(true); - when(im.inTeam(Mockito.any(), Mockito.any())).thenReturn(false); - assertFalse(itl.execute(user, itl.getLabel(), Arrays.asList(name))); - Mockito.verify(user).sendMessage(Mockito.eq("general.errors.player-has-island")); + when(pm.getUUID(any())).thenReturn(notUUID); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(true); + when(im.inTeam(any(), any())).thenReturn(false); + assertFalse(itl.execute(user, itl.getLabel(), Collections.singletonList("tastybento"))); + verify(user).sendMessage(eq("general.errors.player-has-island")); } /** @@ -171,13 +171,12 @@ public class AdminRegisterCommandTest { */ @Test public void testExecuteInTeam() { - when(im.hasIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(false); - when(im.inTeam(Mockito.any(), Mockito.any())).thenReturn(true); - String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(notUUID); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(false); + when(im.inTeam(any(), any())).thenReturn(true); + when(pm.getUUID(any())).thenReturn(notUUID); AdminRegisterCommand itl = new AdminRegisterCommand(ac); - assertFalse(itl.execute(user, itl.getLabel(), Arrays.asList(name))); - Mockito.verify(user).sendMessage("commands.admin.register.cannot-register-team-player"); + assertFalse(itl.execute(user, itl.getLabel(), Collections.singletonList("tastybento"))); + verify(user).sendMessage("commands.admin.register.cannot-register-team-player"); } /** @@ -185,21 +184,20 @@ public class AdminRegisterCommandTest { */ @Test public void testExecuteAlreadyOwnedIsland() { - when(im.inTeam(Mockito.any(), Mockito.any())).thenReturn(false); - when(im.hasIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(false); - String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(notUUID); + when(im.inTeam(any(), any())).thenReturn(false); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(false); + when(pm.getUUID(any())).thenReturn(notUUID); Location loc = mock(Location.class); // Island has owner Island is = mock(Island.class); when(is.getOwner()).thenReturn(uuid); Optional opi = Optional.of(is); - when(im.getIslandAt(Mockito.any())).thenReturn(opi); + when(im.getIslandAt(any())).thenReturn(opi); when(user.getLocation()).thenReturn(loc); AdminRegisterCommand itl = new AdminRegisterCommand(ac); - assertFalse(itl.execute(user, itl.getLabel(), Arrays.asList(name))); - Mockito.verify(user).sendMessage("commands.admin.register.already-owned"); + assertFalse(itl.execute(user, itl.getLabel(), Collections.singletonList("tastybento"))); + verify(user).sendMessage("commands.admin.register.already-owned"); } /** @@ -207,22 +205,21 @@ public class AdminRegisterCommandTest { */ @Test public void testExecuteInDeletionIsland() { - when(idm.inDeletion(Mockito.any())).thenReturn(true); - when(im.inTeam(Mockito.any(), Mockito.any())).thenReturn(false); - when(im.hasIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(false); - String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(notUUID); + when(idm.inDeletion(any())).thenReturn(true); + when(im.inTeam(any(), any())).thenReturn(false); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(false); + when(pm.getUUID(any())).thenReturn(notUUID); Location loc = mock(Location.class); // Island has owner Island is = mock(Island.class); when(is.getOwner()).thenReturn(uuid); Optional opi = Optional.of(is); - when(im.getIslandAt(Mockito.any())).thenReturn(opi); + when(im.getIslandAt(any())).thenReturn(opi); when(user.getLocation()).thenReturn(loc); AdminRegisterCommand itl = new AdminRegisterCommand(ac); - assertFalse(itl.execute(user, itl.getLabel(), Arrays.asList(name))); - Mockito.verify(user).sendMessage("commands.admin.register.in-deletion"); + assertFalse(itl.execute(user, itl.getLabel(), Collections.singletonList("tastybento"))); + verify(user).sendMessage("commands.admin.register.in-deletion"); } /** @@ -230,24 +227,23 @@ public class AdminRegisterCommandTest { */ @Test public void testExecuteSuccess() { - when(im.inTeam(Mockito.any(), Mockito.any())).thenReturn(false); - when(im.hasIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(false); + when(im.inTeam(any(), any())).thenReturn(false); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(false); Island is = mock(Island.class); Location loc = mock(Location.class); when(loc.toVector()).thenReturn(new Vector(123,123,432)); when(is.getCenter()).thenReturn(loc); - when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(is); + when(im.getIsland(any(), any(UUID.class))).thenReturn(is); Optional opi = Optional.of(is); - when(im.getIslandAt(Mockito.any())).thenReturn(opi); + when(im.getIslandAt(any())).thenReturn(opi); when(user.getLocation()).thenReturn(loc); - String[] name = {"tastybento"}; - when(pm.getUUID(Mockito.any())).thenReturn(notUUID); + when(pm.getUUID(any())).thenReturn(notUUID); AdminRegisterCommand itl = new AdminRegisterCommand(ac); - assertTrue(itl.execute(user, itl.getLabel(), Arrays.asList(name))); + assertTrue(itl.execute(user, itl.getLabel(), Collections.singletonList("tastybento"))); // Add other verifications - Mockito.verify(user).sendMessage("commands.admin.register.registered-island", "[xyz]", "123,123,432"); - Mockito.verify(user).sendMessage(Mockito.eq("general.success")); + verify(user).sendMessage(eq("commands.admin.register.registered-island"), eq("[xyz]"), eq("123,123,432")); + verify(user).sendMessage(eq("general.success")); } } diff --git a/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java index 6e8270ade..a4682a7ab 100644 --- a/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/IslandsManagerTest.java @@ -33,7 +33,6 @@ import org.bukkit.Chunk; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Server; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -230,10 +229,8 @@ public class IslandsManagerTest { // User location when(user.getLocation()).thenReturn(location); - // Server for events - Server server = mock(Server.class); - when(Bukkit.getServer()).thenReturn(server); - when(server.getPluginManager()).thenReturn(pim); + // Plugin Manager for events + when(Bukkit.getPluginManager()).thenReturn(pim); // Addon when(iwm.getAddon(any())).thenReturn(Optional.empty());