/******************************************************************************* * Copyright 2014 Tobias Welther * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package de.tobiyas.racesandclasses.commands.chat.channels; import static de.tobiyas.racesandclasses.translation.languages.Keys.plugin_pre; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.LinkedList; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.configuration.managing.ConfigManager; import de.tobiyas.racesandclasses.configuration.member.file.MemberConfig; import de.tobiyas.racesandclasses.generate.PluginCommandFactory; import de.tobiyas.racesandclasses.generate.plugin.GenerateRaces; import de.tobiyas.racesandclasses.generate.plugin.MockRaCPlugin; import de.tobiyas.racesandclasses.tutorial.TutorialStepContainer; import de.tobiyas.racesandclasses.util.chat.ChannelLevel; import de.tobiyas.racesandclasses.util.consts.PermissionNode; import de.tobiyas.utils.tests.generate.server.GenerateBukkitServer; public class CommandExecutor_ChannelTest { private CommandExecutor_Channel sut; private Player sender; private String playerName = "player"; @Before public void setup(){ GenerateBukkitServer.generateServer(); GenerateRaces.generateRaces(); GenerateBukkitServer.generatePlayerOnServer(playerName); ConfigManager configManager = mock(ConfigManager.class, RETURNS_DEEP_STUBS); ((MockRaCPlugin) RacesAndClasses.getPlugin() ).setConfigManager(configManager); sut = new CommandExecutor_Channel(); sut.addObserver(RacesAndClasses.getPlugin().getTutorialManager()); sender = mock(Player.class); when(sender.getName()).thenReturn(playerName); when(RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_channels_enable()).thenReturn(true); } @After public void teardown(){ GenerateBukkitServer.dropServer(); GenerateRaces.dropMock(); } @Test public void registering_with_correct_executer_works(){ String commandName = "channel"; PluginCommand command = PluginCommandFactory.create(commandName, RacesAndClasses.getPlugin()); when(RacesAndClasses.getPlugin().getCommand(commandName)).thenReturn(command); sut = new CommandExecutor_Channel(); Assert.assertEquals(command.getExecutor(), sut); } private void verifyHelp(CommandSender sender){ verify(sender).sendMessage(plugin_pre + "wrong_command_use"); verify(sender).sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "info " + ChatColor.AQUA + "[channelname]"); verify(sender).sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "list"); verify(sender).sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "<post/change/switch> " + ChatColor.YELLOW + "<channelname>"); verify(sender).sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "join " + ChatColor.YELLOW + "<channelname> " + ChatColor.AQUA + "[@password@]"); verify(sender).sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "leave " + ChatColor.YELLOW + "<channelname> "); verify(sender).sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "create " + ChatColor.YELLOW + "<channelname> " + ChatColor.AQUA + "[channeltype] [@password@]"); verify(sender).sendMessage(ChatColor.RED + "/channel " + ChatColor.LIGHT_PURPLE + "edit " + ChatColor.YELLOW + "<channelname> " + ChatColor.AQUA + "<@channel_propertie@> <@new_value@>"); } @Test public void disabled_chat_gives_error_message(){ when(RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_channels_enable()).thenReturn(false); sut.onCommand(sender, null, "", new String[]{}); verify(sender).sendMessage(plugin_pre + "something_disabled"); } @Test public void console_can_use_help(){ sut.onCommand(sender, null, "", new String[]{}); verifyHelp(sender); } @Test public void test_channel_list(){ List<String> channels = new LinkedList<String>(); channels.add("channel1"); channels.add("channel2"); when(RacesAndClasses.getPlugin().getChannelManager().listAllPublicChannels()).thenReturn(channels); when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.PublicChannel); when(RacesAndClasses.getPlugin().getChannelManager().isMember(playerName, "channel1")).thenReturn(false); when(RacesAndClasses.getPlugin().getChannelManager().isMember(playerName, "channel2")).thenReturn(true); sut.onCommand(sender, null, "", new String[]{"list"}); verify(sender).sendMessage(ChatColor.YELLOW + "======" + ChatColor.RED + "Channel-List:" + ChatColor.YELLOW + "====="); verify(sender).sendMessage(ChatColor.YELLOW + "HINT: Format is: " + ChatColor.BLUE + "ChannelName: " + ChatColor.AQUA + "ChannelLevel"); verify(sender).sendMessage(ChatColor.BLUE + "channel1" + ": " + ChatColor.AQUA + ChannelLevel.PublicChannel.name()); verify(sender).sendMessage(ChatColor.BLUE + "channel2" + ": " + ChatColor.AQUA + ChannelLevel.PublicChannel.name() + ChatColor.YELLOW + " <-[Joined]"); } @Test public void console_can_use_info(){ String defaultChannel = "Global"; when(RacesAndClasses.getPlugin().getConfigManager().getMemberConfigManager().getConfigOfPlayer(playerName).getCurrentChannel()) .thenReturn(defaultChannel); sut.onCommand(sender, null, "", new String[]{"info"}); verify(sender).sendMessage(ChatColor.YELLOW + "=====" + ChatColor.RED + " Channel Information: " + ChatColor.AQUA + defaultChannel + ChatColor.YELLOW + " ====="); verify(RacesAndClasses.getPlugin().getChannelManager(), times(1)).postChannelInfo(sender, defaultChannel); } @Test public void console_may_not_use_all_commands(){ CommandSender sender = mock(CommandSender.class); when(sender.getName()).thenReturn("Console"); sut.onCommand(sender, null, "", new String[]{"change"}); verify(sender).sendMessage(plugin_pre + "only_players"); } @Test public void console_can_use_info_with_param(){ String defaultChannel = "Global"; when(RacesAndClasses.getPlugin().getConfigManager().getMemberConfigManager().getConfigOfPlayer(playerName).getCurrentChannel()) .thenReturn(defaultChannel); sut.onCommand(sender, null, "", new String[]{"info", defaultChannel}); verify(sender).sendMessage(ChatColor.YELLOW + "=====" + ChatColor.RED + " Channel Information: " + ChatColor.AQUA + defaultChannel + ChatColor.YELLOW + " ====="); verify(RacesAndClasses.getPlugin().getChannelManager(), times(1)).postChannelInfo(sender, defaultChannel); } @Test public void change_channel_with_valid_channel_works(){ String defaultChannel = "Global"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(defaultChannel)).thenReturn(ChannelLevel.GlobalChannel); when(RacesAndClasses.getPlugin().getChannelManager().isMember(anyString(), anyString())).thenReturn(true); sut.onCommand(sender, null, "", new String[]{"change", defaultChannel}); verify(sender).sendMessage(ChatColor.GREEN + "You now write in the channel: " + ChatColor.AQUA + defaultChannel); } @Test public void change_channel_to_valid_channel_but_not_member_fails(){ String defaultChannel = "Global"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(defaultChannel)).thenReturn(ChannelLevel.GlobalChannel); when(RacesAndClasses.getPlugin().getChannelManager().isMember(anyString(), anyString())).thenReturn(false); sut.onCommand(sender, null, "", new String[]{"change", defaultChannel}); verify(sender).sendMessage(ChatColor.RED + "You are no member of: " + ChatColor.LIGHT_PURPLE + defaultChannel); } @Test public void change_channel_with_too_few_arguments_posts_error(){ sut.onCommand(sender, null, "", new String[]{"change"}); verify(sender).sendMessage(plugin_pre + "wrong_command_use"); } @Test public void change_channel_with_invalid_channel_fails(){ when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.NONE); String invalidChannel = "invalid"; sut.onCommand(sender, null, "", new String[]{"change", invalidChannel}); verify(sender).sendMessage(ChatColor.RED + "Could not find any channel named: " + ChatColor.LIGHT_PURPLE + invalidChannel); } @Test public void change_channel_to_tutorial_channel_triggers_tutorial(){ String tutorialChannel = "tutorial"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(tutorialChannel)).thenReturn(ChannelLevel.PublicChannel); when(RacesAndClasses.getPlugin().getChannelManager().isMember(anyString(), anyString())).thenReturn(true); sut.onCommand(sender, null, "", new String[]{"change", tutorialChannel}); verify(sender).sendMessage(ChatColor.GREEN + "You now write in the channel: " + ChatColor.AQUA + tutorialChannel); verify(RacesAndClasses.getPlugin().getTutorialManager()).update(any(CommandExecutor_Channel.class), any(TutorialStepContainer.class)); } @Test public void change_channel_fails_because_memberconfig_is_null(){ when(RacesAndClasses.getPlugin().getConfigManager().getMemberConfigManager().getConfigOfPlayer(playerName)).thenReturn(null); String defaultChannel = "Global"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(defaultChannel)).thenReturn(ChannelLevel.GlobalChannel); when(RacesAndClasses.getPlugin().getChannelManager().isMember(anyString(), anyString())).thenReturn(true); sut.onCommand(sender, null, "", new String[]{"change", defaultChannel}); verify(sender).sendMessage(ChatColor.RED + "Something gone wrong with your config. Try relogging or ask an Admin."); } @Test public void join_channel_fails_with_wrong_arg_number(){ sut.onCommand(sender, null, "", new String[]{"join"}); sut.onCommand(sender, null, "", new String[]{"join", "arg2", "arg3", "tooMuchArg"}); verify(sender, times(2)).sendMessage(plugin_pre + "wrong_command_use"); } @Test public void join_channel_works(){ String channelName = "Global"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(channelName)).thenReturn(ChannelLevel.GlobalChannel); sut.onCommand(sender, null, "", new String[]{"join", channelName}); verify(RacesAndClasses.getPlugin().getChannelManager()).joinChannel(sender, channelName, "", true); } @Test public void join_channel_works_with_password(){ String channelName = "Global"; String password = "42"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(channelName)).thenReturn(ChannelLevel.PasswordChannel); sut.onCommand(sender, null, "", new String[]{"join", channelName, password}); verify(RacesAndClasses.getPlugin().getChannelManager()).joinChannel(sender, channelName, password, true); } @Test public void join_channel_fails_when_channel_not_found(){ String channelName = "Global"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(channelName)).thenReturn(ChannelLevel.NONE); sut.onCommand(sender, null, "", new String[]{"join", channelName}); verify(sender).sendMessage(ChatColor.RED + "Could not find any channel named: " + ChatColor.LIGHT_PURPLE + channelName); } @Test public void leave_channel_works(){ String channelName = "Global"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(channelName)).thenReturn(ChannelLevel.GlobalChannel); sut.onCommand(sender, null, "", new String[]{"leave", channelName}); verify(RacesAndClasses.getPlugin().getChannelManager()).leaveChannel(sender, channelName, true); } @Test public void leave_channel_fails_when_channel_not_present(){ String channelName = "Global"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(channelName)).thenReturn(ChannelLevel.NONE); sut.onCommand(sender, null, "", new String[]{"leave", channelName}); verify(sender).sendMessage(ChatColor.RED + "Could not find any channel named: " + ChatColor.LIGHT_PURPLE + channelName); } @Test public void leave_channel_changes_to_global_channel_when_currente_output_channel_is_left(){ String channelName = "Other"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(channelName)).thenReturn(ChannelLevel.GlobalChannel); when(RacesAndClasses.getPlugin().getConfigManager().getMemberConfigManager().getConfigOfPlayer(playerName).getCurrentChannel()).thenReturn(channelName); sut.onCommand(sender, null, "", new String[]{"leave", channelName}); verify(RacesAndClasses.getPlugin().getChannelManager()).leaveChannel(sender, channelName, true); verify(RacesAndClasses.getPlugin().getConfigManager().getMemberConfigManager().getConfigOfPlayer(playerName)) .setValue(MemberConfig.chatChannel, "Global"); } @Test public void leave_channel_fails_with_too_few_args(){ sut.onCommand(sender, null, "", new String[]{"leave"}); sut.onCommand(sender, null, "", new String[]{"leave", "arg2", "arg3"}); verify(sender, times(2)).sendMessage(plugin_pre + "wrong_command_use"); } @Test public void create_channel_with_wrong_arg_amount(){ sut.onCommand(sender, null, "", new String[]{"create"}); sut.onCommand(sender, null, "", new String[]{"create", "arg2", "arg3", "arg4", "arg5"}); verify(sender, times(2)).sendMessage(plugin_pre + "wrong_command_use"); } @Test public void create_channel_with_wrong_type_fails(){ String invalidType = "invalid"; sut.onCommand(sender, null, "", new String[]{"create", "Test", invalidType}); verify(sender).sendMessage(ChatColor.RED + "Channel Level could not be recognized: " + ChatColor.LIGHT_PURPLE + invalidType); } @Test public void create_channel_fails_when_creating_global_race_local_world_channel(){ sut.onCommand(sender, null, "", new String[]{"create", "Test", "global", ""}); verify(sender).sendMessage(ChatColor.RED + "You can't create a new " + ChatColor.AQUA + ChannelLevel.GlobalChannel.name()); sut.onCommand(sender, null, "", new String[]{"create", "Test", "local", ""}); verify(sender).sendMessage(ChatColor.RED + "You can't create a new " + ChatColor.AQUA + ChannelLevel.LocalChannel.name()); sut.onCommand(sender, null, "", new String[]{"create", "Test", "world", ""}); verify(sender).sendMessage(ChatColor.RED + "You can't create a new " + ChatColor.AQUA + ChannelLevel.WorldChannel.name()); sut.onCommand(sender, null, "", new String[]{"create", "Test", "race", ""}); verify(sender).sendMessage(ChatColor.RED + "You can't create a new " + ChatColor.AQUA + ChannelLevel.RaceChannel.name()); } @Test public void create_channel_fails_when_creating_channels_without_permissions(){ sut.onCommand(sender, null, "", new String[]{"create", "Test", "PasswordChannel", "123"}); verify(RacesAndClasses.getPlugin().getPermissionManager()).checkPermissions(sender, PermissionNode.channelCreatePassword); sut.onCommand(sender, null, "", new String[]{"create", "Test"}); verify(RacesAndClasses.getPlugin().getPermissionManager()).checkPermissions(sender, PermissionNode.channelCreatePublic); sut.onCommand(sender, null, "", new String[]{"create", "Test", "PrivateChannel"}); verify(RacesAndClasses.getPlugin().getPermissionManager()).checkPermissions(sender, PermissionNode.channelCreatePrivate); when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); sut.onCommand(sender, null, "", new String[]{"create", "Test2", "PrivateChannel", "1324"}); verify(sender).sendMessage(ChatColor.YELLOW + "[INFO] You try to create a non-password channel with a password. The password will be ignored."); } @Test public void create_channel_fails_if_channelname_already_exists(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.PrivateChannel); sut.onCommand(sender, null, "", new String[]{"create", "Test2", "PasswordChannel", "123"}); verify(sender).sendMessage(ChatColor.RED + "This channel already exisists."); } @Test public void create_channel_works(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(any(CommandSender.class), anyString())).thenReturn(true); when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.NONE); sut.onCommand(sender, null, "", new String[]{"create", "Test", "Private", ""}); verify(RacesAndClasses.getPlugin().getChannelManager()).registerChannel(ChannelLevel.PrivateChannel, "Test", "", sender); } //ban @Test public void ban_player_from_channel_with_wrong_amount_of_args_fails(){ sut.onCommand(sender, null, "", new String[]{"ban"}); sut.onCommand(sender, null, "", new String[]{"ban", "arg2"}); sut.onCommand(sender, null, "", new String[]{"ban", "arg2", "arg3", "arg4" , "arg5"}); verify(sender, times(3)).sendMessage(plugin_pre + "wrong_command_use"); } @Test public void ban_player_from_channel_works(){ String channel = "channel"; String user = "user"; String time = "42"; int timeAsInt = 42; sut.onCommand(sender, null, "", new String[]{"ban", channel, user, time}); verify(RacesAndClasses.getPlugin().getChannelManager()).banPlayer(sender, user, channel, timeAsInt); } @Test public void ban_player_from_channel_works_when_no_time_passed(){ String channel = "channel"; String user = "user"; sut.onCommand(sender, null, "", new String[]{"ban", channel, user}); verify(RacesAndClasses.getPlugin().getChannelManager()).banPlayer(sender, user, channel, Integer.MAX_VALUE); } @Test public void ban_player_from_channel_works_when_incorrect_time_passed(){ String channel = "channel"; String user = "user"; String time = "invalid"; sut.onCommand(sender, null, "", new String[]{"ban", channel, user, time}); verify(RacesAndClasses.getPlugin().getChannelManager()).banPlayer(sender, user, channel, Integer.MAX_VALUE); } @Test public void unban_player_from_channel_with_wrong_amount_of_args_fails(){ sut.onCommand(sender, null, "", new String[]{"unban"}); sut.onCommand(sender, null, "", new String[]{"unban", "arg2"}); sut.onCommand(sender, null, "", new String[]{"unban", "arg2", "arg3", "arg4"}); verify(sender, times(3)).sendMessage(plugin_pre + "wrong_command_use"); } @Test public void unban_player_from_channel_works(){ String channel = "channel"; String user = "user"; sut.onCommand(sender, null, "", new String[]{"unban", channel, user}); verify(RacesAndClasses.getPlugin().getChannelManager()).unbanPlayer(sender, user, channel); } //Mute @Test public void mute_player_from_channel_with_wrong_amount_of_args_fails(){ sut.onCommand(sender, null, "", new String[]{"mute"}); sut.onCommand(sender, null, "", new String[]{"mute", "arg2"}); sut.onCommand(sender, null, "", new String[]{"mute", "arg2", "arg3", "arg4" , "arg5"}); verify(sender, times(3)).sendMessage(plugin_pre + "wrong_command_use"); } @Test public void mute_player_from_channel_works(){ String channel = "channel"; String user = "user"; String time = "42"; int timeAsInt = 42; sut.onCommand(sender, null, "", new String[]{"mute", channel, user, time}); verify(RacesAndClasses.getPlugin().getChannelManager()).mutePlayer(sender, user, channel, timeAsInt); } @Test public void mute_player_from_channel_works_when_no_time_passed(){ String channel = "channel"; String user = "user"; sut.onCommand(sender, null, "", new String[]{"mute", channel, user}); verify(RacesAndClasses.getPlugin().getChannelManager()).mutePlayer(sender, user, channel, Integer.MAX_VALUE); } @Test public void mute_player_from_channel_works_when_incorrect_time_passed(){ String channel = "channel"; String user = "user"; String time = "invalid"; sut.onCommand(sender, null, "", new String[]{"mute", channel, user, time}); verify(RacesAndClasses.getPlugin().getChannelManager()).mutePlayer(sender, user, channel, Integer.MAX_VALUE); } @Test public void unmute_player_from_channel_with_wrong_amount_of_args_fails(){ sut.onCommand(sender, null, "", new String[]{"unmute"}); sut.onCommand(sender, null, "", new String[]{"unmute", "arg2"}); sut.onCommand(sender, null, "", new String[]{"unmute", "arg2", "arg3", "arg4"}); verify(sender, times(3)).sendMessage(plugin_pre + "wrong_command_use"); } @Test public void unmute_player_from_channel_works(){ String channel = "channel"; String user = "user"; sut.onCommand(sender, null, "", new String[]{"unmute", channel, user}); verify(RacesAndClasses.getPlugin().getChannelManager()).unmutePlayer(sender, user, channel); } //EDIT @Test public void edit_channel_fails_for_wrong_args(){ sut.onCommand(sender, null, "", new String[]{"edit", "arg2", "arg3"}); sut.onCommand(sender, null, "", new String[]{"edit", "arg2"}); sut.onCommand(sender, null, "", new String[]{"edit"}); verify(sender, times(3)).sendMessage(plugin_pre + "wrong_command_use"); } @Test public void edit_channel_works(){ when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.PrivateChannel); String channel = "channel"; String property = "property"; String newValue = "Banane"; sut.onCommand(sender, null, "", new String[]{"edit", channel, property, newValue}); verify(RacesAndClasses.getPlugin().getChannelManager()).editChannel(sender, channel, property, newValue); } @Test public void edit_channel_fails_on_channel_not_found(){ when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.NONE); String channel = "channel"; String property = "property"; String newValue = "Banane"; sut.onCommand(sender, null, "", new String[]{"edit", channel, property, newValue}); verify(sender).sendMessage(ChatColor.RED + "Could not find any channel named: " + ChatColor.LIGHT_PURPLE + channel); } @Test public void edit_channel_fails_because_no_permission_to_edit(){ String channel = "channel"; String property = "property"; String newValue = "Banane"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.GlobalChannel); sut.onCommand(sender, null, "", new String[]{"edit", channel, property, newValue}); when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.WorldChannel); sut.onCommand(sender, null, "", new String[]{"edit", channel, property, newValue}); when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.RaceChannel); sut.onCommand(sender, null, "", new String[]{"edit", channel, property, newValue}); verify(RacesAndClasses.getPlugin().getPermissionManager(), times(3)).checkPermissions(sender, PermissionNode.channelEdit); } @Test public void edit_channel_works_on_global_world_race_channel_with_permission(){ when(RacesAndClasses.getPlugin().getPermissionManager().checkPermissions(sender, PermissionNode.channelEdit)).thenReturn(true); String channel = "channel"; String property = "property"; String newValue = "Banane"; when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.GlobalChannel); sut.onCommand(sender, null, "", new String[]{"edit", channel, property, newValue}); when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.WorldChannel); sut.onCommand(sender, null, "", new String[]{"edit", channel, property, newValue}); when(RacesAndClasses.getPlugin().getChannelManager().getChannelLevel(anyString())).thenReturn(ChannelLevel.RaceChannel); sut.onCommand(sender, null, "", new String[]{"edit", channel, property, newValue}); verify(RacesAndClasses.getPlugin().getChannelManager(), times(3)).editChannel(sender, channel, property, newValue); } @Test public void posting_help_when_no_command_found(){ sut.onCommand(sender, null, "", new String[]{"invalid"}); verifyHelp(sender); } }