diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java index 6dd87bd4b8bb2423fe933e8d4e098e056890f8fc..07c961a2ea1358c9f6ffb50daf83c30b4433ea8f 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java @@ -120,23 +120,29 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService { } Optional<String> extractTextFormXmlFile(File xmlFile) { - var xPath = XPathFactory.newInstance().newXPath(); try { - var document = DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(xmlFile); - var expr = xPath.compile("/root/SmartDocument/Fields/NachrichtenText/text()"); - var text = (Text) expr.evaluate(document, XPathConstants.NODE); - - return Optional.ofNullable(text.getTextContent()); + return doExtractText(xmlFile); } catch (XPathExpressionException | SAXException | IOException | ParserConfigurationException e) { - LOG.error("XML-Parsing error on extracting Nachricht-Text: {}", e.getMessage(), e); + LOG.warn("XML-Parsing error on extracting Nachricht-Text: {}", e.getMessage(), e); } catch (ClassCastException e) { - LOG.error("Error on extraction Nachricht-Text. XPath return unexpected Type.", e); + LOG.warn("Error on extraction Nachricht-Text. XPath return unexpected Type.", e); } catch (RuntimeException e) { - LOG.error("Unexpected Error on extracting NachrichtText: {}", e.getMessage(), e); + LOG.warn("Unexpected Error on extracting NachrichtText: {}", e.getMessage(), e); } return Optional.empty(); } + Optional<String> doExtractText(File xmlFile) + throws SAXException, IOException, ParserConfigurationException, XPathExpressionException { + var xPath = XPathFactory.newInstance().newXPath(); + + var document = DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(xmlFile); + var expr = xPath.compile("/root/SmartDocument/Fields/NachrichtenText/text()"); + + return Optional.ofNullable((Text) expr.evaluate(document, XPathConstants.NODE)) + .map(Text::getTextContent); + } + Optional<File> getXMLFile(SmartDocumentsResponse response) { return getSmartDocumentsFile(response, FILE_TYPE_XML) .map(SmartDocumentFile::getDocument) diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java index 9696b3cba965a5c2a3c9cdfb50e87dc330b7e37a..41ad8368a3b350af6790e6cc20c0d3e327d792ae 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java @@ -20,6 +20,7 @@ import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.Us import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; import de.ozgcloud.common.binaryfile.TempFileUtils; import de.ozgcloud.common.test.TestUtils; +import lombok.SneakyThrows; class SmartDocumentsBescheidRemoteServiceTest { @@ -84,6 +85,16 @@ class SmartDocumentsBescheidRemoteServiceTest { assertThat(text).isEmpty(); } + @Test + @SneakyThrows + void shouldExpectMissingTextNode() { + File xmlFileWithoutText = TempFileUtils.writeTmpFile(TestUtils.loadFile("SD_answer_without_text.xml")); + + var text = service.doExtractText(xmlFileWithoutText); + + assertThat(text).isEmpty(); + } + } } } diff --git a/bescheid-manager/src/test/resources/SD_answer_without_text.xml b/bescheid-manager/src/test/resources/SD_answer_without_text.xml new file mode 100644 index 0000000000000000000000000000000000000000..62f2d02636091f1b13e7ce9c05208096415be20f --- /dev/null +++ b/bescheid-manager/src/test/resources/SD_answer_without_text.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<root> + <SmartDocument Version="2.0"> + <Fields> + + </Fields> + </SmartDocument> +</root> \ No newline at end of file diff --git a/src/main/helm/templates/_helpers.tpl b/src/main/helm/templates/_helpers.tpl index 1eab24ce9e68caf7c7c3bbf797a34d61186ddcf9..35eee9f27086f7ea5c6b9de7772cac3787f701df 100644 --- a/src/main/helm/templates/_helpers.tpl +++ b/src/main/helm/templates/_helpers.tpl @@ -83,4 +83,21 @@ app.kubernetes.io/namespace: {{ include "app.namespace" . }} {{- define "app.serviceAccountName" -}} {{ printf "%s" ( (.Values.serviceAccount).name | default "vorgang-manager-service-account" ) }} +{{- end -}} + +{{- define "app.getCustomList" -}} +{{- with (.Values.env).customList -}} +{{- if kindIs "map" . -}} +{{ include "app.dictToList" . }} +{{- else if kindIs "slice" . -}} +{{ . | toYaml }} +{{- end -}} +{{- end -}} +{{- end -}} + +{{- define "app.dictToList" -}} +{{- range $key, $value := . -}} +- name: {{ $key }} + value: {{ $value }} +{{- end -}} {{- end -}} \ No newline at end of file diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index 6465ac5f120cc4ed9494484bc5e670820f3d9ff9..c4c3a142df17fa568ecaa7bfa0f681d339ea3185 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -137,8 +137,8 @@ spec: - name: spring_ssl_bundle_pem_es-root-ca_truststore_certificate value: "/bindings/ca-certificates/es-root-ca.pem" {{- end }} - {{- with (.Values.env).customList }} -{{ toYaml . | indent 10 }} + {{- with include "app.getCustomList" . }} +{{ . | indent 10 }} {{- end }} - name: grpc_client_user-manager_address value: {{ include "app.grpc_client_user-manager_address" . }} diff --git a/src/main/helm/templates/network_policy.yaml b/src/main/helm/templates/network_policy.yaml index 88ad059ed4898240276aa3f9a0dc05775705a87e..4e92477186bd11308c58de1cc1c5f05c3d6207f0 100644 --- a/src/main/helm/templates/network_policy.yaml +++ b/src/main/helm/templates/network_policy.yaml @@ -45,10 +45,10 @@ spec: - podSelector: matchLabels: ozg-component: eingangsadapter -{{- with (.Values.networkPolicy).additionalIngressConfig }} +{{- with (.Values.networkPolicy).additionalIngressConfigLocal }} {{ toYaml . | indent 2 }} {{- end }} -{{- with (.Values.networkPolicy).additionalIngressConfigNamespace }} +{{- with (.Values.networkPolicy).additionalIngressConfigGlobal }} {{ toYaml . | indent 2 }} {{- end }} egress: @@ -101,10 +101,10 @@ spec: protocol: UDP - port: 5353 protocol: TCP -{{- with (.Values.networkPolicy).additionalEgressConfig }} +{{- with (.Values.networkPolicy).additionalEgressConfigLocal }} {{ toYaml . | indent 2 }} {{- end }} -{{- with (.Values.networkPolicy).additionalEgressConfigNamespace }} +{{- with (.Values.networkPolicy).additionalEgressConfigGlobal }} {{ toYaml . | indent 2 }} {{- end }} diff --git a/src/test/helm/deployment_env_test.yaml b/src/test/helm/deployment_env_test.yaml index f4306525a9696b7c8c57b8dfe940712c09ad516c..6ba187adc9668db175feadd3026645ff68817a1e 100644 --- a/src/test/helm/deployment_env_test.yaml +++ b/src/test/helm/deployment_env_test.yaml @@ -30,7 +30,7 @@ set: environment: dev imagePullSecret: test-image-pull-secret tests: - - it: check customList + - it: check customList as list set: env.customList: - name: my_test_environment_name @@ -41,6 +41,16 @@ tests: content: name: my_test_environment_name value: "A test value" + - it: check customList as dict + set: + env.customList: + my_test_environment_name: "A test value" + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: my_test_environment_name + value: "A test value" - it: check customList test value is not set by default asserts: diff --git a/src/test/helm/network_policy_test.yaml b/src/test/helm/network_policy_test.yaml index ac7df6574a59eae14b64a88872f8f37a182dfa89..21ac219c19905e33604d003d0c5f7ba32da173ef 100644 --- a/src/test/helm/network_policy_test.yaml +++ b/src/test/helm/network_policy_test.yaml @@ -234,12 +234,12 @@ tests: - failedTemplate: errorMessage: ozgcloud.bayernid.proxy.namespace must be set if bayernid is enabled - - it: add ingress rule by values + - it: add ingress rule local by values set: networkPolicy: ssoPublicIp: 51.89.117.53/32 dnsServerNamespace: test-namespace-dns - additionalIngressConfig: + additionalIngressConfigGlobal: - from: - podSelector: matchLabels: @@ -252,16 +252,16 @@ tests: - podSelector: matchLabels: component: client2 - - - it: should add additionalIngressConfig + - it: add ingress rule global by values set: networkPolicy: + ssoPublicIp: 51.89.117.53/32 dnsServerNamespace: test-namespace-dns - additionalIngressConfig: + additionalIngressConfigLocal: - from: - podSelector: matchLabels: - additionalIngressConfig: yes + component: client2 asserts: - contains: path: spec.ingress @@ -269,54 +269,53 @@ tests: from: - podSelector: matchLabels: - additionalIngressConfig: yes + component: client2 - - it: should add additionalEgressConfig + - it: add egress rules local by values set: networkPolicy: - dnsServerNamespace: test-namespace-dns - additionalEgressConfig: + additionalEgressConfigGlobal: + - to: + - ipBlock: + cidr: 1.2.3.4/32 - to: - podSelector: matchLabels: - additionalEgressConfig: yes + component: ozg-testservice + ports: + - port: 12345 + protocol: TCP + + dnsServerNamespace: test-dns-namespace asserts: + - contains: + path: spec.egress + content: + to: + - ipBlock: + cidr: 1.2.3.4/32 - contains: path: spec.egress content: to: - podSelector: matchLabels: - additionalEgressConfig: yes - - - - it: should add additionalIngressConfigNamespace - set: - networkPolicy: - dnsServerNamespace: test-namespace-dns - additionalIngressConfigNamespace: - - from: - - podSelector: - matchLabels: - additionalIngressConfigNamespace: yes - asserts: - - contains: - path: spec.ingress - content: - from: - - podSelector: - matchLabels: - additionalIngressConfigNamespace: yes - - - it: should add additionalEgressConfigNamespace + component: ozg-testservice + ports: + - port: 12345 + protocol: TCP + - it: add egress rules global by values set: networkPolicy: dnsServerNamespace: test-dns-namespace - additionalEgressConfigNamespace: + additionalEgressConfigLocal: + - to: + - ipBlock: + cidr: 1.2.3.4/32 - to: - podSelector: matchLabels: - additionalEgressConfigNamespace: yes + additionalEgressConfigLocal: yes asserts: - contains: path: spec.egress @@ -324,7 +323,7 @@ tests: to: - podSelector: matchLabels: - additionalEgressConfigNamespace: yes + additionalEgressConfigLocal: yes - it: test network policy disabled set: diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index a1cf7433e59147d9d2a9ad0bd427a77f7ffd5142..a7eb857b2513f868d27f73a78a70284ab7b83e33 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -80,7 +80,7 @@ <dependency> <groupId>de.ozgcloud.nachrichten</groupId> - <artifactId>nachrichten-manager-postfach-interface</artifactId> + <artifactId>nachrichten-manager-server</artifactId> <version>${nachrichten-manager.version}</version> </dependency> <dependency> @@ -248,7 +248,14 @@ <!-- Test --> <dependency> <groupId>de.ozgcloud.nachrichten</groupId> - <artifactId>nachrichten-manager-postfach-interface</artifactId> + <artifactId>nachrichten-manager-server</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>de.ozgcloud.nachrichten</groupId> + <artifactId>nachrichten-manager-interface</artifactId> <version>${project.version}</version> <type>test-jar</type> <scope>test</scope> diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/PersistPostfachNachrichtByCommandService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/PersistPostfachNachrichtByCommandService.java index 63aee3c41f4aaa594572b35da58cd5270575336e..82bebdd9762ee1a3a698a4a49b3aae60ef7d4e7e 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/PersistPostfachNachrichtByCommandService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/PersistPostfachNachrichtByCommandService.java @@ -50,8 +50,6 @@ import de.ozgcloud.nachrichten.postfach.AttachmentFile; import de.ozgcloud.nachrichten.postfach.PersistPostfachNachrichtService; import de.ozgcloud.nachrichten.postfach.PostfachAddress; import de.ozgcloud.nachrichten.postfach.PostfachNachricht; -import de.ozgcloud.nachrichten.postfach.PostfachNachricht.Direction; -import de.ozgcloud.nachrichten.postfach.PostfachNachricht.ReplyOption; import de.ozgcloud.nachrichten.postfach.StringBasedIdentifier; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem; import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemMapper; @@ -67,7 +65,7 @@ import lombok.extern.log4j.Log4j2; * @deprecated Temporally replacement for using GRPC Api by MailService */ @Deprecated -@Service +@Service("persistPostfachNachrichtByCommandService") @Log4j2 class PersistPostfachNachrichtByCommandService implements PersistPostfachNachrichtService { @@ -258,21 +256,8 @@ class PersistPostfachNachrichtByCommandService implements PersistPostfachNachric } @Override - public Stream<PostfachNachricht> findRueckfragen(String postfachId) { - // Dummy Implementierung - // TODO OZG-5132 do real implementation - return Stream.of(PostfachNachricht.builder() - .attachments(Collections.emptyList()) - .createdAt(ZonedDateTime.now()) - .sentAt(ZonedDateTime.now()) - .vorgangId("VORGANG_DUMMY_URI") - .createdBy("Klaus") - .direction(Direction.OUT) - .replyOption(ReplyOption.POSSIBLE) - .mailBody("Lorem ipsum dolres est") - .id(UUID.randomUUID().toString()) - .subject("Test") - .build()); + public Stream<PostfachNachricht> findRueckfragen(String servicekontoType, String postfachId) { + throw new UnsupportedOperationException("Not implemented."); } @Override diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangHeaderService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangHeaderService.java index 16ce17aab587901272f51788567cb3f365b9b909..4642e7c3fd2b68dec5f473c237ababc288747913 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangHeaderService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangHeaderService.java @@ -48,7 +48,7 @@ class VorgangHeaderService { private SearchService searchService; public Page<VorgangHeader> findAll(FindVorgangRequest request) { - if (nonNull(searchService) && nonNull(request.getSearchBy())) { + if (nonNull(searchService) && nonNull(request.getSearchBy())) { return removeUnpermitted(searchService.find(request)); } return removeUnpermitted(repository.findAll(request)); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/FindVorgangIteratorITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/FindVorgangIteratorITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..6364448d2c6449bd7726118475033fc9915448bd --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/FindVorgangIteratorITCase.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.nachrichten.postfach; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +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.test.annotation.DirtiesContext; + +import de.ozgcloud.common.test.DataITCase; +import de.ozgcloud.vorgang.VorgangManagerServerApplication; +import de.ozgcloud.vorgang.callcontext.CallContextUser; +import de.ozgcloud.vorgang.callcontext.CurrentUserService; +import de.ozgcloud.vorgang.servicekonto.PostfachAddressTestFactory; +import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; +import de.ozgcloud.vorgang.vorgang.GrpcVorgangHeader; +import de.ozgcloud.vorgang.vorgang.Vorgang; +import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; +import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; +import net.devh.boot.grpc.client.inject.GrpcClient; + +@SpringBootTest(classes = { VorgangManagerServerApplication.class }, properties = { + "grpc.server.inProcessName=test", + "grpc.client.inProcess.address=in-process:test" +}) +@DirtiesContext +@DataITCase +class FindVorgangIteratorITCase { + + @GrpcClient("inProcess") + private VorgangServiceBlockingStub vorgangServiceStub; + + @Autowired + private MongoOperations mongoOperations; + + @MockBean + private CurrentUserService currentUserService; + @Mock + private CallContextUser callContextUser; + + private FindVorgangIterator findVorgangIterator; + + @BeforeEach + void init() { + mongoOperations.dropCollection(Vorgang.COLLECTION_NAME); + when(currentUserService.getUser()).thenReturn(callContextUser); + findVorgangIterator = new FindVorgangIterator(vorgangServiceStub, ServiceKontoTestFactory.TYPE, + PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); + } + + @Test + void shouldFindVorgangs() { + var vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()); + + var hasNext = findVorgangIterator.hasNext(); + assertThat(hasNext).isTrue(); + + var result = findVorgangIterator.next(); + assertThat(result.getId()).isEqualTo(vorgang.getId()); + } + + @Test + void shouldLoadAllVorgangs() { + IntStream.range(0, FindVorgangIterator.LIMIT + 1).forEach(i -> mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build())); + + var result = loadAllVorgangs(); + + assertThat(result).hasSize(FindVorgangIterator.LIMIT + 1); + } + + private List<GrpcVorgangHeader> loadAllVorgangs() { + var result = new ArrayList<GrpcVorgangHeader>(); + while (findVorgangIterator.hasNext()) { + result.add(findVorgangIterator.next()); + } + return result; + } + +} \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..81592955e5001a335b2984ac65cab48c325b3507 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplITCase.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.nachrichten.postfach; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.util.ReflectionTestUtils; + +import de.ozgcloud.common.test.ITCase; +import de.ozgcloud.vorgang.VorgangManagerServerApplication; +import de.ozgcloud.vorgang.attached_item.GrpcVorgangAttachedItemTestFactory; +import de.ozgcloud.vorgang.common.GrpcObject; +import de.ozgcloud.vorgang.common.GrpcProperty; +import de.ozgcloud.vorgang.servicekonto.PostfachAddressTestFactory; +import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; +import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangResponse; +import de.ozgcloud.vorgang.vorgang.GrpcVorgangHeader; +import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; +import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse; +import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub; + +@SpringBootTest(classes = { VorgangManagerServerApplication.class }) +@ITCase +class PersistPostfachNachrichtServiceImplITCase { + + private static final String MESSAGE_ID = "message-id"; + @Autowired + private PersistPostfachNachrichtServiceImpl service; + @Autowired + private VorgangRemoteService vorgangRemoteService; + @Autowired + private AttachedItemRemoteService attachedItemRemoteService; + + private AtomicInteger counter = new AtomicInteger(1); + @Mock + private VorgangServiceBlockingStub vorgangServiceStub; + @Mock + private VorgangAttachedItemServiceBlockingStub vorgangAttachedItemServiceStub; + + @BeforeEach + void init() { + when(vorgangServiceStub.withInterceptors(any())).thenReturn(vorgangServiceStub); + ReflectionTestUtils.setField(vorgangRemoteService, "vorgangServiceStub", vorgangServiceStub); + + when(vorgangAttachedItemServiceStub.withInterceptors(any())).thenReturn(vorgangAttachedItemServiceStub); + ReflectionTestUtils.setField(attachedItemRemoteService, "vorgangAttachedItemServiceStub", vorgangAttachedItemServiceStub); + + mockFindVorgang(); + mockFindAttachedItems(); + } + + @Test + void shouldFindRuckfragen() { + var rueckfragen = service.findRueckfragen(ServiceKontoTestFactory.TYPE, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE); + + assertThat(rueckfragen).hasSize(1).first().extracting(PostfachNachricht::getId).isEqualTo(MESSAGE_ID); + } + + private void mockFindVorgang() { + when(vorgangServiceStub.findVorgang(any())).thenAnswer(invocation -> { + if (counter.getAndDecrement() == 0) { + return GrpcFindVorgangResponse.newBuilder().build(); + } + return GrpcFindVorgangResponse.newBuilder().setTotal(1).addVorgang(GrpcVorgangHeader.newBuilder().build()).build(); + }); + } + + private void mockFindAttachedItems() { + var attachedItemResponse = GrpcFindVorgangAttachedItemResponse.newBuilder() + .addVorgangAttachedItems(GrpcVorgangAttachedItemTestFactory.create()) + .addVorgangAttachedItems(GrpcVorgangAttachedItemTestFactory.createBuilder().setItem(buildGrpcObject())).build(); + when(vorgangAttachedItemServiceStub.find(any())).thenReturn(attachedItemResponse); + } + + private GrpcObject buildGrpcObject() { + return GrpcObject.newBuilder() + .addProperty(GrpcProperty.newBuilder() + .setName(PostfachNachricht.FIELD_REPLY_OPTION).addValue(PostfachNachricht.ReplyOption.POSSIBLE.name()).build()) + .addProperty(GrpcProperty.newBuilder() + .setName(PostfachNachricht.FIELD_CREATED_AT).addValue(PostfachNachrichtTestFactory.CREATED_AT_STR)) + .addProperty(GrpcProperty.newBuilder() + .setName(PostfachNachricht.FIELD_DIRECTION).addValue(PostfachNachrichtTestFactory.DIRECTION.name())) + .addProperty(GrpcProperty.newBuilder() + .setName(PostfachNachricht.FIELD_ID).addValue(MESSAGE_ID).build()) + .build(); + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java index 8db9ce23a49f33ee2b2a058eb33906fd56882813..3c854a2b30507856ca155319bf708256f53f681a 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachMailITCase.java @@ -231,7 +231,8 @@ class PostfachMailITCase { } private GrpcSendPostfachMailRequest buildSendPostfachMailRequestWithoutAttachments() { - var grpcPostfachMail = GrpcPostfachMailTestFactory.createBuilder().clearId().clearAttachment().clearCreatedAt().clearDirection().build(); + var grpcPostfachMail = GrpcPostfachMailTestFactory.createBuilder().clearId().clearAttachment().clearCreatedAt().clearDirection() + .setVorgangId(MessageTestFactory.VORGANG_ID).build(); return GrpcSendPostfachMailRequestTestFactory.createBuilder().setMail(grpcPostfachMail).build(); } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/GrpcVorgangAttachedItemTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/GrpcVorgangAttachedItemTestFactory.java index 764b878dd36d4c900547277227d05eb8d49b1329..712d28ebb0f6a91f18f27fc6d7514323509ced74 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/GrpcVorgangAttachedItemTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/attached_item/GrpcVorgangAttachedItemTestFactory.java @@ -33,11 +33,11 @@ public class GrpcVorgangAttachedItemTestFactory { public static final GrpcObject OBJECT = GrpcObject.newBuilder() .addProperty(GrpcProperty.newBuilder().setName(PROPERTY_NAME).addValue(PROPERTY_NAME_VALUE).build()).build(); - static GrpcVorgangAttachedItem create() { + public static GrpcVorgangAttachedItem create() { return createBuilder().build(); } - static GrpcVorgangAttachedItem.Builder createBuilder() { + public static GrpcVorgangAttachedItem.Builder createBuilder() { return GrpcVorgangAttachedItem.newBuilder() .setId(VorgangAttachedItemTestFactory.ID) .setClient(VorgangAttachedItemTestFactory.CLIENT) diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceITCase.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceITCase.java index e067a39f8f711cf6ada2b9801e93fde04cf1ae87..cc936fbc36384816f4eddfc9cc82c9ef66a8d7f9 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceITCase.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/command/CommandServiceITCase.java @@ -99,7 +99,7 @@ class CommandServiceITCase { .build(); Command persistedCommand = commandService.createCommand(request); - verify(commandService, timeout(500)).setCommandFinished(eq(persistedCommand.getId()), any()); + verify(commandService, timeout(60000)).setCommandFinished(eq(persistedCommand.getId()), any()); Optional<Command> commandOpt = commandService.findCommand(persistedCommand.getId()); assertThat(commandOpt).isPresent();