Skip to content

Commit

Permalink
Merge pull request #423 from it-at-m/141-fix-wahlen-können-gelesen-un…
Browse files Browse the repository at this point in the history
…d-geschrieben-werden

141 fix wahlen können gelesen und geschrieben werden
  • Loading branch information
Nic12345678 authored Sep 30, 2024
2 parents dd21729 + 688e707 commit 8a5fe4a
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,9 @@ public List<WahltagModel> getWahltage(LocalDate tag) {
@Override
public List<WahlModel> getWahlen(final WahltagWithNummer wahltagWithNummer) throws WlsException {
return List.of(
new WahlModel("wahl1", "0", 1L, 1L, wahltagWithNummer.wahltag(), BTW, new Farbe(0, 1, 2), "1"),
new WahlModel("wahl2", "1", 2L, 1L, wahltagWithNummer.wahltag(), EUW, new Farbe(3, 4, 5), "1"),
new WahlModel("wahl3", "2", 3L, 1L, wahltagWithNummer.wahltag(), LTW, new Farbe(6, 7, 8), "1"));
new WahlModel("wahl1", "remoteWahl 0", 1L, 1L, wahltagWithNummer.wahltag(), BTW, new Farbe(0, 1, 2), "1"),
new WahlModel("wahl2", "remoteWahl 1", 2L, 1L, wahltagWithNummer.wahltag(), EUW, new Farbe(3, 4, 5), "1"),
new WahlModel("wahl3", "remoteWahl 2", 3L, 1L, wahltagWithNummer.wahltag(), LTW, new Farbe(6, 7, 8), "1"));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,24 @@ void falseWhenNoWahltagExists() {
}
}

@Test
void savingNewWahlenOverridesExistingWithSameId() {
repository.deleteAll();
val wahltagDateToFind = LocalDate.of(2024, 9, 3);
val wahlenToSave_First = List.of(
new Wahl("wahltagID1", "name1_first", 1, 1, wahltagDateToFind, Wahlart.BTW, null, "0"),
new Wahl("wahltagID2", "name2_first", 1, 1, wahltagDateToFind, Wahlart.BTW, null, "1"));
val wahlenToSave_Second = List.of(
new Wahl("wahltagID1", "name1_second", 1, 1, wahltagDateToFind.plusDays(1), Wahlart.BTW, null, "0"),
new Wahl("wahltagID2", "name2_second", 1, 1, wahltagDateToFind.minusDays(1), Wahlart.BTW, null, "1"));
repository.saveAll(wahlenToSave_First);
repository.saveAll(wahlenToSave_Second);

val foundWahlen = repository.findAll();

Assertions.assertThat(foundWahlen).containsExactlyInAnyOrderElementsOf(wahlenToSave_Second);
}

