diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java index dc55642a887b0d8a453a10ead82e0fb7de5970c8..c65e33018262555e9b38727cf434e221ec3ac4eb 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/servicekonto/ServiceKonto.java @@ -24,7 +24,7 @@ public class ServiceKonto { @Singular private List<PostfachAddress> postfachAddresses; - static class ServiceKontoBuilder { + public static class ServiceKontoBuilder { public ServiceKontoBuilder trustLevel(String trustLevel) { validateTrustLevel(trustLevel); 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 new file mode 100644 index 0000000000000000000000000000000000000000..90353d16774020e054463f8194c3817f9413b8d4 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumITCase.java @@ -0,0 +1,174 @@ +package de.ozgcloud.nachrichten.antragraum; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.apache.xml.security.stax.ext.XMLSecurityConstants.DIRECTION; +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.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.annotation.DirtiesContext; + +import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.common.test.TestUtils; +import de.ozgcloud.nachrichten.postfach.PostfachAddress; +import de.ozgcloud.nachrichten.postfach.PostfachNachricht; +import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory; +import de.ozgcloud.nachrichten.postfach.osi.OsiPostfachProperties; +import de.ozgcloud.nachrichten.postfach.osi.ReplyOption; +import de.ozgcloud.vorgang.VorgangManagerServerApplication; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; +import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory; +import de.ozgcloud.vorgang.servicekonto.PostfachAddressTestFactory; +import de.ozgcloud.vorgang.servicekonto.ServiceKonto; +import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; +import de.ozgcloud.vorgang.vorgang.Vorgang; +import de.ozgcloud.vorgang.vorgang.VorgangHeadTestFactory; +import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; +import io.grpc.stub.StreamObserver; + +@SpringBootTest(classes = { VorgangManagerServerApplication.class, OsiPostfachProperties.class }, properties = { + "grpc.server.in-process-name=postfachitcase", + "ozgcloud.antragraum.url=https://localhost/dummy/antragraum", + "ozgcloud.antragraum.entityId=dummy-id", + "ozgcloud.antragraum.metadataUri=http://localhost/dummy/antragraum/uri", + "ozgcloud.antragraum.decryptionPrivateKey=dummyPrivateKey", + "ozgcloud.antragraum.decryptionCertificate=dummyCertificate", + "grpc.client.ozgcloud-command-manager.address=in-process:postfachitcase", + "grpc.client.command-manager.address=in-process:postfachitcase", + "grpc.client.info-manager.address=in-process:postfachitcase", + "grpc.client.vorgang-manager.address=in-process:postfachitcase", +}) +@WithMockUser +@DataITCase +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) +class AntragraumITCase { + + @Autowired + private AntragraumGrpcService grpcService; + @Autowired + private MongoOperations mongoOperations; + + @MockBean + private Saml2Decrypter decrypter; + @MockBean + private Saml2Verifier verifier; + + @BeforeEach + void prepareDatabase() { + mongoOperations.dropCollection(Vorgang.COLLECTION_NAME); + mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME); + + var vorgang = mongoOperations.save(createVorgang(), Vorgang.COLLECTION_NAME); + mongoOperations.save(createPostfachNachrichtVorgangAttachedItem(vorgang.getId()), VorgangAttachedItem.COLLECTION_NAME); + } + + private Vorgang createVorgang() { + return VorgangTestFactory.createBuilder() + .id(null) + .header(VorgangHeadTestFactory.createBuilder().serviceKonto(createBayernIdTrustLevel3ServiceKonto()).build()) + .build(); + } + + private ServiceKonto createBayernIdTrustLevel3ServiceKonto() { + return ServiceKontoTestFactory.createBuilder().type("BayernID").trustLevel(TrustLevel.LEVEL_3.getValue()).build(); + } + + private VorgangAttachedItem createPostfachNachrichtVorgangAttachedItem(String vorgangId) { + return VorgangAttachedItemTestFactory.createBuilder() + .id(null) + .version(0) + .vorgangId(vorgangId) + .itemName("PostfachMail") + .client("OzgCloud_NachrichtenManager") + .item(createBayernIdPostfachNachrichtItem(vorgangId)) + .build(); + } + + private Map<String, Object> createBayernIdPostfachNachrichtItem(String vorgangId) { + var nachrichtItem = PostfachNachrichtTestFactory.asMap(); + nachrichtItem.put(PostfachNachricht.FIELD_DIRECTION, DIRECTION.OUT.name()); + nachrichtItem.put(PostfachNachricht.FIELD_REPLY_OPTION, ReplyOption.POSSIBLE); + nachrichtItem.put(PostfachNachricht.FIELD_VORGANG_ID, vorgangId); + nachrichtItem.put(PostfachNachricht.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); + nachrichtItem.put(PostfachNachricht.POSTFACH_ADDRESS_FIELD, Map.of( + PostfachAddress.TYPE_FIELD, 0, + PostfachAddress.VERSION_FIELD, 1, + PostfachAddress.IDENTIFIER_FIELD, + Map.of(PostfachNachricht.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE), + PostfachAddress.SERVICEKONTO_TYPE_FIELD, "BayernID")); + return nachrichtItem; + } + + @DisplayName("Find rueckfragen") + @Nested + class TestFindRueckfragen { + + @Mock + private StreamObserver<GrpcFindRueckfragenResponse> responseObserver; + + @Captor + private ArgumentCaptor<GrpcFindRueckfragenResponse> captor; + + @BeforeEach + void mock() { + when(decrypter.decryptPostfachId(any())).thenReturn(PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); + when(verifier.verify(any())).thenReturn(Collections.emptyList()); + } + + @Test + void shouldReturnOnMatchingTokenTrustLevel() { + when(decrypter.decryptTrustLevel(any())).thenReturn(TrustLevel.LEVEL_3.getValue()); + + var rueckfragen = findRueckfragen(); + + assertThat(rueckfragen).isNotEmpty().hasSize(1); + assertThat(rueckfragen.get(0).getTrustLevel()).isEqualTo(TrustLevel.LEVEL_3.getValue()); + assertThat(rueckfragen.get(0).getAccessible()).isTrue(); + } + + @Test + void shouldReturnOnLowerTokenTrustLevel() { + when(decrypter.decryptTrustLevel(any())).thenReturn(TrustLevel.LEVEL_1.getValue()); + + var rueckfragen = findRueckfragen(); + + assertThat(rueckfragen).isNotEmpty().hasSize(1); + assertThat(rueckfragen.get(0).getTrustLevel()).isEqualTo(TrustLevel.LEVEL_3.getValue()); + assertThat(rueckfragen.get(0).getAccessible()).isFalse(); + } + + @Test + void shouldReturnOnHigherTokenTrustLevel() { + when(decrypter.decryptTrustLevel(any())).thenReturn(TrustLevel.LEVEL_4.getValue()); + + var rueckfragen = findRueckfragen(); + + assertThat(rueckfragen).isNotEmpty().hasSize(1); + assertThat(rueckfragen.get(0).getTrustLevel()).isEqualTo(TrustLevel.LEVEL_3.getValue()); + assertThat(rueckfragen.get(0).getAccessible()).isTrue(); + } + + private List<GrpcRueckfrageHead> findRueckfragen() { + grpcService.findRueckfragen( + GrpcFindRueckfrageRequestTestFactory.createBuilder().setSamlToken(TestUtils.loadTextFile("SamlResponse.xml")).build(), + responseObserver); + verify(responseObserver).onNext(captor.capture()); + return captor.getValue().getRueckfrageHeadList(); + } + } +} \ No newline at end of file