Search in sources :

Example 6 with VotingQuestion

use of com.faforever.api.data.domain.VotingQuestion in project faf-java-api by FAForever.

the class VotingServiceTest method notSaveVoteOnTooManyAnswers.

@Test
public void notSaveVoteOnTooManyAnswers() {
    VotingSubject votingSubject = new VotingSubject();
    votingSubject.setId(1);
    votingSubject.setBeginOfVoteTime(OffsetDateTime.now());
    votingSubject.setEndOfVoteTime(OffsetDateTime.MAX);
    VotingQuestion votingQuestion = new VotingQuestion();
    votingQuestion.setAlternativeQuestion(true);
    votingSubject.setVotingQuestions(Collections.singleton(votingQuestion));
    votingQuestion.setMaxAnswers(1);
    Vote vote = new Vote();
    VotingAnswer votingAnswer = new VotingAnswer();
    VotingChoice votingChoice = new VotingChoice();
    votingChoice.setId(1);
    votingChoice.setVotingQuestion(votingQuestion);
    votingAnswer.setVotingChoice(votingChoice);
    VotingAnswer votingAnswer2 = new VotingAnswer();
    VotingChoice votingChoice2 = new VotingChoice();
    votingChoice2.setId(2);
    votingChoice2.setVotingQuestion(votingQuestion);
    votingAnswer2.setVotingChoice(votingChoice2);
    vote.setVotingAnswers(new HashSet<>(Arrays.asList(votingAnswer, votingAnswer2)));
    vote.setVotingSubject(votingSubject);
    Player player = new Player();
    when(voteRepository.findByPlayerAndVotingSubjectId(player, votingSubject.getId())).thenReturn(Optional.empty());
    when(votingSubjectRepository.findById(votingSubject.getId())).thenReturn(Optional.of(votingSubject));
    when(votingChoiceRepository.findById(votingChoice.getId())).thenReturn(Optional.of(votingChoice));
    when(votingChoiceRepository.findById(votingChoice2.getId())).thenReturn(Optional.of(votingChoice2));
    try {
        instance.saveVote(vote, player);
    } catch (ApiException e) {
        assertTrue(Arrays.stream(e.getErrors()).anyMatch(error -> error.getErrorCode().equals(ErrorCode.TOO_MANY_ANSWERS)));
    }
    verify(voteRepository, never()).save(vote);
}
Also used : Vote(com.faforever.api.data.domain.Vote) Player(com.faforever.api.data.domain.Player) VotingAnswer(com.faforever.api.data.domain.VotingAnswer) VotingSubject(com.faforever.api.data.domain.VotingSubject) VotingQuestion(com.faforever.api.data.domain.VotingQuestion) VotingChoice(com.faforever.api.data.domain.VotingChoice) ApiException(com.faforever.api.error.ApiException) Test(org.junit.Test)

Example 7 with VotingQuestion

use of com.faforever.api.data.domain.VotingQuestion in project faf-java-api by FAForever.

the class VotingServiceTest method saveVoteSuccessful.

@Test
public void saveVoteSuccessful() {
    Vote vote = new Vote();
    VotingSubject votingSubject = new VotingSubject();
    votingSubject.setId(1);
    votingSubject.setBeginOfVoteTime(OffsetDateTime.now());
    votingSubject.setEndOfVoteTime(OffsetDateTime.MAX);
    VotingQuestion votingQuestion = new VotingQuestion();
    votingQuestion.setAlternativeQuestion(false);
    votingQuestion.setMaxAnswers(1);
    votingSubject.setVotingQuestions(Collections.singleton(votingQuestion));
    vote.setVotingSubject(votingSubject);
    Player player = new Player();
    when(voteRepository.findByPlayerAndVotingSubjectId(player, votingSubject.getId())).thenReturn(Optional.empty());
    when(votingSubjectRepository.findById(votingSubject.getId())).thenReturn(Optional.of(votingSubject));
    instance.saveVote(vote, player);
    verify(voteRepository).save(vote);
}
Also used : Vote(com.faforever.api.data.domain.Vote) Player(com.faforever.api.data.domain.Player) VotingSubject(com.faforever.api.data.domain.VotingSubject) VotingQuestion(com.faforever.api.data.domain.VotingQuestion) Test(org.junit.Test)

Example 8 with VotingQuestion

use of com.faforever.api.data.domain.VotingQuestion in project faf-java-api by FAForever.

the class VotingServiceTest method notSaveVoteIfAlternativeOrdinalWrong.

