package com.faforever.client.achievements; import com.faforever.client.api.AchievementDefinition; import com.faforever.client.api.AchievementType; import com.faforever.client.audio.AudioController; import com.faforever.client.i18n.I18n; import com.faforever.client.notification.NotificationServiceImpl; import com.faforever.client.notification.TransientNotification; import com.faforever.client.remote.FafService; import com.faforever.client.remote.UpdatedAchievement; import com.faforever.client.remote.UpdatedAchievementsMessage; import javafx.scene.image.Image; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Collections; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; public class AchievementUnlockedNotifierTest { @Mock private AchievementUnlockedNotifier instance; @Mock private NotificationServiceImpl notificationService; @Mock private I18n i18n; @Mock private AchievementService achievementService; @Mock private FafService fafService; @Mock private AudioController audioController; @Captor private ArgumentCaptor<Consumer<UpdatedAchievementsMessage>> listenerCaptor; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); instance = new AchievementUnlockedNotifier(); instance.achievementService = achievementService; instance.audioController = audioController; instance.fafService = fafService; instance.i18n = i18n; instance.notificationService = notificationService; instance.postConstruct(); verify(fafService).addOnMessageListener(eq(UpdatedAchievementsMessage.class), listenerCaptor.capture()); } @Test public void newlyUnlocked() throws Exception { AchievementDefinition achievementDefinition = new AchievementDefinition(); achievementDefinition.setType(AchievementType.STANDARD); achievementDefinition.setName("Test Achievement"); triggerUpdatedAchievementsMessage(achievementDefinition, true); verify(audioController).playAchievementUnlockedSound(); ArgumentCaptor<TransientNotification> notificationCaptor = ArgumentCaptor.forClass(TransientNotification.class); verify(notificationService).addNotification(notificationCaptor.capture()); TransientNotification notification = notificationCaptor.getValue(); assertThat(notification.getImage(), notNullValue()); assertThat(notification.getTitle(), is("Achievement unlocked")); assertThat(notification.getText(), is("Test Achievement")); } @Test public void alreadyUnlocked() { AchievementDefinition achievementDefinition = new AchievementDefinition(); achievementDefinition.setType(AchievementType.STANDARD); achievementDefinition.setName("Test Achievement"); triggerUpdatedAchievementsMessage(achievementDefinition, false); verifyZeroInteractions(audioController); verifyZeroInteractions(notificationService); } private void triggerUpdatedAchievementsMessage(AchievementDefinition achievementDefinition, boolean newlyUnlocked) { when(achievementService.getAchievementDefinition("1234")).thenReturn(CompletableFuture.completedFuture(achievementDefinition)); when(i18n.get("achievement.unlockedTitle")).thenReturn("Achievement unlocked"); when(achievementService.getRevealedIcon(achievementDefinition)).thenReturn(mock(Image.class)); UpdatedAchievementsMessage message = new UpdatedAchievementsMessage(); UpdatedAchievement updatedAchievement = new UpdatedAchievement(); updatedAchievement.setNewlyUnlocked(newlyUnlocked); updatedAchievement.setAchievementId("1234"); message.setUpdatedAchievements(Collections.singletonList(updatedAchievement)); listenerCaptor.getValue().accept(message); } }