package com.faforever.client.mod;
import com.faforever.client.test.AbstractPlainJavaFxTest;
import com.google.common.eventbus.EventBus;
import javafx.beans.Observable;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.springframework.context.ApplicationContext;
import java.util.ArrayList;
import java.util.List;
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.junit.Assert.*;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class ModVaultControllerTest extends AbstractPlainJavaFxTest {
private ModVaultController instance;
@Mock
private ModService modService;
@Mock
private ApplicationContext applicationContext;
@Mock
private ModDetailController modDetailController;
@Mock
private EventBus eventBus;
@Before
public void setUp() throws Exception {
instance = loadController("mod_vault.fxml");
instance.modService = modService;
instance.applicationContext = applicationContext;
instance.modDetailController = modDetailController;
instance.eventBus = eventBus;
when(modDetailController.getRoot()).thenReturn(new Pane());
instance.postConstruct();
}
@Test
public void testGetRoot() throws Exception {
assertThat(instance.getRoot(), is(instance.modVaultRoot));
assertThat(instance.getRoot().getParent(), is(nullValue()));
}
@Test
public void testSetUpIfNecessary() throws Exception {
List<ModInfoBean> mods = new ArrayList<>();
for (int i = 0; i < 5; i++) {
mods.add(
ModInfoBeanBuilder.create()
.defaultValues()
.name("Mod " + i)
.uid(String.valueOf(i))
.uiMod(i < 2)
.get()
);
}
when(modService.getMostDownloadedMods(anyInt())).thenReturn(CompletableFuture.completedFuture(mods));
when(modService.getMostLikedUiMods(anyInt())).thenReturn(CompletableFuture.completedFuture(mods));
when(modService.getNewestMods(anyInt())).thenReturn(CompletableFuture.completedFuture(mods));
when(modService.getMostLikedMods(anyInt())).thenReturn(CompletableFuture.completedFuture(mods));
when(modService.getAvailableMods()).thenReturn(CompletableFuture.completedFuture(mods));
ModTileController modTileController = mock(ModTileController.class);
doAnswer(invocation -> new Pane()).when(modTileController).getRoot();
when(applicationContext.getBean(ModTileController.class)).thenReturn(modTileController);
CountDownLatch latch = new CountDownLatch(3);
waitUntilInitialized(instance.recommendedUiModsPane, latch);
waitUntilInitialized(instance.newestModsPane, latch);
waitUntilInitialized(instance.popularModsPane, latch);
instance.setUpIfNecessary();
assertTrue(latch.await(5000, TimeUnit.MILLISECONDS));
}
private void waitUntilInitialized(Pane pane, CountDownLatch latch) {
pane.getChildren().addListener((Observable observable) -> {
if (pane.getChildren().size() == 2) {
latch.countDown();
}
});
}
@Test
public void testShowModDetail() throws Exception {
Node pane = new Pane();
pane.setVisible(false);
when(modDetailController.getRoot()).thenReturn(pane);
ModInfoBean modInfoBean = ModInfoBeanBuilder.create().defaultValues().get();
instance.onShowModDetail(modInfoBean);
verify(modDetailController).setMod(modInfoBean);
assertThat(pane.isVisible(), is(true));
}
}