/******************************************************************************* * 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.chat.channels; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; 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.io.File; import java.io.IOException; import java.util.LinkedList; import java.util.List; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.World; import org.bukkit.entity.Player; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.chat.channels.container.ChannelTicker; import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.race.RaceContainer; import de.tobiyas.racesandclasses.generate.plugin.GenerateRaces; import de.tobiyas.racesandclasses.util.chat.ChannelLevel; import de.tobiyas.util.config.YAMLConfigExtended; import de.tobiyas.utils.tests.generate.server.GenerateBukkitServer; @RunWith(PowerMockRunner.class) @PrepareForTest({ChannelTicker.class}) public class ChannelManagerTest { private ChannelManager sut; private YAMLConfigExtended config; @Before public void init() throws IOException{ GenerateBukkitServer.generateServer(); GenerateRaces.generateRaces(); config = new YAMLConfigExtended(File.createTempFile("channel", ".yml")); sut = new ChannelManager(config); //when(RacesAndClasses.getPlugin().getChannelManager()).thenReturn(sut); PowerMockito.mockStatic(ChannelTicker.class); when(Bukkit.getWorlds()).thenReturn(new LinkedList<World>()); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(new LinkedList<String>()); when(Bukkit.getOnlinePlayers()).thenReturn(new Player[]{}); } @After public void tearDown(){ GenerateBukkitServer.dropServer(); GenerateRaces.dropMock(); } @Test public void constructor_works(){ sut.init(); assertEquals(ChannelLevel.GlobalChannel, sut.getChannelLevel("Global")); assertEquals(ChannelLevel.LocalChannel, sut.getChannelLevel("Local")); assertEquals(ChannelLevel.GlobalChannel, sut.getChannelLevel("Tutorial")); } @Test public void init_with_races_and_worlds_work(){ List<World> worlds = new LinkedList<World>(); World world1 = mock(World.class); when(world1.getName()).thenReturn("World1"); worlds.add(world1); World world2 = mock(World.class); when(world2.getName()).thenReturn("World2"); worlds.add(world2); World world3 = mock(World.class); when(world3.getName()).thenReturn("World3"); worlds.add(world3); List<String> races = new LinkedList<String>(); races.add("race1"); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName("race1")).thenReturn(mock(RaceContainer.class)); races.add("race2"); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName("race2")).thenReturn(mock(RaceContainer.class)); races.add("race3"); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName("race3")).thenReturn(mock(RaceContainer.class)); when(Bukkit.getWorlds()).thenReturn(worlds); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(races); sut.init(); assertEquals(ChannelLevel.RaceChannel, sut.getChannelLevel("race1")); assertEquals(ChannelLevel.RaceChannel, sut.getChannelLevel("race2")); assertEquals(ChannelLevel.RaceChannel, sut.getChannelLevel("race3")); assertEquals(ChannelLevel.WorldChannel, sut.getChannelLevel("World1")); assertEquals(ChannelLevel.WorldChannel, sut.getChannelLevel("World2")); assertEquals(ChannelLevel.WorldChannel, sut.getChannelLevel("World3")); } @Test public void registering_a_new_channel_works(){ String privateChannelName = "channelName"; ChannelLevel level = ChannelLevel.PrivateChannel; sut.registerChannel(level, privateChannelName); assertEquals(level, sut.getChannelLevel(privateChannelName)); } @Test public void get_channel_level_with_null_returns_NONE(){ assertEquals(ChannelLevel.NONE, sut.getChannelLevel(null)); } @Test public void get_channel_level_channel_not_found_returns_NONE(){ assertEquals(ChannelLevel.NONE, sut.getChannelLevel("invalid")); } @Test public void adding_player_to_channel_works(){ sut.init(); String playerName = "player"; String channelName = "Global"; GenerateBukkitServer.generatePlayerOnServer(playerName); assertEquals(ChannelLevel.GlobalChannel, sut.getChannelLevel(channelName)); sut.joinChannel(Bukkit.getPlayer(playerName), channelName, "", false); assertTrue(sut.isMember(playerName, channelName)); } @Test public void listing_all_channels_works(){ sut.init(); List<String> channelNames = sut.listAllChannels(); assertEquals(3, channelNames.size()); assertTrue(channelNames.contains("Global")); assertTrue(channelNames.contains("Local")); assertTrue(channelNames.contains("Tutorial")); } @Test public void listing_all_public_channels_only_lists_public_channels(){ String privateChannelName = "privateChannel"; sut.init(); assertNotNull(sut.registerChannel(ChannelLevel.PrivateChannel, privateChannelName)); assertEquals(ChannelLevel.PrivateChannel, sut.getChannelLevel(privateChannelName)); List<String> channelNames = sut.listAllPublicChannels(); assertEquals(3, channelNames.size()); assertTrue(channelNames.contains("Global")); assertTrue(channelNames.contains("Local")); assertTrue(channelNames.contains("Tutorial")); assertFalse(channelNames.contains(privateChannelName)); } @Test public void adding_channel_with_player_sends_message_to_player_and_adds_him(){ String privateChannelName = "privateChannel"; String playerName = "player"; when(RacesAndClasses.getPlugin().getConfigManager().getChannelConfig().getConfig_PlayerJoinFormat()).thenReturn("{color}[{nick}] Player: &f[{sender}] {color}has joined the Channel."); GenerateBukkitServer.generatePlayerOnServer(playerName); sut.init(); assertTrue(sut.registerChannel(ChannelLevel.PrivateChannel, privateChannelName, Bukkit.getPlayer(playerName))); assertEquals(ChannelLevel.PrivateChannel, sut.getChannelLevel(privateChannelName)); assertTrue(sut.isMember(playerName, privateChannelName)); verify(Bukkit.getPlayer(playerName)).sendMessage("[privateChannel] Player: �f[player] has joined the Channel."); } @Test public void registering_already_registered_channel_fails(){ String privateChannelName = "Global"; String playerName = "player"; GenerateBukkitServer.generatePlayerOnServer(playerName); sut.init(); assertFalse(sut.registerChannel(ChannelLevel.PrivateChannel, privateChannelName, Bukkit.getPlayer(playerName))); assertFalse(sut.isMember(playerName, privateChannelName)); verify(Bukkit.getPlayer(playerName)).sendMessage(ChatColor.RED + "Channel: " + ChatColor.AQUA + privateChannelName + ChatColor.RED + " already exists."); } @Test public void creating_channel_with_password_works(){ String privateChannelName = "privateChannel"; String playerName = "player"; when(RacesAndClasses.getPlugin().getConfigManager().getChannelConfig().getConfig_PlayerJoinFormat()).thenReturn("{color}[{nick}] Player: &f[{sender}] {color}has joined the Channel."); GenerateBukkitServer.generatePlayerOnServer(playerName); sut.init(); assertTrue(sut.registerChannel(ChannelLevel.PasswordChannel, privateChannelName, "password", Bukkit.getPlayer(playerName))); assertEquals(ChannelLevel.PasswordChannel, sut.getChannelLevel(privateChannelName)); assertTrue(sut.isMember(playerName, privateChannelName)); verify(Bukkit.getPlayer(playerName)).sendMessage(ChatColor.GREEN + "The channel " + ChatColor.AQUA + privateChannelName + ChatColor.GREEN + " has been created successfully"); } @Test public void post_channel_info_fails_on_non_existent_channel(){ Player player = mock(Player.class); sut.postChannelInfo(player, "invalid"); verify(player).sendMessage(ChatColor.RED + "Channel " + ChatColor.AQUA + "invalid" + ChatColor.RED + " could not be found."); } @Test public void post_channel_info_works(){ String playerName = "player"; GenerateBukkitServer.generatePlayerOnServer(playerName); Player player = Bukkit.getPlayer(playerName); sut.init(); sut.postChannelInfo(player, "Global"); String otherPlayer = "otherPlayer"; GenerateBukkitServer.generateOfflinePlayerOnServer(otherPlayer); sut.joinChannel(player, "Global", "", false); sut.joinChannel(Bukkit.getPlayer(otherPlayer), "Global", "", false); sut.postChannelInfo(player, "Global"); verify(player, times(2)).sendMessage(ChatColor.YELLOW + "ChannelName: " + ChatColor.AQUA + "Global"); verify(player, times(2)).sendMessage(ChatColor.YELLOW + "ChannelLevel: " + ChatColor.AQUA + ChannelLevel.GlobalChannel.name()); verify(player, times(2)).sendMessage(ChatColor.YELLOW + "ChannelColor: " + "COLOR"); verify(player, times(2)).sendMessage(ChatColor.YELLOW + "ChannelFormat: " + ChatColor.RESET); verify(player, times(2)).sendMessage(ChatColor.YELLOW + "Has Password: " + ChatColor.AQUA + false); verify(player, times(2)).sendMessage(ChatColor.YELLOW + "===== Channel Members: ====="); verify(player).sendMessage(ChatColor.RED + "This channel has currently no Members."); verify(player).sendMessage(ChatColor.GREEN + playerName + ", " + ChatColor.RED + otherPlayer + " (offline)"); } @Test public void broadcast_message_to_channel_works(){ String playerName = "player"; GenerateBukkitServer.generatePlayerOnServer(playerName); Player player = Bukkit.getPlayer(playerName); when(RacesAndClasses.getPlugin().getConfigManager().getChannelConfig().getConfig_globalchat_default_color()).thenReturn(ChatColor.GRAY.toString()); when(RacesAndClasses.getPlugin().getConfigManager().getChannelConfig().getConfig_globalchat_default_format()).thenReturn("{color}[{nick}] &f{prefix}{sender}{suffix}{color}: {msg}"); sut.init(); sut.joinChannel(player, "Global", "", false); sut.broadcastMessageToChannel("Global", player, "test"); verify(player).sendMessage("�7[Global] �f�f[player�f]�7: test"); } @Test public void broadcasting_message_to_channel_when_not_found_fails(){ Player player = mock(Player.class); sut.broadcastMessageToChannel("invalid", player, "something"); verify(player).sendMessage(ChatColor.RED + "Channel " + ChatColor.AQUA + "invalid" + ChatColor.RED + " was not found."); } @Test public void leaving_channel_works(){ String playerName = "player"; GenerateBukkitServer.generatePlayerOnServer(playerName); Player player = Bukkit.getPlayer(playerName); sut.init(); sut.joinChannel(player, "Global", "", false); assertTrue(sut.isMember(playerName, "Global")); sut.leaveChannel(player, "Global", false); assertFalse(sut.isMember(playerName, "Global")); } @Test public void leaving_channel_fails_if_not_member(){ String playerName = "player"; GenerateBukkitServer.generatePlayerOnServer(playerName); Player player = Bukkit.getPlayer(playerName); sut.init(); assertFalse(sut.isMember(playerName, "invalid")); sut.leaveChannel(player, "invalid", true); sut.leaveChannel(player, "invalid", false); assertFalse(sut.isMember(playerName, "invalid")); verify(player).sendMessage(ChatColor.RED + "The Channel: " + "invalid" + " does not exist."); } @Test public void player_join_server_and_leave_server_lets_him_join_and_leave_all_channels(){ String playerName = "player"; GenerateBukkitServer.generatePlayerOnServer(playerName); Player player = Bukkit.getPlayer(playerName); List<World> worlds = new LinkedList<World>(); World world1 = mock(World.class); when(world1.getName()).thenReturn("World1"); worlds.add(world1); when(player.getWorld()).thenReturn(world1); World world2 = mock(World.class); when(world2.getName()).thenReturn("World2"); worlds.add(world2); World world3 = mock(World.class); when(world3.getName()).thenReturn("World3"); worlds.add(world3); List<String> races = new LinkedList<String>(); races.add("race1"); RaceContainer race = mock(RaceContainer.class); when(race.getName()).thenReturn("race1"); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName("race1")).thenReturn(race); races.add("race2"); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName("race2")).thenReturn(mock(RaceContainer.class)); races.add("race3"); when(RacesAndClasses.getPlugin().getRaceManager().getHolderByName("race3")).thenReturn(mock(RaceContainer.class)); when(Bukkit.getWorlds()).thenReturn(worlds); when(RacesAndClasses.getPlugin().getRaceManager().listAllVisibleHolders()).thenReturn(races); when(RacesAndClasses.getPlugin().getRaceManager().getHolderOfPlayer(playerName)).thenReturn(race); sut.init(); sut.playerLogin(player); assertTrue(sut.isMember(playerName, "Global")); assertTrue(sut.isMember(playerName, "race1")); assertTrue(sut.isMember(playerName, "World1")); sut.playerQuit(player); assertFalse(sut.isMember(playerName, "Global")); assertFalse(sut.isMember(playerName, "race1")); assertFalse(sut.isMember(playerName, "World1")); } @Test public void remove_channel_works(){ String channelName = "42"; sut.init(); sut.registerChannel(ChannelLevel.PrivateChannel, channelName); assertEquals(ChannelLevel.PrivateChannel, sut.getChannelLevel(channelName)); sut.removeChannel(channelName); assertEquals(ChannelLevel.NONE, sut.getChannelLevel(channelName)); } @Test public void player_change_world_changes_worls_channel(){ String playerName = "player"; GenerateBukkitServer.generatePlayerOnServer(playerName); Player player = Bukkit.getPlayer(playerName); List<World> worlds = new LinkedList<World>(); World world1 = mock(World.class); when(world1.getName()).thenReturn("World1"); worlds.add(world1); when(player.getWorld()).thenReturn(world1); World world2 = mock(World.class); when(world2.getName()).thenReturn("World2"); worlds.add(world2); World world3 = mock(World.class); when(world3.getName()).thenReturn("World3"); worlds.add(world3); when(Bukkit.getWorlds()).thenReturn(worlds); sut.init(); sut.joinChannel(player, "World2", "", false); assertTrue(sut.isMember(playerName, "World2")); sut.playerChangedWorld(world2, player); assertFalse(sut.isMember(playerName, "World2")); assertTrue(sut.isMember(playerName, "World1")); } }