package com.faforever.client.replay;
import com.faforever.client.i18n.I18n;
import com.faforever.client.notification.NotificationService;
import com.faforever.client.task.TaskService;
import com.faforever.client.test.AbstractPlainJavaFxTest;
import javafx.beans.InvalidationListener;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.springframework.context.ApplicationContext;
import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
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 ReplayVaultControllerTest extends AbstractPlainJavaFxTest {
private ReplayVaultController instance;
@Mock
private I18n i18n;
@Mock
private ApplicationContext applicationContext;
@Mock
private TaskService taskService;
@Mock
private NotificationService notificationService;
@Mock
private ReplayService replayService;
@Before
public void setUp() throws Exception {
instance = loadController("replay_vault.fxml");
instance.i18n = i18n;
instance.applicationContext = applicationContext;
instance.taskService = taskService;
instance.notificationService = notificationService;
instance.replayService = replayService;
doAnswer(invocation -> invocation.getArgumentAt(0, Object.class)).when(taskService).submitTask(any());
instance.postConstruct();
}
@Test
public void testGetRoot() throws Exception {
assertThat(instance.getRoot(), is(instance.replayVaultRoot));
assertThat(instance.getRoot().getParent(), is(nullValue()));
}
@Test
public void testLoadLocalReplaysInBackground() throws Exception {
LoadLocalReplaysTask task = mock(LoadLocalReplaysTask.class);
when(task.getFuture()).thenReturn(CompletableFuture.completedFuture(Arrays.asList(
ReplayInfoBeanBuilder.create().get(),
ReplayInfoBeanBuilder.create().get(),
ReplayInfoBeanBuilder.create().get()
)));
when(applicationContext.getBean(LoadLocalReplaysTask.class)).thenReturn(task);
CountDownLatch loadedLatch = new CountDownLatch(1);
instance.localReplaysRoot.getChildren().addListener((InvalidationListener) observable -> loadedLatch.countDown());
instance.loadLocalReplaysInBackground();
assertTrue(loadedLatch.await(5000, TimeUnit.MILLISECONDS));
assertThat(instance.localReplaysRoot.getChildren(), hasSize(3));
verify(taskService).submitTask(task);
verifyZeroInteractions(notificationService);
}
@Test
public void testLoadOnlineReplaysInBackground() throws Exception {
LoadLocalReplaysTask task = mock(LoadLocalReplaysTask.class);
when(applicationContext.getBean(LoadLocalReplaysTask.class)).thenReturn(task);
when(replayService.getOnlineReplays()).thenReturn(CompletableFuture.completedFuture(Arrays.asList(
ReplayInfoBeanBuilder.create().get(),
ReplayInfoBeanBuilder.create().get(),
ReplayInfoBeanBuilder.create().get()
)));
CountDownLatch loadedLatch = new CountDownLatch(1);
instance.onlineReplaysRoot.getChildren().addListener((InvalidationListener) observable -> loadedLatch.countDown());
instance.loadOnlineReplaysInBackground();
assertTrue(loadedLatch.await(5000, TimeUnit.MILLISECONDS));
assertThat(instance.onlineReplaysRoot.getChildren(), hasSize(3));
verifyZeroInteractions(notificationService);
}
}