diff --git a/pom.xml b/pom.xml index d327bfe..99e169a 100644 --- a/pom.xml +++ b/pom.xml @@ -125,6 +125,12 @@ postgresql test + + org.instancio + instancio-junit + 5.3.0 + test + diff --git a/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java b/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java index 9c186fb..b732726 100644 --- a/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java +++ b/src/main/java/ch/dlmw/swisssignchallenge/controllers/SigningRequestDocumentController.java @@ -34,10 +34,8 @@ public class SigningRequestDocumentController implements SigningRequestDocumentA signingRequestDocumentService.updateSigningRequestDocument(patchedDocument); return ResponseEntity.noContent().build(); - } catch (JsonPatchException e) { + } catch (JsonPatchException | IOException e) { throw new IllegalArgumentException("Failed to apply patch", e); - } catch (IOException e) { - throw new RuntimeException("Failed to apply patch", e); } } diff --git a/src/test/java/ch/dlmw/swisssignchallenge/SigningRequestDocumentControllerTests.java b/src/test/java/ch/dlmw/swisssignchallenge/SigningRequestDocumentControllerTests.java new file mode 100644 index 0000000..bb0b705 --- /dev/null +++ b/src/test/java/ch/dlmw/swisssignchallenge/SigningRequestDocumentControllerTests.java @@ -0,0 +1,115 @@ +package ch.dlmw.swisssignchallenge; + +import ch.dlmw.swisssignchallenge.controllers.SigningRequestDocumentController; +import ch.dlmw.swisssignchallenge.entities.SigningRequestDocument; +import ch.dlmw.swisssignchallenge.services.SigningRequestDocumentService; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.instancio.Instancio; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.openapitools.model.PatchOperation; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; + +import static org.instancio.Select.field; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class SigningRequestDocumentControllerTests { + @Mock + private SigningRequestDocumentService signingRequestDocumentService; + + @InjectMocks + private SigningRequestDocumentController signingRequestDocumentController; + + @BeforeEach + public void setUp() { + var objectMapper = new ObjectMapper(); + signingRequestDocumentController = new SigningRequestDocumentController( + signingRequestDocumentService, + null, + objectMapper + ); + } + + @Test + public void givenCorrectRequest_whenPatchSigningRequestDocument_thenPatchDocument() { + var id = UUID.randomUUID(); + var patchOperations = List.of( + new PatchOperation("replace", "/confirmed", "true") + ); + + var returnedSigningRequestDocument = Instancio.of(SigningRequestDocument.class) + .set(field(SigningRequestDocument::isConfirmed), false) + .create(); + when(signingRequestDocumentService.getSigningRequestDocument(id.toString())) + .thenReturn(returnedSigningRequestDocument); + + signingRequestDocumentController.patchSigningRequestDocument(id.toString(), patchOperations); + + var documentCaptor = ArgumentCaptor.forClass(SigningRequestDocument.class); + verify(signingRequestDocumentService).updateSigningRequestDocument(documentCaptor.capture()); + + assertTrue(documentCaptor.getValue().isConfirmed()); + } + + @Test + public void givenNonExistingSigningRequestDocument_whenPatchSigningRequestDocument_thenThrowNoSuchElementException() { + var id = UUID.randomUUID(); + var patchOperations = List.of( + new PatchOperation("replace", "/confirmed", "true") + ); + + when(signingRequestDocumentService.getSigningRequestDocument(id.toString())) + .thenThrow(NoSuchElementException.class); + + assertThrows(NoSuchElementException.class, () -> { + signingRequestDocumentController.patchSigningRequestDocument(id.toString(), patchOperations); + }); + } + + @Test + public void givenInvalidPatchOperationPath_whenPatchSigningRequestDocument_thenThrowIllegalArgumentException() { + var id = UUID.randomUUID(); + var patchOperations = List.of( + new PatchOperation("replace", "/invalid", "true") + ); + + var returnedSigningRequestDocument = Instancio.of(SigningRequestDocument.class) + .set(field(SigningRequestDocument::isConfirmed), false) + .create(); + when(signingRequestDocumentService.getSigningRequestDocument(id.toString())) + .thenReturn(returnedSigningRequestDocument); + + assertThrows(IllegalArgumentException.class, () -> { + signingRequestDocumentController.patchSigningRequestDocument(id.toString(), patchOperations); + }); + } + + @Test + public void givenInvalidPatchOperationValue_whenPatchSigningRequestDocument_thenThrowIllegalArgumentException() { + var id = UUID.randomUUID(); + var patchOperations = List.of( + new PatchOperation("replace", "/confirmed", "notabool") + ); + + var returnedSigningRequestDocument = Instancio.of(SigningRequestDocument.class) + .set(field(SigningRequestDocument::isConfirmed), false) + .create(); + when(signingRequestDocumentService.getSigningRequestDocument(id.toString())) + .thenReturn(returnedSigningRequestDocument); + + assertThrows(IllegalArgumentException.class, () -> { + signingRequestDocumentController.patchSigningRequestDocument(id.toString(), patchOperations); + }); + } +}