@Test
public void notSaveVoteIfAlternativeOrdinalWrong() {
    VotingSubject votingSubject = new VotingSubject();
    votingSubject.setId(1);
    votingSubject.setBeginOfVoteTime(OffsetDateTime.now());
    votingSubject.setEndOfVoteTime(OffsetDateTime.MAX);
    VotingQuestion votingQuestion = new VotingQuestion();
    votingQuestion.setAlternativeQuestion(true);
    votingSubject.setVotingQuestions(Collections.singleton(votingQuestion));
    votingQuestion.setMaxAnswers(2);
    Vote vote = new Vote();
    VotingAnswer votingAnswer = new VotingAnswer();
    VotingChoice votingChoice = new VotingChoice();
    votingChoice.setId(1);
    votingChoice.setVotingQuestion(votingQuestion);
    votingAnswer.setVotingChoice(votingChoice);
    votingAnswer.setAlternativeOrdinal(1);
    VotingAnswer votingAnswer2 = new VotingAnswer();
    VotingChoice votingChoice2 = new VotingChoice();
    votingChoice2.setId(2);
    votingChoice2.setVotingQuestion(votingQuestion);
    votingAnswer2.setVotingChoice(votingChoice2);
    votingAnswer2.setAlternativeOrdinal(1);
    vote.setVotingAnswers(new HashSet<>(Arrays.asList(votingAnswer, votingAnswer2)));
    vote.setVotingSubject(votingSubject);
    Player player = new Player();
    when(voteRepository.findByPlayerAndVotingSubjectId(player, votingSubject.getId())).thenReturn(Optional.empty());
    when(votingSubjectRepository.findById(votingSubject.getId())).thenReturn(Optional.of(votingSubject));
    when(votingChoiceRepository.findById(votingChoice.getId())).thenReturn(Optional.of(votingChoice));
    when(votingChoiceRepository.findById(votingChoice2.getId())).thenReturn(Optional.of(votingChoice2));
    try {
        instance.saveVote(vote, player);
    } catch (ApiException e) {
        assertTrue(Arrays.stream(e.getErrors()).anyMatch(error -> error.getErrorCode().equals(ErrorCode.MALFORMATTED_ALTERNATIVE_ORDINALS)));
    }
    verify(voteRepository, never()).save(vote);
}
Also used : Vote(com.faforever.api.data.domain.Vote) Player(com.faforever.api.data.domain.Player) VotingAnswer(com.faforever.api.data.domain.VotingAnswer) VotingSubject(com.faforever.api.data.domain.VotingSubject) VotingQuestion(com.faforever.api.data.domain.VotingQuestion) VotingChoice(com.faforever.api.data.domain.VotingChoice) ApiException(com.faforever.api.error.ApiException) Test(org.junit.Test)

Example 9 with VotingQuestion

use of com.faforever.api.data.domain.VotingQuestion in project faf-java-api by FAForever.

the class VotingElideTest method testRevealWinnerOnEndedSubjectWorks.

@Test
@WithUserDetails(AUTH_MODERATOR)
public void testRevealWinnerOnEndedSubjectWorks() throws Exception {
    mockMvc.perform(patch("/data/votingSubject/2").header(HttpHeaders.CONTENT_TYPE, DataController.JSON_API_MEDIA_TYPE).content(PATCH_VOTING_SUBJECT_REVEAL_ID_2)).andExpect(status().isNoContent());
    VotingQuestion question = votingQuestionRepository.getOne(2);
    List<VotingChoice> winners = question.getWinners();
    assertThat(winners, hasSize(1));
    assertThat(winners.get(0).getId(), is(3));
}
Also used : VotingQuestion(com.faforever.api.data.domain.VotingQuestion) VotingChoice(com.faforever.api.data.domain.VotingChoice) AbstractIntegrationTest(com.faforever.api.AbstractIntegrationTest) Test(org.junit.Test) WithUserDetails(org.springframework.security.test.context.support.WithUserDetails)

Example 10 with VotingQuestion

use of com.faforever.api.data.domain.VotingQuestion in project faf-java-api by FAForever.

the class VotingSubjectEnricher method getWinners.

