diff --git a/src/test/java/dansplugins/playerlore/commands/AddCommandTest.java b/src/test/java/dansplugins/playerlore/commands/AddCommandTest.java new file mode 100644 index 0000000..4e25e70 --- /dev/null +++ b/src/test/java/dansplugins/playerlore/commands/AddCommandTest.java @@ -0,0 +1,99 @@ +package dansplugins.playerlore.commands; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.anyString; +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.List; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.ItemMeta; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class AddCommandTest { + + private AddCommand addCommand; + private Player player; + private PlayerInventory inventory; + private ItemStack item; + private ItemMeta itemMeta; + + @BeforeEach + public void setUp() { + addCommand = new AddCommand(); + player = mock(Player.class); + inventory = mock(PlayerInventory.class); + item = mock(ItemStack.class); + itemMeta = mock(ItemMeta.class); + + when(player.getInventory()).thenReturn(inventory); + when(inventory.getItemInMainHand()).thenReturn(item); + when(item.getType()).thenReturn(Material.DIAMOND_SWORD); + when(item.getItemMeta()).thenReturn(itemMeta); + } + + @Test + public void execute_addsLoreLineWhenItemHasNoExistingLore() { + when(itemMeta.getLore()).thenReturn(null); + + boolean result = addCommand.execute(player, new String[]{"\"new line\""}); + + assertTrue(result); + verify(itemMeta).setLore(Arrays.asList(ChatColor.WHITE + "new line")); + } + + @Test + public void execute_appendsLoreLineWhenItemHasExistingLore() { + List lore = new ArrayList<>(Arrays.asList("original line")); + when(itemMeta.getLore()).thenReturn(lore); + + boolean result = addCommand.execute(player, new String[]{"\"new line\""}); + + assertTrue(result); + verify(itemMeta).setLore(Arrays.asList("original line", ChatColor.WHITE + "new line")); + } + + @Test + public void execute_missingArgs_throwsInsteadOfSendingUsageMessage() { + // Unlike EditCommand/RemoveCommand, AddCommand has no args.length guard before parsing (see #10). + assertThrows(IllegalArgumentException.class, () -> addCommand.execute(player, new String[]{})); + } + + @Test + public void execute_rejectsWhenNotHoldingAnItem() { + when(item.getType()).thenReturn(Material.AIR); + + boolean result = addCommand.execute(player, new String[]{"\"new line\""}); + + assertFalse(result); + } + + @Test + public void execute_rejectsNonPlayerSender() { + CommandSender commandSender = mock(CommandSender.class); + + boolean result = addCommand.execute(commandSender, new String[]{"\"new line\""}); + + assertFalse(result); + } + + @Test + public void execute_noArgs_sendsUsageMessage() { + boolean result = addCommand.execute(player); + + assertFalse(result); + verify(player).sendMessage(anyString()); + } +} diff --git a/src/test/java/dansplugins/playerlore/commands/HelpCommandTest.java b/src/test/java/dansplugins/playerlore/commands/HelpCommandTest.java new file mode 100644 index 0000000..b20e7fb --- /dev/null +++ b/src/test/java/dansplugins/playerlore/commands/HelpCommandTest.java @@ -0,0 +1,37 @@ +package dansplugins.playerlore.commands; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.contains; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import org.bukkit.command.CommandSender; +import org.junit.jupiter.api.Test; + +public class HelpCommandTest { + + @Test + public void execute_noArgs_listsAllCommands() { + HelpCommand helpCommand = new HelpCommand(); + CommandSender commandSender = mock(CommandSender.class); + + boolean result = helpCommand.execute(commandSender); + + assertTrue(result); + verify(commandSender).sendMessage(contains("/pl help")); + verify(commandSender).sendMessage(contains("/pl add")); + verify(commandSender).sendMessage(contains("/pl edit")); + verify(commandSender).sendMessage(contains("/pl remove")); + } + + @Test + public void execute_withArgs_delegatesToNoArgVersion() { + HelpCommand helpCommand = new HelpCommand(); + CommandSender commandSender = mock(CommandSender.class); + + boolean result = helpCommand.execute(commandSender, new String[]{"ignored"}); + + assertTrue(result); + verify(commandSender).sendMessage(contains("/pl help")); + } +}