diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminGetrankCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminGetrankCommand.java index ec1c0eb29..120cb1b87 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminGetrankCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminGetrankCommand.java @@ -7,12 +7,14 @@ import java.util.stream.Collectors; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +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; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.managers.RanksManager; +import world.bentobox.bentobox.util.Util; /** * @author tastybento @@ -20,47 +22,61 @@ import world.bentobox.bentobox.managers.RanksManager; */ public class AdminGetrankCommand extends CompositeCommand { + private Island island; + private @Nullable UUID targetUUID; + public AdminGetrankCommand(CompositeCommand adminCommand) { super(adminCommand, "getrank"); } @Override public void setup() { - setPermission("admin.setrank"); + setPermission("admin.getrank"); setOnlyPlayer(false); setParametersHelp("commands.admin.getrank.parameters"); setDescription("commands.admin.getrank.description"); } @Override - public boolean execute(User user, String label, List args) { + public boolean canExecute(User user, String label, List args) { if (args.size() != 1) { // 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; } - Island island = getIslands().getIsland(getWorld(), targetUUID); - if (island != null) { - // Get rank - RanksManager rm = getPlugin().getRanksManager(); - User target = User.getInstance(targetUUID); - int currentRank = island.getRank(target); - user.sendMessage("commands.admin.getrank.rank-is", TextVariables.RANK, user.getTranslation(rm.getRank(currentRank))); - return true; - } else { + island = getIslands().getIsland(getWorld(), targetUUID); + if (island == null) { user.sendMessage("general.errors.player-has-no-island"); return false; } + return true; + } + + @Override + public boolean execute(User user, String label, List args) { + // Get rank + RanksManager rm = getPlugin().getRanksManager(); + User target = User.getInstance(targetUUID); + int currentRank = island.getRank(target); + user.sendMessage("commands.admin.getrank.rank-is", TextVariables.RANK, user.getTranslation(rm.getRank(currentRank))); + return true; + } @Override public Optional> tabComplete(User user, String alias, List args) { - return Optional.of(Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList())); + if (args.isEmpty()) { + // Don't show every player on the server. Require at least the first letter + return Optional.empty(); + } + String lastArg = !args.isEmpty() ? args.get(args.size()-1) : ""; + List options = Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()); + return Optional.of(Util.tabLimit(options, lastArg)); } } diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminGetrankCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminGetrankCommandTest.java new file mode 100644 index 000000000..5e18fa8b5 --- /dev/null +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminGetrankCommandTest.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.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.verify; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +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.mockito.stubbing.Answer; +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 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 AdminGetrankCommandTest { + + private static final String[] NAMES = {"adam", "ben", "cara", "dave", "ed", "frank", "freddy", "george", "harry", "ian", "joe"}; + + @Mock + private CompositeCommand ac; + @Mock + private User user; + @Mock + private IslandsManager im; + @Mock + private PlayersManager pm; + + @Mock + private RanksManager rm; + private AdminGetrankCommand c; + + private UUID targetUUID; + + @Mock + private Island island; + + /** + * @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); + + // Bukkit - online players + Map online = new HashMap<>(); + + Set onlinePlayers = new HashSet<>(); + for (int j = 0; j < NAMES.length; j++) { + Player p1 = mock(Player.class); + UUID uuid = UUID.randomUUID(); + when(p1.getUniqueId()).thenReturn(uuid); + when(p1.getName()).thenReturn(NAMES[j]); + online.put(uuid, NAMES[j]); + onlinePlayers.add(p1); + } + PowerMockito.mockStatic(Bukkit.class); + when(Bukkit.getOnlinePlayers()).then((Answer>) invocation -> onlinePlayers); + + // Command + c = new AdminGetrankCommand(ac); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + User.clearUsers(); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminGetrankCommand#AdminGetrankCommand(world.bentobox.bentobox.api.commands.CompositeCommand)}. + */ + @Test + public void testAdminGetrankCommand() { + assertEquals("getrank", c.getLabel()); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminGetrankCommand#setup()}. + */ + @Test + public void testSetup() { + assertEquals("admin.getrank", c.getPermission()); + assertFalse(c.isOnlyPlayer()); + assertEquals("commands.admin.getrank.parameters", c.getParameters()); + assertEquals("commands.admin.getrank.description", c.getDescription()); + + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminGetrankCommand#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.AdminGetrankCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testCanExecuteUnknownPlayer() { + assertFalse(c.canExecute(user, "", Collections.singletonList("tastybento"))); + verify(user).sendMessage("general.errors.unknown-player", + "[name]", + "tastybento"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminGetrankCommand#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, "", Collections.singletonList("tastybento"))); + verify(user).sendMessage("general.errors.player-has-no-island"); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminGetrankCommand#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.getIsland(any(), any(UUID.class))).thenReturn(island); + when(user.getTranslation(anyString())).thenReturn("member"); + assertTrue(c.canExecute(user, "", Collections.singletonList("tastybento"))); + } + + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminGetrankCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testExecuteUserStringListOfString() { + // Set the target + testCanExecuteKnownPlayerHasIslandSuccess(); + when(island.getRank(any())).thenReturn(RanksManager.SUB_OWNER_RANK); + when(user.getTranslation(any())).thenReturn("sub-owner", "sub-owner"); + assertTrue(c.execute(user, "", Collections.singletonList("tastybento"))); + verify(user).sendMessage(eq("commands.admin.getrank.rank-is"), + eq("[rank]"), + eq("sub-owner")); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminGetrankCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testTabCompleteUserStringListOfStringNoChars() { + Optional> result = c.tabComplete(user, "", Collections.emptyList()); + assertFalse(result.isPresent()); + } + + /** + * Test method for {@link world.bentobox.bentobox.api.commands.admin.AdminGetrankCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. + */ + @Test + public void testTabCompleteUserStringListOfStringWithChars() { + Optional> result = c.tabComplete(user, "", Collections.singletonList("g")); + assertTrue(result.isPresent()); + result.ifPresent(list -> { + assertEquals(1, list.size()); + }); + // Two names + result = c.tabComplete(user, "", Collections.singletonList("f")); + assertTrue(result.isPresent()); + result.ifPresent(list -> { + assertEquals(2, list.size()); + }); + } + +} 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 index 28f6615af..daa11c512 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminSetrankCommandTest.java @@ -3,12 +3,12 @@ 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.Mockito.any; -import static org.mockito.Mockito.anyString; +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.verify; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.eq; import java.util.Arrays; import java.util.Collections;