package com.faforever.client.achievements;
import com.faforever.client.api.FafApiAccessor;
import com.faforever.client.api.PlayerAchievement;
import com.faforever.client.i18n.I18n;
import com.faforever.client.notification.NotificationService;
import com.faforever.client.player.PlayerInfoBeanBuilder;
import com.faforever.client.player.PlayerService;
import com.faforever.client.preferences.PreferencesService;
import com.faforever.client.remote.FafService;
import com.faforever.client.remote.UpdatedAchievementsMessage;
import com.faforever.client.test.AbstractPlainJavaFxTest;
import com.faforever.client.theme.ThemeService;
import com.faforever.client.user.UserService;
import com.google.api.client.json.JsonFactory;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
public class AchievementServiceImplTest extends AbstractPlainJavaFxTest {
private static final int PLAYER_ID = 123;
private static final String USERNAME = "junit";
@Rule
public TemporaryFolder preferencesDirectory = new TemporaryFolder();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Mock
PlayerService playerService;
@Mock
private AchievementServiceImpl instance;
@Mock
private PreferencesService preferencesService;
@Mock
private UserService userService;
@Mock
private NotificationService notificationService;
@Mock
private I18n i18n;
@Mock
private JsonFactory jsonFactory;
@Mock
private FafApiAccessor fafApiAccessor;
@Mock
private ThemeService themeService;
@Mock
private FafService fafService;
@Mock
private ThreadPoolExecutor threadPoolExecutor;
@Captor
private ArgumentCaptor<Consumer<UpdatedAchievementsMessage>> onUpdatedAchievementsCaptor;
@Before
public void setUp() throws Exception {
instance = new AchievementServiceImpl();
instance.userService = userService;
instance.notificationService = notificationService;
instance.i18n = i18n;
instance.fafApiAccessor = fafApiAccessor;
instance.fafService = fafService;
instance.playerService = playerService;
instance.threadPoolExecutor = threadPoolExecutor;
instance.themeService = themeService;
when(userService.getUid()).thenReturn(PLAYER_ID);
when(userService.getUsername()).thenReturn(USERNAME);
doAnswer(invocation -> {
invocation.getArgumentAt(0, Runnable.class).run();
return null;
}).when(threadPoolExecutor).execute(any(Runnable.class));
instance.postConstruct();
}
@Test
public void testGetPlayerAchievementsForCurrentUser() throws Exception {
instance.getPlayerAchievements(USERNAME);
verifyZeroInteractions(playerService);
}
@Test
public void testGetPlayerAchievementsForAnotherUser() throws Exception {
List<PlayerAchievement> achievements = Arrays.asList(new PlayerAchievement(), new PlayerAchievement());
when(playerService.getPlayerForUsername("foobar")).thenReturn(PlayerInfoBeanBuilder.create("foobar").id(PLAYER_ID).get());
when(fafApiAccessor.getPlayerAchievements(PLAYER_ID)).thenReturn(achievements);
List<PlayerAchievement> playerAchievements = instance.getPlayerAchievements("foobar").toCompletableFuture().get(5, TimeUnit.SECONDS);
assertThat(playerAchievements, hasSize(2));
assertThat(playerAchievements, is(achievements));
verify(playerService).getPlayerForUsername("foobar");
verify(fafApiAccessor).getPlayerAchievements(PLAYER_ID);
}
@Test
public void testGetAchievementDefinitions() throws Exception {
instance.getAchievementDefinitions();
verify(fafApiAccessor).getAchievementDefinitions();
verifyNoMoreInteractions(fafApiAccessor);
}
}