private List<Wahl> createWahlenList() {
val wahl1 = new Wahl("wahlID1", "name1", 3L, 1L, LocalDate.now().minusMonths(1), Wahlart.BAW, new Farbe(1, 1, 1), "1");
val wahl2 = new Wahl("wahlID2", "name2", 2L, 2L, LocalDate.now().plusMonths(1), Wahlart.EUW, new Farbe(2, 2, 2), "2");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ class PostWahlen {
void newDataIsSet() throws Exception {
var searchingForWahltag = new Wahltag("wahltagID", LocalDate.now(), "beschreibung5", "1");
wahltagRepository.save(searchingForWahltag);
val newData = createControllerListOfWahlDTO(searchingForWahltag);
val newData = createControllerListOfWahlDTO(searchingForWahltag, "");

SecurityUtils.runWith(Authorities.REPOSITORY_WRITE_WAHL, Authorities.SERVICE_POST_WAHLEN);
val request = MockMvcRequestBuilders.post("/businessActions/wahlen/" + searchingForWahltag.getWahltagID()).with(csrf())
Expand All @@ -209,24 +209,33 @@ void newDataIsSet() throws Exception {
void existingWahlenAreReplaced() throws Exception {
var searchingForWahltag = new Wahltag("wahltagID", LocalDate.now(), "beschreibung6", "1");
wahltagRepository.save(searchingForWahltag);
val newData = createControllerListOfWahlDTO(searchingForWahltag);
val oldData = createControllerListOfWahlDTO(searchingForWahltag, "");
SecurityUtils.runWith(Authorities.REPOSITORY_WRITE_WAHL, Authorities.SERVICE_POST_WAHLEN, Authorities.REPOSITORY_READ_WAHL);
val request = MockMvcRequestBuilders.post("/businessActions/wahlen/" + searchingForWahltag.getWahltagID()).with(csrf())
val requestFirst = MockMvcRequestBuilders.post("/businessActions/wahlen/" + searchingForWahltag.getWahltagID()).with(csrf())
.contentType(MediaType.APPLICATION_JSON).content(
objectMapper.writeValueAsString(newData));
api.perform(request).andExpect(status().isOk());

val expectedPostedWahlen = wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(dtoMapper.fromListOfWahlDTOtoListOfWahlModel(newData));
objectMapper.writeValueAsString(oldData));
api.perform(requestFirst).andExpect(status().isOk());
val expectedPostedWahlen_old = wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(dtoMapper.fromListOfWahlDTOtoListOfWahlModel(oldData));
val oldSavedWahlen = wahlRepository.findAll();

Assertions.assertThat(oldSavedWahlen).isEqualTo(expectedPostedWahlen);
Assertions.assertThat(oldSavedWahlen).isEqualTo(expectedPostedWahlen_old);

val newWahlen = createControllerListOfWahlDTO(searchingForWahltag, "newWahlen");
val requestSecond = MockMvcRequestBuilders.post("/businessActions/wahlen/" + searchingForWahltag.getWahltagID()).with(csrf())
.contentType(MediaType.APPLICATION_JSON).content(
objectMapper.writeValueAsString(newWahlen));
api.perform(requestSecond).andExpect(status().isOk());
val expectedPostedWahlen_new = wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(dtoMapper.fromListOfWahlDTOtoListOfWahlModel(newWahlen));
val newSavedWahlen = wahlRepository.findAll();

Assertions.assertThat(newSavedWahlen).isEqualTo(expectedPostedWahlen_new);
}

@Test
void fachlicheWlsExceptionWhenRequestIsInvalid() throws Exception {
var searchingForWahltag = new Wahltag("wahltagID", LocalDate.now(), "beschreibung7", "1");
wahltagRepository.save(searchingForWahltag);
val newData = createControllerListOfWahlDTO(searchingForWahltag);
val newData = createControllerListOfWahlDTO(searchingForWahltag, "");

SecurityUtils.runWith(Authorities.REPOSITORY_WRITE_WAHL, Authorities.SERVICE_POST_WAHLEN, Authorities.REPOSITORY_READ_WAHL);
val request = MockMvcRequestBuilders.post("/businessActions/wahlen/" + " ").with(csrf()).contentType(MediaType.APPLICATION_JSON).content(
Expand Down Expand Up @@ -260,7 +269,7 @@ void fachlicheWlsExceptionWhenNotSaveableCauseOfMissingRequestbody() throws Exce
class ResetWahlen {

@Test
void existingWahlenAreReplaced() throws Exception {
void existingWahlenAreReseted() throws Exception {
SecurityUtils.runWith(Authorities.REPOSITORY_WRITE_WAHL);
val oldRepositoryWahlen = createWahlEntities();
wahlRepository.saveAll(oldRepositoryWahlen);
Expand Down Expand Up @@ -303,12 +312,16 @@ private Set<WahlDTO> createClientSetOfWahlDTO(Wahltag searchingForWahltag) {
return Set.of(wahl1, wahl2, wahl3).stream().filter(wahl -> (wahl.getWahltag().equals(searchingForWahltag.getWahltag()))).collect(Collectors.toSet());
}

private List<de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO> createControllerListOfWahlDTO(Wahltag searchingForWahltag) {
val wahl1 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO("wahlID1", "name1", 3L, 1L, searchingForWahltag.getWahltag(),
private List<de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO> createControllerListOfWahlDTO(Wahltag searchingForWahltag,
final String namePraefix) {
val wahl1 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO("wahlID1", namePraefix + "name1", 3L, 1L,
searchingForWahltag.getWahltag(),
Wahlart.BAW, new Farbe(1, 1, 1), "1");
val wahl2 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO("wahlID2", "name2", 3L, 1L, searchingForWahltag.getWahltag(),
val wahl2 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO("wahlID2", namePraefix + "name2", 3L, 1L,
searchingForWahltag.getWahltag(),
Wahlart.BAW, new Farbe(1, 1, 1), "2");
val wahl3 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO("wahlID3", "name3", 3L, 1L, LocalDate.now().plusMonths(2),
val wahl3 = new de.muenchen.oss.wahllokalsystem.basisdatenservice.rest.wahlen.WahlDTO("wahlID3", namePraefix + "name3", 3L, 1L,
LocalDate.now().plusMonths(2),
Wahlart.BAW, new Farbe(1, 1, 1), "3");

return Stream.of(wahl1, wahl2, wahl3).filter(wahl -> (wahl.wahltag().equals(searchingForWahltag.getWahltag()))).collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class GetWahlen {
@Test
void ifRepoDataFoundThanReturnsRepoDataAndMakesNoCallToRemoteClient() {
var searchingForWahltag = new WahltagModel("wahltagID", LocalDate.now(), "beschreibung14", "1");
List<Wahl> mockedListOfEntities = createWahlEntities();
List<Wahl> mockedListOfEntities = createWahlEntities("");
List<WahlModel> mockedListOfModels = createWahlModels("");
Mockito.doNothing().when(wahlenValidator).validWahlenCriteriaOrThrow("wahltagID");

Expand All @@ -73,7 +73,7 @@ void ifRepoDataFoundThanReturnsRepoDataAndMakesNoCallToRemoteClient() {
@Test
void ifRepoDataNotFoundThanReturnsRemoteClientData() {
var searchingForWahltag = new WahltagModel("wahltagID", LocalDate.now(), "beschreibung15", "1");
List<Wahl> mockedListOfEntities = createWahlEntities();
List<Wahl> mockedListOfEntities = createWahlEntities("");
List<WahlModel> mockedListOfModelsIfClientCall = createWahlModels("clientPraefix");
Mockito.doNothing().when(wahlenValidator).validWahlenCriteriaOrThrow("wahltagID");

Expand All @@ -98,7 +98,7 @@ class PostWahlen {
void dataSaved() {
val wahltagID = "wahltagID";
List<WahlModel> mockedListOfModels = createWahlModels("");
List<Wahl> mockedListOfEntities = createWahlEntities();
List<Wahl> mockedListOfEntities = createWahlEntities("");
val wahlenToWrite = new WahlenWriteModel(wahltagID, mockedListOfModels);

Mockito.when(wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(mockedListOfModels)).thenReturn(mockedListOfEntities);
Expand All @@ -112,7 +112,7 @@ void dataSaved() {
void wlsExceptionWhenSavingFailed() {
val wahltagID = "wahltagID";
List<WahlModel> mockedListOfModels = createWahlModels("");
List<Wahl> mockedListOfEntities = createWahlEntities();
List<Wahl> mockedListOfEntities = createWahlEntities("");
val wahlenToWrite = new WahlenWriteModel(wahltagID, mockedListOfModels);

val mockedRepoSaveException = new RuntimeException("saving failed");
Expand All @@ -125,6 +125,48 @@ void wlsExceptionWhenSavingFailed() {

Assertions.assertThatThrownBy(() -> unitUnderTest.postWahlen(wahlenToWrite)).isSameAs(mockedWlsException);
}

@Test
void postingNewWahlenOverridesExistingWithSameId() {
val wahltagID = "wahltagID";
var searchingForWahltag = new WahltagModel(wahltagID, LocalDate.now().plusMonths(1), "beschreibung1", "1");

List<WahlModel> mockedListOfModelsFirst = createWahlModels("first");
List<Wahl> mockedListOfEntitiesFirst = createWahlEntities("first");
val wahlenToWriteFirst = new WahlenWriteModel(wahltagID, mockedListOfModelsFirst);
Mockito.when(wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(mockedListOfModelsFirst)).thenReturn(mockedListOfEntitiesFirst);
Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.postWahlen(wahlenToWriteFirst));
Mockito.verify(wahlenValidator).validWahlenWriteModelOrThrow(new WahlenWriteModel(wahltagID, mockedListOfModelsFirst));
Mockito.verify(wahlRepository).saveAll(mockedListOfEntitiesFirst);
Mockito.doNothing().when(wahlenValidator).validWahlenCriteriaOrThrow(wahltagID);
Mockito.when(wahltageService.getWahltagByID(wahltagID)).thenReturn(searchingForWahltag);
Mockito.when(wahlRepository.existsByWahltag(searchingForWahltag.wahltag())).thenReturn(true);
Mockito.when(wahlRepository.findByWahltagOrderByReihenfolge(searchingForWahltag.wahltag())).thenReturn(mockedListOfEntitiesFirst);
Mockito.when(wahlModelMapper.fromListOfWahlEntityToListOfWahlModel(mockedListOfEntitiesFirst)).thenReturn(mockedListOfModelsFirst);

val expectedResultFirst = wahlModelMapper.fromListOfWahlEntityToListOfWahlModel(mockedListOfEntitiesFirst);
val resultFirst = unitUnderTest.getWahlen(wahltagID);
Assertions.assertThatCode(() -> unitUnderTest.getWahlen(wahltagID)).doesNotThrowAnyException();
Assertions.assertThat(resultFirst).isEqualTo(expectedResultFirst);

List<WahlModel> mockedListOfModelsSecond = createWahlModels("second");
List<Wahl> mockedListOfEntitiesSecond = createWahlEntities("second");
val wahlenToWriteSecond = new WahlenWriteModel(wahltagID, mockedListOfModelsSecond);
Mockito.when(wahlModelMapper.fromListOfWahlModeltoListOfWahlEntities(mockedListOfModelsSecond)).thenReturn(mockedListOfEntitiesSecond);
Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.postWahlen(wahlenToWriteSecond));
Mockito.verify(wahlenValidator).validWahlenWriteModelOrThrow(new WahlenWriteModel(wahltagID, mockedListOfModelsSecond));
Mockito.verify(wahlRepository).saveAll(mockedListOfEntitiesSecond);

Mockito.when(wahlRepository.findByWahltagOrderByReihenfolge(searchingForWahltag.wahltag())).thenReturn(mockedListOfEntitiesSecond);
Mockito.when(wahlModelMapper.fromListOfWahlEntityToListOfWahlModel(mockedListOfEntitiesSecond)).thenReturn(mockedListOfModelsSecond);

val expectedResultSecond = wahlModelMapper.fromListOfWahlEntityToListOfWahlModel(mockedListOfEntitiesSecond);
val resultSecond = unitUnderTest.getWahlen(wahltagID);
Assertions.assertThatCode(() -> unitUnderTest.getWahlen(wahltagID)).doesNotThrowAnyException();
Assertions.assertThat(resultSecond).isEqualTo(expectedResultSecond);

Mockito.verifyNoInteractions(wahlenClient);
}
}

@Nested
Expand All @@ -134,11 +176,11 @@ class ResetWahlen {
void dataSuccessfullyReseted() {
ArgumentCaptor<List<Wahl>> reqCaptor = ArgumentCaptor.forClass(List.class);

val wahlenToReset = createWahlEntities();
val wahlenToReset = createWahlEntities("");
Mockito.when(wahlRepository.findAll()).thenReturn(wahlenToReset);
Assertions.assertThatNoException().isThrownBy(() -> unitUnderTest.resetWahlen());

val resetedWahlen = createWahlEntities().stream().map(this::resetWahl).toList();
val resetedWahlen = createWahlEntities("").stream().map(this::resetWahl).toList();

Mockito.verify(wahlRepository).saveAll(reqCaptor.capture());
Assertions.assertThat(reqCaptor.getValue()).containsExactlyInAnyOrderElementsOf(resetedWahlen);
Expand All @@ -152,10 +194,10 @@ private Wahl resetWahl(Wahl wahl) {
}
}

private List<Wahl> createWahlEntities() {
private List<Wahl> createWahlEntities(final String clientPraefix) {
Wahl wahl1 = new Wahl();
wahl1.setWahlID("wahlid1");
wahl1.setName("wahl1");
wahl1.setName(clientPraefix + "wahl1");
wahl1.setNummer("0");
wahl1.setFarbe(new Farbe(1, 1, 1));
wahl1.setWahlart(Wahlart.BAW);
Expand All @@ -165,7 +207,7 @@ private List<Wahl> createWahlEntities() {

Wahl wahl2 = new Wahl();
wahl2.setWahlID("wahlid2");
wahl2.setName("wahl2");
wahl2.setName(clientPraefix + "wahl2");
wahl2.setNummer("1");
wahl2.setFarbe(new Farbe(2, 2, 2));
wahl2.setWahlart(Wahlart.LTW);
Expand All @@ -175,7 +217,7 @@ private List<Wahl> createWahlEntities() {

Wahl wahl3 = new Wahl();
wahl3.setWahlID("wahlid3");
wahl3.setName("wahl3");
wahl3.setName(clientPraefix + "wahl3");
wahl3.setNummer("2");
wahl3.setFarbe(new Farbe(3, 3, 3));
wahl3.setWahlart(Wahlart.EUW);
Expand Down
20 changes: 16 additions & 4 deletions wls-basisdaten-service/src/test/resources/wahlen.http
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,29 @@ GET {{ SSO_URL }}/auth/realms/wls_realm/protocol/openid-connect/userinfo
Authorization: {{ token_type }} {{ auth_token }}

### POST Wahlen
## Hier wird das Datum des Wahltages mit der wahltagID1 gesetzt (today - 2 months) - siehe DummyClient
< {%
const today = new Date();
let dd = today.getDate();
const mm = today.getMonth();
let yyyy_2MonthsBefore = (mm < 2) ? new Date().getFullYear() - 1 : new Date().getFullYear();
let mm_2MonthsBefore = (mm % 12) - 1;
if (dd < 10) dd = '0' + dd;
if (mm_2MonthsBefore < 10) mm_2MonthsBefore = '0' + mm_2MonthsBefore;
const dateOfWahltagID1 = ('"' + yyyy_2MonthsBefore + '-' + mm_2MonthsBefore + '-' + dd + '"');
request.variables.set("dateOfWahltagID1", dateOfWahltagID1);
%}
POST {{ WLS_BASISDATEN_SERVICE_URL }}//businessActions/wahlen/wahltagID1
Authorization: {{ token_type }} {{ auth_token }}
Content-Type: application/json

[
{
"wahlID": "wahl1",
"name": "0",
"name": "aName_1",
"reihenfolge": 1,
"waehlerverzeichnisnummer": 1,
"wahltag": "2024-06-06",
"wahltag": {{ dateOfWahltagID1 }},
"wahlart": "BTW",
"farbe": {
"r": 0,
Expand All @@ -42,7 +54,7 @@ Content-Type: application/json
"name": "1",
"reihenfolge": 2,
"waehlerverzeichnisnummer": 1,
"wahltag": "2024-06-06",
"wahltag": {{ dateOfWahltagID1 }},
"wahlart": "EUW",
"farbe": {
"r": 3,
Expand All @@ -56,7 +68,7 @@ Content-Type: application/json
"name": "2-",
"reihenfolge": 3,
"waehlerverzeichnisnummer": 1,
"wahltag": "2024-06-06",
"wahltag": {{ dateOfWahltagID1 }},
"wahlart": "LTW",
"farbe": {
"r": 6,
Expand Down

0 comments on commit 8a5fe4a

Please sign in to comment.