package com.faforever.client.chat; import com.faforever.client.chat.avatar.AvatarBean; import com.faforever.client.chat.avatar.AvatarService; import com.faforever.client.game.GameInfoBean; import com.faforever.client.game.GameService; import com.faforever.client.game.JoinGameHelper; import com.faforever.client.i18n.I18n; import com.faforever.client.notification.ImmediateNotification; import com.faforever.client.notification.NotificationService; import com.faforever.client.player.PlayerInfoBeanBuilder; import com.faforever.client.player.PlayerService; import com.faforever.client.preferences.ChatPrefs; import com.faforever.client.preferences.Preferences; import com.faforever.client.preferences.PreferencesService; import com.faforever.client.replay.ReplayService; import com.faforever.client.test.AbstractPlainJavaFxTest; import com.faforever.client.user.UserService; import com.google.common.eventbus.EventBus; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.ObservableMap; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.springframework.context.ApplicationContext; import org.testfx.util.WaitForAsyncUtils; import java.io.IOException; import java.net.URL; import java.util.Arrays; import java.util.concurrent.CompletableFuture; import static com.faforever.client.chat.SocialStatus.FOE; import static com.faforever.client.chat.SocialStatus.FRIEND; import static com.faforever.client.chat.SocialStatus.OTHER; import static com.faforever.client.chat.SocialStatus.SELF; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class ChatUserContextMenuControllerTest extends AbstractPlainJavaFxTest { public static final String TEST_USER_NAME = "junit"; @Mock UserService userService; @Mock ChatService chatService; @Mock PreferencesService preferencesService; @Mock ApplicationContext applicationContext; @Mock PlayerService playerService; @Mock GameService gameService; @Mock ReplayService replayService; @Mock NotificationService notificationService; @Mock I18n i18n; @Mock EventBus eventBus; @Mock JoinGameHelper joinGameHelper; @Mock AvatarService avatarService; private ChatUserContextMenuController instance; private PlayerInfoBean playerInfoBean; @Before public void setUp() throws Exception { instance = loadController("chat_user_context_menu.fxml"); instance.userService = userService; instance.chatService = chatService; instance.preferencesService = preferencesService; instance.applicationContext = applicationContext; instance.playerService = playerService; instance.gameService = gameService; instance.replayService = replayService; instance.notificationService = notificationService; instance.i18n = i18n; instance.eventBus = eventBus; instance.joinGameHelper = joinGameHelper; instance.avatarService = avatarService; Preferences preferences = mock(Preferences.class); ChatPrefs chatPrefs = mock(ChatPrefs.class); ObjectProperty<ChatColorMode> chatColorModeObjectProperty = new SimpleObjectProperty<>(); when(preferencesService.getPreferences()).thenReturn(preferences); when(preferences.getChat()).thenReturn(chatPrefs); when(chatPrefs.getUserToColor()).thenReturn(mock(ObservableMap.class)); when(chatPrefs.chatColorModeProperty()).thenReturn(chatColorModeObjectProperty); when(avatarService.getAvailableAvatars()).thenReturn(CompletableFuture.completedFuture(Arrays.asList( new AvatarBean(new URL("http://www.example.com/avatar1.png"), "Avatar Number #1"), new AvatarBean(new URL("http://www.example.com/avatar2.png"), "Avatar Number #2"), new AvatarBean(new URL("http://www.example.com/avatar3.png"), "Avatar Number #3") ))); playerInfoBean = PlayerInfoBeanBuilder.create(TEST_USER_NAME).socialStatus(SELF).avatar(null).get(); instance.setPlayerInfoBean(playerInfoBean); } @Test public void testOnSendPrivateMessage() { instance.onSendPrivateMessage(); verify(eventBus).post(any(InitiatePrivateChatEvent.class)); } @Test public void testOnAddFriendWithFoe() { playerInfoBean.setSocialStatus(FOE); instance.onAddFriend(); verify(playerService).removeFoe(playerInfoBean); verify(playerService).addFriend(playerInfoBean); } @Test public void testOnAddFriendWithNeutral() { playerInfoBean.setSocialStatus(OTHER); instance.onAddFriend(); verify(playerService, never()).removeFoe(playerInfoBean); verify(playerService).addFriend(playerInfoBean); } @Test public void testOnRemoveFriend() { instance.onRemoveFriend(); verify(playerService).removeFriend(playerInfoBean); } @Test public void testOnAddFoeWithFriend() { playerInfoBean.setSocialStatus(FRIEND); instance.onAddFoe(); verify(playerService).removeFriend(playerInfoBean); verify(playerService).addFoe(playerInfoBean); } @Test public void testOnAddFoeWithNeutral() { playerInfoBean.setSocialStatus(OTHER); instance.onAddFoe(); verify(playerService, never()).removeFriend(playerInfoBean); verify(playerService).addFoe(playerInfoBean); } @Test public void testOnRemoveFoe() { instance.onRemoveFoe(); verify(playerService).removeFoe(playerInfoBean); } @Test public void testOnWatchGame() throws Exception { instance.onWatchGame(); verify(replayService).runLiveReplay(playerInfoBean.getGameUid(), playerInfoBean.getId()); } @Test public void testOnWatchGameThrowsIoExceptionTriggersNotification() throws Exception { doThrow(new IOException("Error in runLiveReplay")) .when(replayService).runLiveReplay(anyInt(), anyInt()); instance.onWatchGame(); verify(notificationService).addNotification(any(ImmediateNotification.class)); } @Test public void testOnJoinGame() { GameInfoBean gameInfoBean = mock(GameInfoBean.class); when(gameService.getByUid(anyInt())).thenReturn(gameInfoBean); instance.onJoinGame(); verify(joinGameHelper).join(gameInfoBean); } @Test public void onSelectAvatar() throws Exception { instance.avatarComboBox.show(); WaitForAsyncUtils.waitForAsyncFx(100000, () -> instance.avatarComboBox.getSelectionModel().select(2)); ArgumentCaptor<AvatarBean> captor = ArgumentCaptor.forClass(AvatarBean.class); verify(avatarService).changeAvatar(captor.capture()); AvatarBean avatarBean = captor.getValue(); assertThat(avatarBean.getUrl(), equalTo(new URL("http://www.example.com/avatar2.png"))); assertThat(avatarBean.getDescription(), is("Avatar Number #2")); } }