From ff91255a6a2ceb320625f27f2189a1bac73f81dd Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 27 Jul 2019 21:01:14 -0700 Subject: [PATCH] Prevents setting rank of visitor or lower. https://github.com/BentoBoxWorld/BentoBox/issues/849 Adds test class for admin setrank command. --- .../commands/admin/AdminSetrankCommand.java | 24 +- src/main/resources/locales/en-US.yml | 1 + .../admin/AdminSetrankCommandTest.java | 226 ++++++++++++++++++ .../IslandTeamInviteAcceptCommandTest.java | 3 +- 4 files changed, 247 insertions(+), 7 deletions(-) create mode 100644 src/test/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommandTest.java diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommand.java index 0293bbc58..6ced5075d 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommand.java @@ -6,6 +6,8 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; +import org.eclipse.jdt.annotation.Nullable; + import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; @@ -18,6 +20,10 @@ import world.bentobox.bentobox.managers.RanksManager; */ public class AdminSetrankCommand extends CompositeCommand { + private int rankValue; + private @Nullable UUID targetUUID; + private RanksManager rm; + public AdminSetrankCommand(CompositeCommand adminCommand) { super(adminCommand, "setrank"); } @@ -28,17 +34,18 @@ public class AdminSetrankCommand extends CompositeCommand { setOnlyPlayer(false); setParametersHelp("commands.admin.setrank.parameters"); setDescription("commands.admin.setrank.description"); + rm = getPlugin().getRanksManager(); } @Override - public boolean execute(User user, String label, List args) { + public boolean canExecute(User user, String label, List args) { if (args.size() != 2) { // Show help showHelp(this, user); return false; } // Get target player - UUID targetUUID = getPlayers().getUUID(args.get(0)); + targetUUID = getPlayers().getUUID(args.get(0)); if (targetUUID == null) { user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); return false; @@ -48,16 +55,23 @@ public class AdminSetrankCommand extends CompositeCommand { return false; } // Get rank - RanksManager rm = getPlugin().getRanksManager(); - int rankValue = rm.getRanks().entrySet().stream() + rankValue = rm.getRanks().entrySet().stream() .filter(r -> user.getTranslation(r.getKey()).equalsIgnoreCase(args.get(1))).findFirst() .map(Map.Entry::getValue).orElse(-999); if (rankValue < RanksManager.BANNED_RANK) { user.sendMessage("commands.admin.setrank.unknown-rank"); return false; } - User target = User.getInstance(targetUUID); + if (rankValue <= RanksManager.VISITOR_RANK) { + user.sendMessage("commands.admin.setrank.not-possible"); + return false; + } + return true; + } + @Override + public boolean execute(User user, String label, List args) { + User target = User.getInstance(targetUUID); Island island = getPlugin().getIslands().getIsland(getWorld(), targetUUID); int currentRank = island.getRank(target); island.setRank(target, rankValue); diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 800e28fca..4620e0bfc 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -211,6 +211,7 @@ commands: parameters: " " description: "set a player's rank on their island" unknown-rank: "&cUnknown rank!" + not-possible: "&cRank must be higher than visitor" rank-set: "&aRank set from [from] to [to]." setspawn: description: "set an island as spawn for this world" diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommandTest.java new file mode 100644 index 000000000..dc9ede4dd --- /dev/null +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommandTest.java @@ -0,0 +1,226 @@ +package world.bentobox.bentobox.api.commands.admin; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.commands.CompositeCommand; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.managers.IslandsManager; +import world.bentobox.bentobox.managers.PlayersManager; +import world.bentobox.bentobox.managers.RanksManager; + +/** + * @author tastybento + * + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({Bukkit.class, BentoBox.class, User.class }) +public class AdminSetrankCommandTest { + + @Mock + private CompositeCommand ac; + @Mock + private User user; + @Mock + private IslandsManager im; + @Mock + private PlayersManager pm; + + @Mock + private RanksManager rm; + private AdminSetrankCommand c; + + private UUID targetUUID; + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + // Set up plugin + BentoBox plugin = mock(BentoBox.class); + Whitebox.setInternalState(BentoBox.class, "instance", plugin); + + // Ranks Manager + when(plugin.getRanksManager()).thenReturn(rm); + + // Players Manager + when(plugin.getPlayers()).thenReturn(pm); + + // Islands manager + when(plugin.getIslands()).thenReturn(im); + + // Target + targetUUID = UUID.randomUUID(); + Player p = mock(Player.class); + when(p.getUniqueId()).thenReturn(targetUUID); + User.getInstance(p); + + // Command + c = new AdminSetrankCommand(ac); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + User.clearUsers(); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#AdminSetrankCommand(world.bentobox.bentobox.api.commands.CompositeCommand)}. + */ + @Test + public void testAdminSetrankCommand() { + assertEquals("setrank", c.getLabel()); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#setup()}. + */ + @Test + public void testSetup() { + assertEquals("admin.setrank", c.getPermission()); + assertFalse(c.isOnlyPlayer()); + assertEquals("commands.admin.setrank.parameters", c.getParameters()); + assertEquals("commands.admin.setrank.description", c.getDescription()); + + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testCanExecuteNoArgs() { + assertFalse(c.canExecute(user, "", Collections.emptyList())); + verify(user).getTranslation("commands.help.console"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testCanExecuteOneArg() { + assertFalse(c.canExecute(user, "", Collections.singletonList("test"))); + verify(user).getTranslation("commands.help.console"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testCanExecuteUnknownPlayer() { + assertFalse(c.canExecute(user, "", Arrays.asList("tastybento", "member"))); + verify(user).sendMessage("general.errors.unknown-player", + "[name]", + "tastybento"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testCanExecuteKnownPlayerNoIsland() { + when(pm.getUUID(any())).thenReturn(targetUUID); + assertFalse(c.canExecute(user, "", Arrays.asList("tastybento", "member"))); + verify(user).sendMessage("general.errors.player-has-no-island"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testCanExecuteKnownPlayerHasIslandUnknownRank() { + when(pm.getUUID(any())).thenReturn(targetUUID); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(true); + assertFalse(c.canExecute(user, "", Arrays.asList("tastybento", "xxx"))); + verify(user).sendMessage("commands.admin.setrank.unknown-rank"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testCanExecuteKnownPlayerHasIslandTooLowRank() { + when(pm.getUUID(any())).thenReturn(targetUUID); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(true); + when(rm.getRanks()).thenReturn(Collections.singletonMap("visitor", 0)); + when(user.getTranslation(anyString())).thenReturn("visitor"); + assertFalse(c.canExecute(user, "", Arrays.asList("tastybento", "visitor"))); + verify(user).sendMessage("commands.admin.setrank.not-possible"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testCanExecuteKnownPlayerHasIslandSuccess() { + when(pm.getUUID(any())).thenReturn(targetUUID); + when(im.hasIsland(any(), any(UUID.class))).thenReturn(true); + when(rm.getRanks()).thenReturn(Collections.singletonMap("member", 500)); + when(user.getTranslation(anyString())).thenReturn("member"); + assertTrue(c.canExecute(user, "", Arrays.asList("tastybento", "member"))); + } + + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfString() { + // Set the target + testCanExecuteKnownPlayerHasIslandSuccess(); + Island island = mock(Island.class); + when(island.getRank(any())).thenReturn(RanksManager.SUB_OWNER_RANK); + when(im.getIsland(any(), any(UUID.class))).thenReturn(island); + when(user.getTranslation(anyString())).thenReturn("sub-owner", "member"); + assertTrue(c.execute(user, "", Arrays.asList("tastybento", "member"))); + verify(user).sendMessage("commands.admin.setrank.rank-set", + "[from]", + "sub-owner", + "[to]", + "member"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminSetrankCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testTabCompleteUserStringListOfString() { + when(rm.getRanks()).thenReturn(Collections.singletonMap("visitor", 0)); + when(user.getTranslation(anyString())).thenReturn("visitor"); + Optional> result = c.tabComplete(user, "", Collections.emptyList()); + assertTrue(result.isPresent()); + result.ifPresent(list -> { + assertTrue(list.size() == 1); + assertEquals("visitor", list.get(0)); + }); + } + +} diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommandTest.java index f3e2cb5c5..1bb05c49d 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommandTest.java @@ -3,9 +3,9 @@ package world.bentobox.bentobox.api.commands.island.team; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.any; import java.util.Collections; import java.util.HashMap; @@ -21,7 +21,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.stubbing.Answer; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner;