Skip to content
Snippets Groups Projects
Commit 5b80359e authored by OZGCloud's avatar OZGCloud
Browse files

Merge branch 'refs/heads/master' into OZG-4979-Legacy-Orders-entfernen

parents d4870cb2 0cceca4a
No related branches found
No related tags found
No related merge requests found
Showing
with 278 additions and 32 deletions
......@@ -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)
......
......@@ -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();
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<root>
<SmartDocument Version="2.0">
<Fields>
</Fields>
</SmartDocument>
</root>
\ No newline at end of file
......@@ -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>
......
......@@ -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
......
/*
* 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
/*
* 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();
}
}
......@@ -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();
}
......
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment