diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index 62d56c8cfa1e73355eb051085c6486c3c6341cd1..709bce2c579d403433d03e3f9205f08e199488fe 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -55,7 +55,7 @@ <user-manager-interface.version>2.9.0</user-manager-interface.version> <bescheid-manager.version>1.19.1</bescheid-manager.version> <processor-manager.version>0.4.1</processor-manager.version> - <nachrichten-manager.version>2.12.1</nachrichten-manager.version> + <nachrichten-manager.version>2.13.0-SNAPSHOT</nachrichten-manager.version> <ozgcloud-starter.version>0.12.0</ozgcloud-starter.version> <notification-manager.version>2.11.1</notification-manager.version> <collaboration-manager.version>0.3.0</collaboration-manager.version> diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java index 11318a0cf33d16cc95296cef55b61c1f08a878b8..356ec36f45ceee2bd5dcbd91180b9ea20b54d23a 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java @@ -102,6 +102,16 @@ public class ExceptionHandler { return Status.INTERNAL.withDescription(message).withCause(e.getCause()); } + @GrpcExceptionHandler + public StatusException handleNotFoundException(de.ozgcloud.apilib.common.errorhandling.NotFoundException e) { + var exceptionId = createExceptionId(); + var messageWithExceptionId = ExceptionUtil.formatMessageWithExceptionId(e.getMessage(), exceptionId); + LOG.error("Grpc internal server error: {}", messageWithExceptionId, e); + + var status = Status.NOT_FOUND.withDescription(messageWithExceptionId).withCause(e.getCause()); + return createStatusException(status, buildMetadata(exceptionId)); + } + private Metadata buildMetadata(String exceptionId) { var metadata = new Metadata(); addExceptionId(metadata, exceptionId); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java index 1488e8f8dd4f1baef4b2831081ccd6a078a6ef36..87606c0d30ea0ce212e59a73f4caf7a7734cf155 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java @@ -24,6 +24,7 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.annotation.DirtiesContext; +import de.ozgcloud.apilib.common.errorhandling.NotFoundException; import de.ozgcloud.common.test.DataITCase; import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.nachrichten.postfach.PostfachAddress; @@ -186,6 +187,58 @@ class AntragraumITCase { } } + @DisplayName("Ger rueckfrage") + @Nested + class TestGetRueckfrage { + + @Mock + private StreamObserver<GrpcGetRueckfrageResponse> responseObserver; + + @Captor + private ArgumentCaptor<GrpcGetRueckfrageResponse> captor; + + private Vorgang savedVorgang; + private VorgangAttachedItem vorgangAttachedItem; + + @BeforeEach + void prepareDatabase() { + savedVorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build(), Vorgang.COLLECTION_NAME); + vorgangAttachedItem = mongoOperations.save(createPostfachNachrichtVorgangAttachedItem(savedVorgang.getId()), + VorgangAttachedItem.COLLECTION_NAME); + + when(verifier.verify(any())).thenReturn(Collections.emptyList()); + when(decrypter.decryptTrustLevel(any())).thenReturn("STORK-QAA-Level-1"); + } + + @Test + void shouldReturnOnMatchingPostfachId() { + when(decrypter.decryptPostfachId(any())).thenReturn(PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); + var request = GrpcGetRueckfrageRequestTestFactory.createBuilder() + .setId(vorgangAttachedItem.getId()) + .setSamlToken(TestUtils.loadTextFile("SamlResponse.xml")) + .build(); + + grpcService.getRueckfrage(request, responseObserver); + + verify(responseObserver, timeout(30000)).onNext(captor.capture()); + assertThat(captor.getValue().getRueckfrage()).isNotNull(); + } + + @Test + void shouldThrowExceptionOnMismatchingPostfachId() { + when(decrypter.decryptPostfachId(any())).thenReturn("not-match-postfach-id"); + + var request = GrpcGetRueckfrageRequestTestFactory.createBuilder() + .setId(vorgangAttachedItem.getId()) + .setSamlToken(TestUtils.loadTextFile("SamlResponse.xml")) + .build(); + assertThatThrownBy(() -> grpcService.getRueckfrage(request, responseObserver)) + .isInstanceOf(NotFoundException.class) + .hasMessageContaining("PostfachNachricht") + .hasMessageContaining(vorgangAttachedItem.getId()); + } + } + private Vorgang createVorgang(TrustLevel trustLevel) { return VorgangTestFactory.createBuilder() .id(null) diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java index 5988d1bde47af660ad42c7ee6d613ad9aff7c3f5..5387ed1efef766385e8a769883af4c31c8c30189 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java @@ -29,12 +29,14 @@ import static org.mockito.Mockito.*; import java.util.Map; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Spy; import org.springframework.security.access.AccessDeniedException; +import de.ozgcloud.apilib.common.datatypes.GenericId; import de.ozgcloud.common.errorhandling.FunctionalErrorCode; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.vorgang.vorgang.Vorgang; @@ -308,4 +310,55 @@ class ExceptionHandlerTest { return handler.handleSearchServiceUnavailableException(exception); } } + + @DisplayName("Handle not found exception (from api lib)") + @Nested + class TestHandleNotFoundExceptionFromApiLib { + + private final String exceptionId = "42"; + private final GenericId id = GenericId.from(VorgangTestFactory.ID); + private final String entityName = Vorgang.class.toString(); + + @BeforeEach + void mockExceptionId() { + doReturn(exceptionId).when(handler).createExceptionId(); + } + + @Test + void shouldHaveStatusCode() { + var status = handleException().getStatus(); + + assertThat(status.getCode()).isEqualTo(Code.NOT_FOUND); + } + + @Test + void shouldHaveMessage() { + var statusException = handleException(); + + assertThat(statusException.getMessage()).contains(id.toString()); + assertThat(statusException.getMessage()).contains(entityName); + assertThat(statusException.getMessage()).contains(exceptionId); + } + + @Test + void shouldHaveStatusDescription() { + var status = handleException().getStatus(); + + assertThat(status.getDescription()).contains(id.toString()); + assertThat(status.getDescription()).contains(entityName); + assertThat(status.getDescription()).contains(exceptionId); + } + + @Test + void shouldHaveExceptionId() { + var metaData = handleException().getTrailers(); + + assertThat(metaData.get(createExceptionIdKey())).isEqualTo(exceptionId); + } + + private StatusException handleException() { + return handler.handleNotFoundException( + new de.ozgcloud.apilib.common.errorhandling.NotFoundException(id, entityName)); + } + } } \ No newline at end of file