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);
+ });
+ }
+}