diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/ElectedResultMapper.java b/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/ElectedResultMapper.java index 91ae57a..85d075e 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/ElectedResultMapper.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/ElectedResultMapper.java @@ -1,10 +1,12 @@ package de.twomartens.wahlrecht.mapper.v1; import de.twomartens.wahlrecht.model.dto.v1.ElectedCandidate; -import de.twomartens.wahlrecht.model.dto.v1.VotingResult; +import de.twomartens.wahlrecht.model.dto.v1.NominationId; import de.twomartens.wahlrecht.model.internal.ElectedResult; import java.util.Collection; import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; import org.mapstruct.NullValueCheckStrategy; @@ -17,19 +19,19 @@ public interface ElectedResultMapper { de.twomartens.wahlrecht.model.dto.v1.ElectedResult mapToExternal(ElectedResult result); - Map> mapToExternal( - Map> mapToExternal( + Map> value); Collection mapToExternal( Collection value); - ElectedResult mapToInternal(de.twomartens.wahlrecht.model.dto.v1.ElectedResult result); + default Map> map( + Map> value) { + return value.entrySet().stream() + .collect(Collectors.toMap(entry -> entry.getKey().getNominationId(), Entry::getValue)); + } - Map> mapToInternal( - Map> value); - - Collection mapToInternal( - Collection value); } diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/NominationIdMapper.java b/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/NominationIdMapper.java new file mode 100644 index 0000000..5d26c5b --- /dev/null +++ b/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/NominationIdMapper.java @@ -0,0 +1,14 @@ +package de.twomartens.wahlrecht.mapper.v1; + +import de.twomartens.wahlrecht.model.dto.v1.NominationId; +import org.mapstruct.CollectionMappingStrategy; +import org.mapstruct.Mapper; +import org.mapstruct.NullValueCheckStrategy; +import org.mapstruct.ReportingPolicy; + +@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, + unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface NominationIdMapper { + NominationId mapToExternal(de.twomartens.wahlrecht.model.internal.NominationId id); +} diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/NominationMapper.java b/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/NominationMapper.java index f8a168a..8b60d1c 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/NominationMapper.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/NominationMapper.java @@ -2,6 +2,7 @@ package de.twomartens.wahlrecht.mapper.v1; import de.twomartens.wahlrecht.model.db.Nomination; import de.twomartens.wahlrecht.model.internal.Candidate; +import de.twomartens.wahlrecht.model.internal.NominationId; import java.util.Collection; import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; @@ -16,15 +17,35 @@ public interface NominationMapper { de.twomartens.wahlrecht.model.dto.v1.Nomination mapToExternal(Nomination nomination); - de.twomartens.wahlrecht.model.internal.Nomination mapToInternal( - de.twomartens.wahlrecht.model.dto.v1.Nomination nomination); + default de.twomartens.wahlrecht.model.internal.Nomination mapToInternal( + de.twomartens.wahlrecht.model.dto.v1.Nomination nomination) { + de.twomartens.wahlrecht.model.internal.Nomination result = + new de.twomartens.wahlrecht.model.internal.Nomination( + new NominationId(nomination.getElectionName(), nomination.getPartyAbbreviation(), + nomination.getName()), + nomination.isSupportVotesOnNomination() + ); + result.addCandidates(mapFromDto(nomination.getCandidates())); + return result; + } - de.twomartens.wahlrecht.model.internal.Nomination mapToInternal(Nomination nomination); + default de.twomartens.wahlrecht.model.internal.Nomination mapToInternal(Nomination nomination) { + de.twomartens.wahlrecht.model.internal.Nomination result = + new de.twomartens.wahlrecht.model.internal.Nomination( + new NominationId(nomination.getElectionName(), nomination.getPartyAbbreviation(), + nomination.getName()), + nomination.isSupportVotesOnNomination() + ); + result.addCandidates(mapFromDb(nomination.getCandidates())); + return result; + } @Mapping(target = "id", ignore = true) @Mapping(target = "created", ignore = true) @Mapping(target = "lastModified", ignore = true) Nomination mapToDB(de.twomartens.wahlrecht.model.dto.v1.Nomination nomination); - Collection map(Collection candidates); + Collection mapFromDb(Collection candidates); + + Collection mapFromDto(Collection candidates); } diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/VotingResultMapper.java b/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/VotingResultMapper.java index e6c70a4..2c0d4a9 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/VotingResultMapper.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/mapper/v1/VotingResultMapper.java @@ -1,5 +1,6 @@ package de.twomartens.wahlrecht.mapper.v1; +import de.twomartens.wahlrecht.model.internal.NominationId; import de.twomartens.wahlrecht.model.internal.VotingResult; import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; @@ -11,7 +12,24 @@ import org.mapstruct.ReportingPolicy; unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface VotingResultMapper { - de.twomartens.wahlrecht.model.dto.v1.VotingResult mapToExternal(VotingResult result); + default de.twomartens.wahlrecht.model.dto.v1.VotingResult mapToExternal(VotingResult result) { + return new de.twomartens.wahlrecht.model.dto.v1.VotingResult( + result.getNominationId().electionName(), + result.getNominationId().partyAbbreviation(), + result.getNominationId().name(), + result.getVotesOnNomination(), + result.getVotesThroughHealing(), + result.getVotesPerPosition() + ); + } - VotingResult mapToInternal(de.twomartens.wahlrecht.model.dto.v1.VotingResult result); + default VotingResult mapToInternal(de.twomartens.wahlrecht.model.dto.v1.VotingResult result) { + return new VotingResult( + new NominationId(result.electionName(), result.partyAbbreviation(), + result.nominationName()), + result.votesOnNomination(), + result.votesThroughHealing(), + result.votesPerPosition() + ); + } } diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/ElectedResult.java b/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/ElectedResult.java index 41fa17e..4aad250 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/ElectedResult.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/ElectedResult.java @@ -1,12 +1,13 @@ package de.twomartens.wahlrecht.model.dto.v1; +import de.twomartens.wahlrecht.model.internal.NominationId; import java.util.Collection; import java.util.LinkedList; import java.util.Map; import lombok.Builder; @Builder -public record ElectedResult(Map> electedCandidates, +public record ElectedResult(Map> electedCandidates, LinkedList usedElectionNumbers) { } diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/NominationId.java b/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/NominationId.java new file mode 100644 index 0000000..6eadcfb --- /dev/null +++ b/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/NominationId.java @@ -0,0 +1,5 @@ +package de.twomartens.wahlrecht.model.dto.v1; + +public record NominationId(String electionName, String partyAbbreviation, String name) { + +} diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/PartyInElection.java b/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/PartyInElection.java index e81e547..4c4f707 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/PartyInElection.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/PartyInElection.java @@ -17,11 +17,12 @@ import org.springframework.lang.NonNull; @ToString(onlyExplicitlyIncluded = true) @FieldDefaults(level = AccessLevel.PRIVATE) public class PartyInElection { - String electionName; - @Include - String abbreviation; - String name; - Nomination overallNomination; - @NonNull - Map constituencyNominations = new HashMap<>(); + + String electionName; + @Include + String abbreviation; + String name; + Nomination overallNomination; + @NonNull + Map constituencyNominations = new HashMap<>(); } diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/VotingResult.java b/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/VotingResult.java index 4bdeda4..1958e78 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/VotingResult.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/model/dto/v1/VotingResult.java @@ -2,7 +2,8 @@ package de.twomartens.wahlrecht.model.dto.v1; import java.util.Map; -public record VotingResult(int votesOnNomination, int votesThroughHealing, Integer totalVotes, - Map votesPerPosition, String nominationName) { +public record VotingResult(String electionName, String partyAbbreviation, String nominationName, + int votesOnNomination, int votesThroughHealing, + Map votesPerPosition) { } diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/ElectedResult.java b/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/ElectedResult.java index 1ba7ccc..9da5976 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/ElectedResult.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/ElectedResult.java @@ -11,9 +11,9 @@ import lombok.Builder; public record ElectedResult(Map> electedCandidates, LinkedList usedElectionNumbers) { - public Map> electedCandidatesByNomination() { + public Map> electedCandidatesByNomination() { return electedCandidates.entrySet().stream() - .collect(Collectors.toMap(entry -> entry.getKey().getNomination(), Entry::getValue)); + .collect(Collectors.toMap(entry -> entry.getKey().getNominationId(), Entry::getValue)); } } diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/Nomination.java b/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/Nomination.java index b454d4a..4a16da1 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/Nomination.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/Nomination.java @@ -6,18 +6,13 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import lombok.Getter; import lombok.RequiredArgsConstructor; -import lombok.ToString; -import lombok.ToString.Include; @RequiredArgsConstructor -@ToString(onlyExplicitlyIncluded = true) public class Nomination { - - private final String electionName; - private final String partyAbbreviation; - @Include - private final String name; + @Getter + private final NominationId id; private final boolean supportVotesOnNomination; private final List candidates = new ArrayList<>(); private final Map candidateToPosition = new HashMap<>(); @@ -52,4 +47,9 @@ public class Nomination { public boolean supportsVotesOnNomination() { return supportVotesOnNomination; } + + @Override + public String toString() { + return id.name(); + } } diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/SeatResult.java b/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/SeatResult.java index ca95cbe..f077981 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/SeatResult.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/SeatResult.java @@ -10,8 +10,8 @@ import lombok.Builder; public record SeatResult(Map seatsPerResult, LinkedList usedElectionNumbers) { - public Map seatsPerNomination() { + public Map seatsPerNomination() { return seatsPerResult.entrySet().stream() - .collect(Collectors.toMap(entry -> entry.getKey().getNomination(), Entry::getValue)); + .collect(Collectors.toMap(entry -> entry.getKey().getNominationId(), Entry::getValue)); } } diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/VotingResult.java b/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/VotingResult.java index 28ea5f7..d3599cd 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/VotingResult.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/model/internal/VotingResult.java @@ -7,19 +7,19 @@ import lombok.Getter; @Getter public class VotingResult { + private final NominationId nominationId; private final int votesOnNomination; private final int votesThroughHealing; private final Map votesPerPosition; - private final Nomination nomination; private Integer totalVotes = null; @Builder - public VotingResult(int votesOnNomination, int votesThroughHealing, - Map votesPerPosition, Nomination nomination) { + public VotingResult(NominationId nominationId, int votesOnNomination, int votesThroughHealing, + Map votesPerPosition) { this.votesOnNomination = votesOnNomination; this.votesThroughHealing = votesThroughHealing; this.votesPerPosition = votesPerPosition; - this.nomination = nomination; + this.nominationId = nominationId; } public int getTotalVotes() { diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/service/CalculationService.java b/module-server/src/main/java/de/twomartens/wahlrecht/service/CalculationService.java index 0b42393..f59a407 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/service/CalculationService.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/service/CalculationService.java @@ -7,6 +7,7 @@ import de.twomartens.wahlrecht.model.internal.ElectedCandidate; import de.twomartens.wahlrecht.model.internal.ElectedResult; import de.twomartens.wahlrecht.model.internal.Election; import de.twomartens.wahlrecht.model.internal.Nomination; +import de.twomartens.wahlrecht.model.internal.NominationId; import de.twomartens.wahlrecht.model.internal.SeatResult; import de.twomartens.wahlrecht.model.internal.VotingResult; import java.util.ArrayList; @@ -20,14 +21,20 @@ import java.util.Map; import java.util.Map.Entry; import java.util.function.Function; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; +@RequiredArgsConstructor @Service public class CalculationService { + private final NominationService nominationService; + private final LinkedList electionNumberHistory = new LinkedList<>(); + + public ElectedResult calculateConstituency(@NonNull Constituency constituency, @NonNull Collection votingResults) { electionNumberHistory.clear(); @@ -127,7 +134,8 @@ public class CalculationService { Map electedCandidateMap = alreadyElectedCandidates.stream() .collect(Collectors.toMap(ElectedCandidate::candidate, Function.identity())); - Nomination nomination = votingResult.getNomination(); + NominationId nominationId = votingResult.getNominationId(); + Nomination nomination = nominationService.getNominationInternal(nominationId); if (nomination.supportsVotesOnNomination()) { int seatsByNomination = calculateSeatsByNominationOrder(votingResult, numberOfSeats); seatsByVoteOrder = numberOfSeats - seatsByNomination; diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/service/NominationService.java b/module-server/src/main/java/de/twomartens/wahlrecht/service/NominationService.java index d0b6945..67d1d66 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/service/NominationService.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/service/NominationService.java @@ -1,5 +1,6 @@ package de.twomartens.wahlrecht.service; +import de.twomartens.wahlrecht.mapper.v1.NominationMapper; import de.twomartens.wahlrecht.model.db.Candidate; import de.twomartens.wahlrecht.model.db.Nomination; import de.twomartens.wahlrecht.model.internal.NominationId; @@ -10,16 +11,29 @@ import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; +import org.mapstruct.factory.Mappers; import org.springframework.stereotype.Service; @RequiredArgsConstructor @Service public class NominationService { + private final NominationMapper mapper = Mappers.getMapper(NominationMapper.class); private final NominationRepository repository; private final CandidateService candidateService; private Map nominations; + public Nomination getNomination(NominationId id) { + if (nominations == null) { + fetchNominations(); + } + return nominations.get(id); + } + + public de.twomartens.wahlrecht.model.internal.Nomination getNominationInternal(NominationId id) { + return mapper.mapToInternal(getNomination(id)); + } + public Nomination storeNomination(Nomination nomination) { if (nomination == null) { return null; diff --git a/module-server/src/main/java/de/twomartens/wahlrecht/service/PartyService.java b/module-server/src/main/java/de/twomartens/wahlrecht/service/PartyService.java index b8bdbc5..9381bec 100644 --- a/module-server/src/main/java/de/twomartens/wahlrecht/service/PartyService.java +++ b/module-server/src/main/java/de/twomartens/wahlrecht/service/PartyService.java @@ -39,7 +39,7 @@ public class PartyService { abbreviation, electionName); if (optionalParty.isEmpty()) { throw new ResponseStatusException(HttpStatus.NOT_FOUND, - "no party found for %s and %s" .formatted(electionName, abbreviation)); + "no party found for %s and %s".formatted(electionName, abbreviation)); } return optionalParty.get(); } diff --git a/module-server/src/test/java/de/twomartens/wahlrecht/service/CalculationServiceTest.java b/module-server/src/test/java/de/twomartens/wahlrecht/service/CalculationServiceTest.java index 894d708..2106a4c 100644 --- a/module-server/src/test/java/de/twomartens/wahlrecht/service/CalculationServiceTest.java +++ b/module-server/src/test/java/de/twomartens/wahlrecht/service/CalculationServiceTest.java @@ -1,5 +1,7 @@ package de.twomartens.wahlrecht.service; +import static org.mockito.Mockito.when; + import de.twomartens.wahlrecht.model.internal.Candidate; import de.twomartens.wahlrecht.model.internal.Constituency; import de.twomartens.wahlrecht.model.internal.Elected; @@ -7,6 +9,7 @@ import de.twomartens.wahlrecht.model.internal.ElectedCandidate; import de.twomartens.wahlrecht.model.internal.ElectedResult; import de.twomartens.wahlrecht.model.internal.Election; import de.twomartens.wahlrecht.model.internal.Nomination; +import de.twomartens.wahlrecht.model.internal.NominationId; import de.twomartens.wahlrecht.model.internal.SeatResult; import de.twomartens.wahlrecht.model.internal.VotingResult; import de.twomartens.wahlrecht.model.internal.VotingThreshold; @@ -23,8 +26,12 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.lang.NonNull; +@ExtendWith(MockitoExtension.class) class CalculationServiceTest { private static final String BEZIRKSWAHL = "Bezirkswahl 2019"; @@ -106,6 +113,9 @@ class CalculationServiceTest { 871, 1907, 987); private CalculationService service; + @Mock + private NominationService nominationService; + @BeforeAll static void setUp() { setUpCandidatesConstituency(); @@ -152,7 +162,7 @@ class CalculationServiceTest { .votesThroughHealing(votesThroughHealing) .votesOnNomination(votesOnNomination) .votesPerPosition(buildVotesPerPosition(votes)) - .nomination(nomination) + .nominationId(nomination.getId()) .build(); } @@ -223,7 +233,8 @@ class CalculationServiceTest { private static Nomination buildNomination(String partyAbbreviation, String name, boolean supportVotesOnNomination) { - return new Nomination(BEZIRKSWAHL, partyAbbreviation, name, supportVotesOnNomination); + return new Nomination(new NominationId(BEZIRKSWAHL, partyAbbreviation, name), + supportVotesOnNomination); } private static Collection buildCandidates(String... names) { @@ -239,7 +250,7 @@ class CalculationServiceTest { @BeforeEach void setService() { - service = new CalculationService(); + service = new CalculationService(nominationService); } @Test @@ -252,16 +263,18 @@ class CalculationServiceTest { FDP_NIENDORF_RESULT, AFD_NIENDORF_RESULT ); - + when(nominationService.getNominationInternal(SPD_NIENDORF.getId())).thenReturn(SPD_NIENDORF); + when(nominationService.getNominationInternal(CDU_NIENDORF.getId())).thenReturn(CDU_NIENDORF); + when(nominationService.getNominationInternal(GRUENE_NIENDORF.getId())).thenReturn(GRUENE_NIENDORF); ElectedResult elected = service.calculateConstituency(NIENDORF, votingResults); Assertions.assertThat(elected.electedCandidatesByNomination()) - .containsKey(SPD_NIENDORF) - .containsKey(CDU_NIENDORF) - .containsKey(GRUENE_NIENDORF) - .doesNotContainKey(LINKE_NIENDORF) - .doesNotContainKey(AFD_NIENDORF) - .doesNotContainKey(FDP_NIENDORF); + .containsKey(SPD_NIENDORF.getId()) + .containsKey(CDU_NIENDORF.getId()) + .containsKey(GRUENE_NIENDORF.getId()) + .doesNotContainKey(LINKE_NIENDORF.getId()) + .doesNotContainKey(AFD_NIENDORF.getId()) + .doesNotContainKey(FDP_NIENDORF.getId()); } @Test @@ -285,12 +298,12 @@ class CalculationServiceTest { SeatResult result = service.calculateOverallSeatDistribution(election, votingResults); Assertions.assertThat(result.seatsPerNomination()) - .containsEntry(SPD_BEZIRK, 12) - .containsEntry(CDU_BEZIRK, 9) - .containsEntry(LINKE_BEZIRK, 5) - .containsEntry(FDP_BEZIRK, 3) - .containsEntry(GRUENE_BEZIRK, 19) - .containsEntry(AFD_BEZIRK, 3); + .containsEntry(SPD_BEZIRK.getId(), 12) + .containsEntry(CDU_BEZIRK.getId(), 9) + .containsEntry(LINKE_BEZIRK.getId(), 5) + .containsEntry(FDP_BEZIRK.getId(), 3) + .containsEntry(GRUENE_BEZIRK.getId(), 19) + .containsEntry(AFD_BEZIRK.getId(), 3); } @Test @@ -304,29 +317,35 @@ class CalculationServiceTest { AFD_BEZIRK_RESULT, 3 ); Map> electedCandidates = setUpConstituencyResults(); + when(nominationService.getNominationInternal(SPD_BEZIRK.getId())).thenReturn(SPD_BEZIRK); + when(nominationService.getNominationInternal(CDU_BEZIRK.getId())).thenReturn(CDU_BEZIRK); + when(nominationService.getNominationInternal(FDP_BEZIRK.getId())).thenReturn(FDP_BEZIRK); + when(nominationService.getNominationInternal(GRUENE_BEZIRK.getId())).thenReturn(GRUENE_BEZIRK); + when(nominationService.getNominationInternal(LINKE_BEZIRK.getId())).thenReturn(LINKE_BEZIRK); + when(nominationService.getNominationInternal(AFD_BEZIRK.getId())).thenReturn(AFD_BEZIRK); ElectedResult result = service.calculateElectedOverallCandidates(seatsPerVotingResult, electedCandidates); Assertions.assertThat(result.electedCandidatesByNomination()) - .anySatisfy((nomination, candidates) -> { - Assertions.assertThat(nomination).isEqualTo(SPD_BEZIRK); + .anySatisfy((id, candidates) -> { + Assertions.assertThat(id).isEqualTo(SPD_BEZIRK.getId()); Assertions.assertThat(candidates) .anyMatch(candidate -> candidate.name().equals(GOTTLIEB_GABOR) && candidate.elected() == Elected.OVERALL_NOMINATION_ORDER) .anyMatch(candidate -> candidate.name().equals(RIEGEL_ANN_KATHRIN) && candidate.elected() == Elected.OVERALL_VOTE_ORDER); }) - .anySatisfy((nomination, candidates) -> { - Assertions.assertThat(nomination).isEqualTo(CDU_BEZIRK); + .anySatisfy((id, candidates) -> { + Assertions.assertThat(id).isEqualTo(CDU_BEZIRK.getId()); Assertions.assertThat(candidates) .anyMatch(candidate -> candidate.name().equals(HOEFLICH_JUTTA) && candidate.elected() == Elected.OVERALL_NOMINATION_ORDER) .anyMatch(candidate -> candidate.name().equals(DR_LANGHEIN_A_W_HEINRICH) && candidate.elected() == Elected.OVERALL_VOTE_ORDER); }) - .anySatisfy((nomination, candidates) -> { - Assertions.assertThat(nomination).isEqualTo(LINKE_BEZIRK); + .anySatisfy((id, candidates) -> { + Assertions.assertThat(id).isEqualTo(LINKE_BEZIRK.getId()); Assertions.assertThat(candidates) .anyMatch(candidate -> candidate.name().equals(PAGELS_MANUELA) && candidate.elected() == Elected.OVERALL_NOMINATION_ORDER) @@ -335,8 +354,8 @@ class CalculationServiceTest { .anyMatch(candidate -> candidate.name().equals(KLEINERT_MIKEY) && candidate.elected() == Elected.OVERALL_VOTE_ORDER); }) - .anySatisfy((nomination, candidates) -> { - Assertions.assertThat(nomination).isEqualTo(FDP_BEZIRK); + .anySatisfy((id, candidates) -> { + Assertions.assertThat(id).isEqualTo(FDP_BEZIRK.getId()); Assertions.assertThat(candidates) .anyMatch(candidate -> candidate.name().equals(KRUEGER_KLAUS) && candidate.elected() == Elected.OVERALL_NOMINATION_ORDER) @@ -345,8 +364,8 @@ class CalculationServiceTest { .anyMatch(candidate -> candidate.name().equals(MUELLER_SOENKSEN_BURKHARDT) && candidate.elected() == Elected.OVERALL_VOTE_ORDER); }) - .anySatisfy((nomination, candidates) -> { - Assertions.assertThat(nomination).isEqualTo(AFD_BEZIRK); + .anySatisfy((id, candidates) -> { + Assertions.assertThat(id).isEqualTo(AFD_BEZIRK.getId()); Assertions.assertThat(candidates) .anyMatch(candidate -> candidate.name().equals(SCHOEMER_DIRK) && candidate.elected() == Elected.OVERALL_NOMINATION_ORDER) @@ -355,8 +374,8 @@ class CalculationServiceTest { .anyMatch(candidate -> candidate.name().equals(PILLATZKE_JOERG) && candidate.elected() == Elected.OVERALL_VOTE_ORDER); }) - .anySatisfy((nomination, candidates) -> { - Assertions.assertThat(nomination).isEqualTo(GRUENE_BEZIRK); + .anySatisfy((id, candidates) -> { + Assertions.assertThat(id).isEqualTo(GRUENE_BEZIRK.getId()); Assertions.assertThat(candidates) .anyMatch(candidate -> candidate.name().equals(KUHLMANN_DIETMAR) && candidate.elected() == Elected.OVERALL_NOMINATION_ORDER)