diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java index 8ac9a3bd..52f6231c 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java @@ -70,11 +70,21 @@ public class PersonService { return personRepository.save(person); } - @Transactional - public Person updatePerson(UUID id, PersonUpdateDTO dto) { - if (dto.getBirthYear() != null && dto.getDeathYear() != null && dto.getBirthYear() > dto.getDeathYear()) { + private void validateYears(Integer birthYear, Integer deathYear) { + if (birthYear != null && birthYear <= 0) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Geburtsjahr muss eine positive Zahl sein"); + } + if (deathYear != null && deathYear <= 0) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Todesjahr muss eine positive Zahl sein"); + } + if (birthYear != null && deathYear != null && birthYear > deathYear) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Geburtsjahr darf nicht nach dem Todesjahr liegen"); } + } + + @Transactional + public Person updatePerson(UUID id, PersonUpdateDTO dto) { + validateYears(dto.getBirthYear(), dto.getDeathYear()); Person person = personRepository.findById(id) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Person nicht gefunden")); person.setFirstName(dto.getFirstName()); diff --git a/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java b/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java index f2eb3628..fb0023fe 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java @@ -267,6 +267,56 @@ class PersonServiceTest { assertThat(result.getDeathYear()).isEqualTo(1900); } + // ─── Phase 1.3: Year range bounds (> 0) ────────────────────────────────── + + @Test + void updatePerson_throwsBadRequest_whenBirthYearIsZero() { + UUID id = UUID.randomUUID(); + + PersonUpdateDTO dto = new PersonUpdateDTO(); + dto.setFirstName("Anna"); dto.setLastName("Alt"); dto.setBirthYear(0); + assertThatThrownBy(() -> personService.updatePerson(id, dto)) + .isInstanceOf(ResponseStatusException.class) + .extracting(e -> ((ResponseStatusException) e).getStatusCode().value()) + .isEqualTo(400); + } + + @Test + void updatePerson_throwsBadRequest_whenBirthYearIsNegative() { + UUID id = UUID.randomUUID(); + + PersonUpdateDTO dto = new PersonUpdateDTO(); + dto.setFirstName("Anna"); dto.setLastName("Alt"); dto.setBirthYear(-5); + assertThatThrownBy(() -> personService.updatePerson(id, dto)) + .isInstanceOf(ResponseStatusException.class) + .extracting(e -> ((ResponseStatusException) e).getStatusCode().value()) + .isEqualTo(400); + } + + @Test + void updatePerson_throwsBadRequest_whenDeathYearIsZero() { + UUID id = UUID.randomUUID(); + + PersonUpdateDTO dto = new PersonUpdateDTO(); + dto.setFirstName("Anna"); dto.setLastName("Alt"); dto.setDeathYear(0); + assertThatThrownBy(() -> personService.updatePerson(id, dto)) + .isInstanceOf(ResponseStatusException.class) + .extracting(e -> ((ResponseStatusException) e).getStatusCode().value()) + .isEqualTo(400); + } + + @Test + void updatePerson_throwsBadRequest_whenDeathYearIsNegative() { + UUID id = UUID.randomUUID(); + + PersonUpdateDTO dto = new PersonUpdateDTO(); + dto.setFirstName("Anna"); dto.setLastName("Alt"); dto.setDeathYear(-10); + assertThatThrownBy(() -> personService.updatePerson(id, dto)) + .isInstanceOf(ResponseStatusException.class) + .extracting(e -> ((ResponseStatusException) e).getStatusCode().value()) + .isEqualTo(400); + } + // ─── findCorrespondents ────────────────────────────────────────────────── @Test