private List<VotingChoice> getWinners(VotingQuestion votingQuestion) {
    if (!votingQuestion.isAlternativeQuestion()) {
        OptionalInt max = votingQuestion.getVotingChoices().stream().mapToInt(value -> value.getVotingAnswers().size()).max();
        if (max.isPresent()) {
            return votingQuestion.getVotingChoices().stream().filter(votingChoice -> votingChoice.getVotingAnswers().size() == max.getAsInt()).collect(toList());
        }
        return Collections.emptyList();
    }
    // All the answers sorted by their choice, but only those that are the 1st choice
    Map<VotingChoice, List<VotingAnswer>> votersByChoice = votingQuestion.getVotingChoices().stream().collect(Collectors.toMap(Function.identity(), choice -> new ArrayList<>(choice.getVotingAnswers().stream().filter(votingAnswer -> votingAnswer.getAlternativeOrdinal() == 0).collect(toList()))));
    while (votersByChoice.size() > 1) {
        OptionalInt min = votersByChoice.values().stream().mapToInt(List::size).min();
        List<VotingChoice> candidatesToEliminate = votersByChoice.entrySet().stream().filter(votingChoiceListEntry -> votingChoiceListEntry.getValue().size() == min.getAsInt()).map(Entry::getKey).collect(toList());
        if (candidatesToEliminate.size() == votersByChoice.size()) {
            // We got a problem here, we would eliminate all the candidates if we went on normally
            return candidatesToEliminate;
        }
        candidatesToEliminate.forEach(candidate -> {
            List<VotingAnswer> votingAnswersForCandidate = votersByChoice.get(candidate);
            // Lets distribute the answers of the candidate that is eliminated
            votingAnswersForCandidate.forEach(votingAnswer -> {
                int newAlternativeOrdinal = votingAnswer.getAlternativeOrdinal() + 1;
                votingAnswer.getVote().getVotingAnswers().stream().filter(votingAnswer1 -> votingAnswer1.getVotingChoice().getVotingQuestion().equals(votingAnswer.getVotingChoice().getVotingQuestion()) && votingAnswer1.getAlternativeOrdinal() == newAlternativeOrdinal).findFirst().ifPresent(votingAnswer1 -> {
                    VotingChoice votingChoice1 = votingAnswer1.getVotingChoice();
                    votersByChoice.get(votingChoice1).add(votingAnswer1);
                });
            });
            votersByChoice.remove(candidate);
        });
    }
    Optional<Entry<VotingChoice, List<VotingAnswer>>> first = votersByChoice.entrySet().stream().findFirst();
    return first.map(votingChoiceListEntry -> Collections.singletonList(votingChoiceListEntry.getKey())).orElse(Collections.emptyList());
}
Also used : PreUpdate(javax.persistence.PreUpdate) VotingAnswer(com.faforever.api.data.domain.VotingAnswer) VotingQuestion(com.faforever.api.data.domain.VotingQuestion) OptionalInt(java.util.OptionalInt) Function(java.util.function.Function) Collectors(java.util.stream.Collectors) VotingChoice(com.faforever.api.data.domain.VotingChoice) ArrayList(java.util.ArrayList) Inject(javax.inject.Inject) Strings(com.google.common.base.Strings) Component(org.springframework.stereotype.Component) List(java.util.List) Collectors.toList(java.util.stream.Collectors.toList) OffsetDateTime(java.time.OffsetDateTime) PostLoad(javax.persistence.PostLoad) Map(java.util.Map) MessageSourceAccessor(org.springframework.context.support.MessageSourceAccessor) Entry(java.util.Map.Entry) Optional(java.util.Optional) VotingSubject(com.faforever.api.data.domain.VotingSubject) VisibleForTesting(com.google.common.annotations.VisibleForTesting) Collections(java.util.Collections) Entry(java.util.Map.Entry) VotingAnswer(com.faforever.api.data.domain.VotingAnswer) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) Collectors.toList(java.util.stream.Collectors.toList) OptionalInt(java.util.OptionalInt) VotingChoice(com.faforever.api.data.domain.VotingChoice)

Aggregations

VotingQuestion (com.faforever.api.data.domain.VotingQuestion)10 VotingSubject (com.faforever.api.data.domain.VotingSubject)9 Test (org.junit.Test)9 Player (com.faforever.api.data.domain.Player)8 Vote (com.faforever.api.data.domain.Vote)8 VotingChoice (com.faforever.api.data.domain.VotingChoice)8 VotingAnswer (com.faforever.api.data.domain.VotingAnswer)5 ApiException (com.faforever.api.error.ApiException)3 AbstractIntegrationTest (com.faforever.api.AbstractIntegrationTest)1 VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 Strings (com.google.common.base.Strings)1 OffsetDateTime (java.time.OffsetDateTime)1 ArrayList (java.util.ArrayList)1 Collections (java.util.Collections)1 List (java.util.List)1 Map (java.util.Map)1 Entry (java.util.Map.Entry)1 Optional (java.util.Optional)1 OptionalInt (java.util.OptionalInt)1 Function (java.util.function.Function)1