Skip to content

Commit a3b1d69

Browse files
authored
[Bug Fix] Restrict the removal of the last task owner (#567)
* fix: add orphan guard for the last owner of the task * test: update unit tests
1 parent ceac772 commit a3b1d69

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

src/main/java/com/itasocialacademy/oitassist/task/service/TaskServiceImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,11 @@ public TaskResponseDTO removeTaskOwner(Long taskId, RemoveOwnerRequestDTO remove
194194
.filter(o -> o.getId().getOwnerId().equals(userDetails.id())).findFirst();
195195

196196
if (toRemove.isPresent()) {
197+
if (task.getOwners().size() == 1) {
198+
throw new ValidationException(
199+
"Cannot remove the last owner of a task",
200+
ErrorCode.COMMON_VALIDATION_FAILED);
201+
}
197202
task.removeOwner(toRemove.get());
198203
} else {
199204
return getResponse(task);

src/test/java/com/itasocialacademy/oitassist/task/service/TaskServiceTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,12 @@ void addTaskOwner_alreadyOwner_shouldReturnWithoutChanges() {
545545

546546
@Test
547547
void removeTaskOwner_shouldSucceed() {
548+
TaskOwner secondOwner = TaskOwner.builder()
549+
.id(new TaskOwnerId(1L, 200L))
550+
.task(taskBody)
551+
.build();
552+
taskBody.addOwner(secondOwner);
553+
548554
RemoveOwnerRequestDTO request = new RemoveOwnerRequestDTO("currentowner@mail.com");
549555

550556
UserAuthDetails owner =
@@ -563,9 +569,31 @@ void removeTaskOwner_shouldSucceed() {
563569
assertFalse(taskBody.getOwners().stream()
564570
.anyMatch(o -> o.getId().getOwnerId().equals(100L)));
565571

572+
assertTrue(taskBody.getOwners().stream()
573+
.anyMatch(o -> o.getId().getOwnerId().equals(200L)));
574+
566575
verify(taskBodyMapper).toResponse(taskBody, testFiles, "creator@mail.com");
567576
}
568577

578+
@Test
579+
void removeTaskOwner_lastOwner_shouldThrowValidationException() {
580+
RemoveOwnerRequestDTO request = new RemoveOwnerRequestDTO("currentowner@mail.com");
581+
582+
UserAuthDetails owner =
583+
new UserAuthDetails(100L, "currentowner@mail.com", "12345678", Role.ORG);
584+
585+
when(securityFacade.hasRole("ADMIN")).thenReturn(true);
586+
when(taskBodyRepository.findById(1L)).thenReturn(Optional.of(taskBody));
587+
when(userFacade.findByEmail("currentowner@mail.com")).thenReturn(Optional.of(owner));
588+
589+
assertThrows(ValidationException.class,
590+
() -> taskService.removeTaskOwner(1L, request));
591+
592+
assertEquals(1, taskBody.getOwners().size());
593+
assertTrue(taskBody.getOwners().stream()
594+
.anyMatch(o -> o.getId().getOwnerId().equals(100L)));
595+
}
596+
569597
@Test
570598
void removeTaskOwner_notAdmin_shouldThrowTaskAccessRestrictedException() {
571599
RemoveOwnerRequestDTO request = new RemoveOwnerRequestDTO("currentowner@mail.com");

0 commit comments

Comments
 (0)