diff --git a/src/main/java/de/ozgcloud/xta/test/app/data/XtaMessageRepository.java b/src/main/java/de/ozgcloud/xta/test/app/data/XtaMessageRepository.java index d89a8e6c355aae1046c03fc65cc7eada627d91ee..999b6e01d1e5293c5d20e988ea43cb27fdb4508d 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/data/XtaMessageRepository.java +++ b/src/main/java/de/ozgcloud/xta/test/app/data/XtaMessageRepository.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Stream; import org.springframework.stereotype.Component; @@ -49,13 +50,18 @@ public class XtaMessageRepository { } } - public List<XtaMessage> findAllLimitedTo(int maxListItems) { - return messages.values().stream() + public List<XtaMessage> findByReaderIdentifierValueLimitedTo(String readerIdentifierValue, int maxListItems) { + return findByReaderIdentifierValue(readerIdentifierValue) .limit(maxListItems) .toList(); } - public BigInteger count() { - return BigInteger.valueOf(messages.size()); + public BigInteger countByReaderIdentifierValue(String readerIdentifierValue) { + return BigInteger.valueOf(findByReaderIdentifierValue(readerIdentifierValue).count()); + } + + Stream<XtaMessage> findByReaderIdentifierValue(String readerIdentifierValue) { + return messages.values().stream() + .filter(m -> m.metaData().readerIdentifier().value().equals(readerIdentifierValue)); } } diff --git a/src/main/java/de/ozgcloud/xta/test/app/mapper/RequestMapper.java b/src/main/java/de/ozgcloud/xta/test/app/mapper/RequestMapper.java index 2b26ca69ec5e190a75659d67ca9e8079a7b6ed11..54598c3d9c61028e1dae762434fb92261757121b 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/mapper/RequestMapper.java +++ b/src/main/java/de/ozgcloud/xta/test/app/mapper/RequestMapper.java @@ -1,17 +1,25 @@ package de.ozgcloud.xta.test.app.mapper; import de.ozgcloud.xta.test.app.exception.TechnicalException; +import de.ozgcloud.xta.test.app.model.Identifier; import de.ozgcloud.xta.test.app.model.XtaFile; import de.ozgcloud.xta.test.app.model.XtaMessage; import de.ozgcloud.xta.test.app.model.XtaMessageMetaData; +import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListingRequest; import genv3.de.xoev.transport.xta.x211.ContentType; import genv3.de.xoev.transport.xta.x211.GenericContentContainer; import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxFetchRequest; import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData; +import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType; +import genv3.eu.osci.ws.x2014.x10.transport.PartyType; import genv3.eu.osci.ws.x2014.x10.transport.QualifierType; + import jakarta.activation.DataHandler; + +import org.mapstruct.Condition; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.Named; import org.mapstruct.ReportingPolicy; import java.io.File; @@ -29,7 +37,10 @@ public interface RequestMapper { XtaMessage mapXtaMessageFromGenericContentContainer(GenericContentContainer genericContainer, MessageMetaData messageMetaData); @Mapping(target = "service", source = "qualifier.service") - @Mapping(target = "businessScenario", source = "qualifier.businessScenario") + @Mapping(target = "businessScenarioCode", source = "qualifier.businessScenario", qualifiedByName = "mapBusinessScenarioCode") + @Mapping(target = "businessScenarioName", source = "qualifier.businessScenario.defined.name") + @Mapping(target = "businessScenarioListUri", source = "qualifier.businessScenario.defined.listURI") + @Mapping(target = "businessScenarioListVersionId", source = "qualifier.businessScenario.defined.listVersionID") @Mapping(target = "messageTypeCode", source = "qualifier.messageType.code") @Mapping(target = "messageTypePayloadSchema", source = "qualifier.messageType.payloadSchema") @Mapping(target = "messageId", source = "msgIdentification.messageID.value") @@ -38,21 +49,9 @@ public interface RequestMapper { @Mapping(target = "messageSize", source = "msgSize") XtaMessageMetaData mapXtaMessageMetaData(MessageMetaData messageMetaData); - default XtaMessageMetaData.BusinessScenario mapBusinessScenarioFromQualifierTypeBusinessScenario(QualifierType.BusinessScenario businessScenario){ - if (businessScenario.getDefined() != null && businessScenario.getDefined().getCode() != null) { - var definedKeyCode = businessScenario.getDefined(); - return new XtaMessageMetaData.BusinessScenario( - definedKeyCode.getCode(), - definedKeyCode.getName(), - definedKeyCode.getListURI(), - definedKeyCode.getListVersionID(), - true); - } - else { - String businessScenarioCode = businessScenario.getUndefined() == null ? "" : businessScenario.getUndefined(); - return new XtaMessageMetaData.BusinessScenario( - businessScenarioCode, null, null, null, false); - } + @Named("mapBusinessScenarioCode") + default String mapBusinessScenarioCode(QualifierType.BusinessScenario businessScenario) { + return businessScenario.getDefined() != null ? businessScenario.getDefined().getCode() : businessScenario.getUndefined(); } @Mapping(target = "file", source = "value") @@ -60,14 +59,13 @@ public interface RequestMapper { @Mapping(target = "language", source = "lang") XtaFile mapXtaFileFromContentType(ContentType contentType); - default File persistToTempFile(DataHandler dataHandler){ + default File persistToTempFile(DataHandler dataHandler) { try { var file = File.createTempFile("xta", ".data"); file.deleteOnExit(); - var out = new FileOutputStream(file); - dataHandler.writeTo(out); - out.flush(); - out.close(); + try (var out = new FileOutputStream(file)) { + dataHandler.writeTo(out); + } return file; } catch (IOException e) { throw new TechnicalException("Error writing Attachment to temp file", e); @@ -77,4 +75,21 @@ public interface RequestMapper { default String mapMessageIdFromMsgBoxFetchRequest(MsgBoxFetchRequest fetchRequest) { return fetchRequest.getMsgSelector().getMessageID().getFirst().getValue(); } + + default int mapMaxListItems(MsgBoxStatusListRequestType fetchRequest) { + int maxListItems; + try { + maxListItems = fetchRequest.getMaxListItems().intValueExact(); + } catch (ArithmeticException e) { + maxListItems = Integer.MAX_VALUE; + } + if (maxListItems <= 0) { + maxListItems = Integer.MAX_VALUE; + } + return maxListItems; + } + + @Mapping(target = "clientIdentifierValue", source = "clientIdentifier.identifier.value") + @Mapping(target = "maxListItems", source = "fetchRequest.maxListItems") + XtaMessageMetaDataListingRequest mapMessageMetaDataListingRequest(MsgBoxStatusListRequestType fetchRequest, PartyType clientIdentifier); } diff --git a/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java b/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java index 968c2c579e44317dece90e596414783460611fee..7ac472b3d954073ad42f51211287532ec272dfc6 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java +++ b/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java @@ -8,21 +8,28 @@ import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListing; import genv3.de.xoev.transport.xta.x211.ContentType; import genv3.de.xoev.transport.xta.x211.GenericContentContainer; import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxResponseType; -import genv3.eu.osci.ws.x2014.x10.transport.*; +import genv3.eu.osci.ws.x2008.x05.transport.MsgStatusListType; +import genv3.eu.osci.ws.x2014.x10.transport.KeyCodeType; +import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData; +import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType; +import genv3.eu.osci.ws.x2014.x10.transport.QualifierType; import jakarta.activation.DataHandler; import jakarta.activation.FileDataSource; import lombok.SneakyThrows; + import org.mapstruct.Condition; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.Named; import org.mapstruct.ReportingPolicy; import org.mapstruct.SourcePropertyName; import org.mapstruct.TargetPropertyName; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; + import java.io.File; import java.math.BigInteger; import java.time.LocalDateTime; @@ -37,6 +44,8 @@ public interface ResponseMapper { String IDENTIFIER_TYPE = "xoev"; String MESSAGE_TYPE_LIST_URI = "urn:de:payloadSchema:elementName"; String MESSAGE_TYPE_LIST_VERSION_ID = "1.0"; + String REQUEST_ID = "1"; + String NO_MESSAGES_REASON = "Keine Nachrichten gefunden."; Identifier SENDER_IDENTIFIER = Identifier.builder() .name("xta-test-server") .value("xta-test-server") @@ -44,7 +53,7 @@ public interface ResponseMapper { .build(); @Mapping(target = "qualifier.service", source = "service") - @Mapping(target = "qualifier.businessScenario", source = "businessScenario") + @Mapping(target = "qualifier.businessScenario", source = ".", qualifiedByName = "mapBusinessScenario") @Mapping(target = "qualifier.messageType", source = ".") @Mapping(target = "msgIdentification.messageID.value", source = "messageId") @Mapping(target = "originators.author.identifier", source = "authorIdentifier") @@ -56,22 +65,27 @@ public interface ResponseMapper { @Mapping(target = "messageProperties", ignore = true) MessageMetaData mapMessageMetaDataFromXtaMessageMetaData(XtaMessageMetaData xtaMessageMetaData); - default QualifierType.BusinessScenario mapQualifierBusinessScenarioFromBusinessScenario(XtaMessageMetaData.BusinessScenario businessScenario) { - var qualifierBusinessScenario = new QualifierType.BusinessScenario(); - if (businessScenario.isDefinedCode()) { - var definedKeyCode = new KeyCodeType(); - definedKeyCode.setCode(businessScenario.businessScenarioCode()); - definedKeyCode.setName(businessScenario.name()); - definedKeyCode.setListURI(businessScenario.listURI()); - definedKeyCode.setListVersionID(businessScenario.listVersionID()); - qualifierBusinessScenario.setDefined(definedKeyCode); - } else { - qualifierBusinessScenario.setDefined(null); - qualifierBusinessScenario.setUndefined(businessScenario.businessScenarioCode()); - } - return qualifierBusinessScenario; + @Named("mapBusinessScenario") + default QualifierType.BusinessScenario mapBusinessScenario(XtaMessageMetaData xtaMessageMetaData) { + return xtaMessageMetaData.businessScenarioListUri() != null + ? mapDefinedBusinessScenario(xtaMessageMetaData) + : mapUndefinedBusinessScenario(xtaMessageMetaData); } + @Mapping(target = "defined", expression = "java(null)") + @Mapping(target = "undefined", source = "businessScenarioCode") + QualifierType.BusinessScenario mapUndefinedBusinessScenario(XtaMessageMetaData xtaMessageMetaData); + + @Mapping(target = "defined", source = ".") + @Mapping(target = "undefined", expression = "java(null)") + QualifierType.BusinessScenario mapDefinedBusinessScenario(XtaMessageMetaData xtaMessageMetaData); + + @Mapping(target = "code", source = "businessScenarioCode") + @Mapping(target = "name", source = "businessScenarioName") + @Mapping(target = "listURI", source = "businessScenarioListUri") + @Mapping(target = "listVersionID", source = "businessScenarioListVersionId") + KeyCodeType mapKeyCodeType(XtaMessageMetaData xtaMessageMetaData); + @Mapping(target = "code", source = "messageTypeCode") @Mapping(target = "name", ignore = true) @Mapping(target = "payloadSchema", source = "messageTypePayloadSchema") @@ -80,7 +94,7 @@ public interface ResponseMapper { QualifierType.MessageType mapMessageTypeQualifierType(XtaMessageMetaData xtaMessageMetaData); @Mapping(target = "type", constant = IDENTIFIER_TYPE) - PartyIdentifierType mapPartyIdentifierTypeFromIdentifier(Identifier value); + PartyIdentifierType mapPartyIdentifierType(Identifier value); @Mapping(target = "encryptedData", expression = "java(null)") @Mapping(target = "contentContainer.message", source = "messageFile") @@ -121,9 +135,16 @@ public interface ResponseMapper { MsgBoxResponseType mapMsgBoxResponseTypeFromRequestID(String requestId); @Mapping(target = "itemsPending", source = "pendingMessageCount") - @Mapping(target = "msgBoxRequestID", source = "requestId") - @Mapping(target = "noMessageAvailable", source = "messages") - MsgBoxResponseType mapMsgBoxResponseTypeFromXtaMessageMetaDataListing(XtaMessageMetaDataListing xtaMessageMetaDataListing); + @Mapping(target = "msgBoxRequestID", constant = REQUEST_ID) + @Mapping(target = "noMessageAvailable", source = "messages", qualifiedByName = "mapNoMessageAvailableReason") + MsgBoxResponseType mapMsgBoxResponseType(XtaMessageMetaDataListing listing); + + @Named("mapNoMessageAvailableReason") + default MsgBoxResponseType.NoMessageAvailable mapNoMessageAvailableReason(List<XtaMessageMetaData> messages) { + return messages.isEmpty() ? createNoMessageAvailableWithReason(NO_MESSAGES_REASON) : null; + } + + MsgBoxResponseType.NoMessageAvailable createNoMessageAvailableWithReason(String reason); @Condition default boolean pendingMessagesCountIsNotZero(BigInteger pendingMessageCount, @TargetPropertyName String targetPropertyName, @@ -135,13 +156,12 @@ public interface ResponseMapper { return true; } - default MsgBoxResponseType.NoMessageAvailable mapNoMessageAvailableFromXtaMessageMetaDataListing( - List<XtaMessageMetaData> messages) { - if (messages.isEmpty()) { - var noMessagesAvailable = new MsgBoxResponseType.NoMessageAvailable(); - noMessagesAvailable.setReason("NoMatch: No message fits the criteria from the message-selector."); - return noMessagesAvailable; - } else - return null; - } + @Mapping(target = "messageMetaData", source = "messages") + @Mapping(target = "msgAttributes", ignore = true) + MsgStatusListType mapMsgStatusListType(XtaMessageMetaDataListing listing); + + @Mapping(target = "msgBoxRequestID", constant = REQUEST_ID) + @Mapping(target = "itemsPending", ignore = true) + @Mapping(target = "noMessageAvailable.reason", source = "errorString") + MsgBoxResponseType mapMsgBoxResponseTypeError(String errorString); } diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java index f08a8c217002b379e736cb5d9474fca6fb6d1790..e48bf9962d1303af0170afcd07cf40cd62bb4349 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaData.java @@ -2,6 +2,7 @@ package de.ozgcloud.xta.test.app.model; import java.math.BigInteger; +import jakarta.annotation.Nullable; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -12,7 +13,10 @@ import lombok.Builder; @Builder(toBuilder = true) public record XtaMessageMetaData( @NotBlank String service, - @NotNull BusinessScenario businessScenario, + @NotNull @NotBlank String businessScenarioCode, + @Nullable String businessScenarioName, + @Nullable String businessScenarioListUri, + @Nullable String businessScenarioListVersionId, @NotBlank String messageTypeCode, @NotBlank String messageTypePayloadSchema, @NotBlank String messageId, @@ -20,12 +24,4 @@ public record XtaMessageMetaData( @NotNull @Valid Identifier readerIdentifier, @PositiveOrZero BigInteger messageSize ) { - public record BusinessScenario( - @NotBlank String businessScenarioCode, - String name, - String listURI, - String listVersionID, - boolean isDefinedCode - ) { - } } diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListing.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListing.java index 76c57823e8df95ce5512f1b7b8ff25c80df971dd..72f1977c4b282334d6acccef5a0230b29997f381 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListing.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListing.java @@ -12,7 +12,6 @@ import lombok.Builder; @Builder public record XtaMessageMetaDataListing( - @NotBlank String requestId, @NotNull @PositiveOrZero BigInteger pendingMessageCount, @NotNull @Valid List<XtaMessageMetaData> messages ) { diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..279014fb4fe85325d03b34115d211f87eebadc8a --- /dev/null +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaMessageMetaDataListingRequest.java @@ -0,0 +1,13 @@ +package de.ozgcloud.xta.test.app.model; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Positive; + +import lombok.Builder; + +@Builder +public record XtaMessageMetaDataListingRequest( + @NotBlank String clientIdentifierValue, + @Positive int maxListItems +) { +} diff --git a/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java b/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java index 6fd385701407e9b8b5e4e206d4b6cd371d276ab7..cc840a1b16f487a152ee8327e7153112941732bb 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java +++ b/src/main/java/de/ozgcloud/xta/test/app/server/MsgBoxPortImpl.java @@ -12,7 +12,6 @@ import org.apache.cxf.ws.addressing.AttributedURIType; import org.springframework.stereotype.Component; import de.ozgcloud.xta.test.app.model.XtaMessage; -import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListing; import de.ozgcloud.xta.test.app.service.ParameterValidatorService; import de.ozgcloud.xta.test.app.mapper.RequestMapper; import de.ozgcloud.xta.test.app.mapper.ResponseMapper; @@ -21,7 +20,6 @@ import de.ozgcloud.xta.test.app.service.XtaParameter; import de.ozgcloud.xta.test.app.util.XtaIdGenerator; import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxFetchRequest; -import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxResponseType; import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxStatusListRequestType; import genv3.eu.osci.ws.x2008.x05.transport.MsgSelector; import genv3.eu.osci.ws.x2008.x05.transport.MsgStatusListType; @@ -39,7 +37,6 @@ public class MsgBoxPortImpl implements MsgBoxPortType { private final RequestMapper requestMapper; private final ResponseMapper responseMapper; - private final XtaIdGenerator xtaIdGenerator; private final XtaMessageService messageService; /* @@ -110,24 +107,19 @@ public class MsgBoxPortImpl implements MsgBoxPortType { log.info("Executing operation getStatusList"); validateGetStatusListRequest(statusListRequest); - String msgBoxRequestId = xtaIdGenerator.generateRequestId().toString(); - MsgStatusListType statusListResponse = new MsgStatusListType(); - if (validator.isNotNull(statusListRequest.getMsgSelector(), "msgSelector")) { - msgBoxResponseHeader.value = createInvalidSearchArgsResponseHeader(msgBoxRequestId); - return statusListResponse; + msgBoxResponseHeader.value = responseMapper.mapMsgBoxResponseTypeError( + "SearchArgsInvalid: This test server doesn't support message selection in the 'getStatusList' operation."); + return new MsgStatusListType(); } - int maxListItems = getMaxListItemsOrThrow(statusListRequest); - XtaMessageMetaDataListing messageMetaDataListing = messageService.getStatusList(msgBoxRequestId, maxListItems); - messageMetaDataListing.messages().forEach( - m -> statusListResponse.getMessageMetaData().add(responseMapper.mapMessageMetaDataFromXtaMessageMetaData(m)) - ); - - msgBoxResponseHeader.value = responseMapper.mapMsgBoxResponseTypeFromXtaMessageMetaDataListing(messageMetaDataListing); - return statusListResponse; + var request = requestMapper.mapMessageMetaDataListingRequest(statusListRequest, authorIdentifier); + var listing = messageService.getStatusList(request); + msgBoxResponseHeader.value = responseMapper.mapMsgBoxResponseType(listing); + return responseMapper.mapMsgStatusListType(listing); } + private void validateGetStatusListRequest(MsgBoxStatusListRequestType statusListRequest) throws XTAWSTechnicalProblemException { if (!( validator.isNotNull(statusListRequest.getListForm(), "listForm") @@ -149,15 +141,6 @@ public class MsgBoxPortImpl implements MsgBoxPortType { } } - private MsgBoxResponseType createInvalidSearchArgsResponseHeader(String msgBoxRequestId) { - var responseHeader = new MsgBoxResponseType(); - responseHeader.setMsgBoxRequestID(msgBoxRequestId); - var noMessagesAvailable = new MsgBoxResponseType.NoMessageAvailable(); - noMessagesAvailable.setReason("SearchArgsInvalid: This test server doesn't support message selection in the 'getStatusList' operation."); - responseHeader.setNoMessageAvailable(noMessagesAvailable); - return responseHeader; - } - /* * (non-Javadoc) * @see genv3.de.xoev.transport.xta.x211.MsgBoxPortType#getNextMessage(genv3.eu.osci.ws.x2008.x05.transport. diff --git a/src/main/java/de/ozgcloud/xta/test/app/service/XtaMessageService.java b/src/main/java/de/ozgcloud/xta/test/app/service/XtaMessageService.java index cd8315d8baab8b9bfe69bc21dbd028dbe182b717..6889933d45aaa11ed521fd919822033d2ae822f1 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/service/XtaMessageService.java +++ b/src/main/java/de/ozgcloud/xta/test/app/service/XtaMessageService.java @@ -9,6 +9,7 @@ import de.ozgcloud.xta.test.app.data.XtaMessageRepository; import de.ozgcloud.xta.test.app.model.XtaMessage; import de.ozgcloud.xta.test.app.model.XtaMessageMetaData; import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListing; +import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListingRequest; import lombok.RequiredArgsConstructor; @Service @@ -20,11 +21,12 @@ public class XtaMessageService { messageRepository.save(message); } - public XtaMessageMetaDataListing getStatusList(String requestId, int maxListItems) { + public XtaMessageMetaDataListing getStatusList(XtaMessageMetaDataListingRequest listingRequest) { return XtaMessageMetaDataListing.builder() - .requestId(requestId) - .pendingMessageCount(messageRepository.count()) - .messages(getMetaData(messageRepository.findAllLimitedTo(maxListItems))) + .pendingMessageCount(messageRepository.countByReaderIdentifierValue(listingRequest.clientIdentifierValue())) + .messages(getMetaData(messageRepository.findByReaderIdentifierValueLimitedTo( + listingRequest.clientIdentifierValue(), + listingRequest.maxListItems()))) .build(); } diff --git a/src/main/resources/wsdl/XTA.wsdl b/src/main/resources/wsdl/XTA.wsdl index fe3599a9482dcef7346e5079f534b57055f67fc1..069b63877c8ac674d9d549d8c43ad3db58723032 100644 --- a/src/main/resources/wsdl/XTA.wsdl +++ b/src/main/resources/wsdl/XTA.wsdl @@ -15,7 +15,7 @@ <sp:MustSupportRefIssuerSerial/> <sp:MustSupportRefThumbprint/> <sp:MustSupportRefEncryptedKey/> - <sp:RequireSignatureConfirmation/> + <!-- <sp:RequireSignatureConfirmation/> --> </wsp:Policy> </sp:Wss11> <sp:Trust13> diff --git a/src/test/java/de/ozgcloud/xta/test/app/data/XtaMessageRepositoryTest.java b/src/test/java/de/ozgcloud/xta/test/app/data/XtaMessageRepositoryTest.java index 1a5b149807682d85c2f95aa789aef418ac916094..9aca5302125f5629e9c99543858c0ac7b6c7abee 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/data/XtaMessageRepositoryTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/data/XtaMessageRepositoryTest.java @@ -1,9 +1,12 @@ package de.ozgcloud.xta.test.app.data; -import static de.ozgcloud.xta.test.app.factory.XtaMessageTestFactory.*; +import static de.ozgcloud.xta.test.app.mapper.XtaMessageTestFactory.*; +import static de.ozgcloud.xta.test.app.service.XtaMessageMetaDataTestFactory.*; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -11,23 +14,25 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; +import org.mockito.Spy; -import de.ozgcloud.xta.test.app.factory.XtaFileTestFactory; -import de.ozgcloud.xta.test.app.factory.XtaMessageTestFactory; +import de.ozgcloud.xta.test.app.mapper.XtaFileTestFactory; +import de.ozgcloud.xta.test.app.mapper.XtaMessageTestFactory; +import de.ozgcloud.xta.test.app.model.Identifier; import de.ozgcloud.xta.test.app.model.XtaFile; import de.ozgcloud.xta.test.app.model.XtaMessage; +import de.ozgcloud.xta.test.app.service.XtaMessageMetaDataTestFactory; public class XtaMessageRepositoryTest { + @Spy + @InjectMocks private XtaMessageRepository xtaMessageRepository; @DisplayName("save") @Nested class TestSave { - @BeforeEach - void beforeEach() { - xtaMessageRepository = new XtaMessageRepository(); - } @Test void shouldSaveMessage() { @@ -73,13 +78,12 @@ public class XtaMessageRepositoryTest { @BeforeEach void beforeEach() { - messageFile = XtaFileTestFactory.createXtaFile(); - attachmentFile = XtaFileTestFactory.createXtaFile(); - XtaMessage message = XtaMessageTestFactory.createBuilder(MESSAGE_ID) + messageFile = XtaFileTestFactory.create(); + attachmentFile = XtaFileTestFactory.create(); + var message = XtaMessageTestFactory.createBuilder(MESSAGE_ID) .messageFile(messageFile) .attachmentFiles(List.of(attachmentFile)) .build(); - xtaMessageRepository = new XtaMessageRepository(); xtaMessageRepository.save(message); } @@ -95,12 +99,12 @@ public class XtaMessageRepositoryTest { } } - @DisplayName("find all limited to") + @DisplayName("find by reader identifier value limited to") @Nested - class TestFindAllLimitedTo { + class TestFindByReaderIdentifierValueLimitedTo { + @BeforeEach void beforeEach() { - xtaMessageRepository = new XtaMessageRepository(); xtaMessageRepository.save(XtaMessageTestFactory.create("1")); xtaMessageRepository.save(XtaMessageTestFactory.create("2")); xtaMessageRepository.save(XtaMessageTestFactory.create("3")); @@ -110,7 +114,7 @@ public class XtaMessageRepositoryTest { @ParameterizedTest @ValueSource(ints = { 0, 1, 2 }) void shouldReturnLimit(int limit) { - var result = xtaMessageRepository.findAllLimitedTo(limit); + var result = xtaMessageRepository.findByReaderIdentifierValueLimitedTo(READER_IDENTIFIER.value(), limit); assertThat(result).hasSize(limit); } @@ -119,27 +123,81 @@ public class XtaMessageRepositoryTest { @ParameterizedTest @ValueSource(ints = { 3, 4, 5 }) void shouldReturnAll(int limit) { - var result = xtaMessageRepository.findAllLimitedTo(limit); + var result = xtaMessageRepository.findByReaderIdentifierValueLimitedTo(READER_IDENTIFIER.value(), limit); assertThat(result).hasSize(3); } + @DisplayName("should not find any with unknown reader identifier") + @Test + void shouldNotFindAnyWithUnknownReaderIdentifier() { + var result = xtaMessageRepository.findByReaderIdentifierValueLimitedTo("unknown", 1); + + assertThat(result).isEmpty(); + } + + } + + @DisplayName("count by reader identifier value") + @Nested + class TestCountByReaderIdentifierValue { + @BeforeEach + void beforeEach() { + doReturn(Stream.of(XtaMessageTestFactory.create("1"), XtaMessageTestFactory.create("2"), + XtaMessageTestFactory.create("3"))).when(xtaMessageRepository).findByReaderIdentifierValue(READER_IDENTIFIER.value()); + } + + @DisplayName("should return") + @Test + void shouldReturn() { + var count = xtaMessageRepository.countByReaderIdentifierValue(READER_IDENTIFIER.value()); + + assertThat(count).isEqualTo(3); + } + } - @DisplayName("count") + @DisplayName("find by reader identifier value") @Nested - class TestCount { + class TestFindByReaderIdentifierValue { + private static final String OTHER_READER_IDENTIFIER = "readerIdentifier"; + @BeforeEach void beforeEach() { xtaMessageRepository = new XtaMessageRepository(); xtaMessageRepository.save(XtaMessageTestFactory.create("1")); xtaMessageRepository.save(XtaMessageTestFactory.create("2")); xtaMessageRepository.save(XtaMessageTestFactory.create("3")); + xtaMessageRepository.save(XtaMessageTestFactory.createBuilder() + .metaData(XtaMessageMetaDataTestFactory.createBuilder() + .readerIdentifier(Identifier.builder().value(OTHER_READER_IDENTIFIER).build()) + .build()) + .build()); + } + + @DisplayName("should return message for reader identifier") + @Test + void shouldReturnMessageForReaderIdentifier() { + var result = xtaMessageRepository.findByReaderIdentifierValue(READER_IDENTIFIER.value()).toList(); + + assertThat(result).hasSize(3); } + @DisplayName("should return messages for other reader identifier") @Test - void shouldReturnCount() { - assertThat(xtaMessageRepository.count()).isEqualTo(3); + void shouldReturnMessagesForOtherReaderIdentifier() { + var result = xtaMessageRepository.findByReaderIdentifierValue(OTHER_READER_IDENTIFIER).toList(); + + assertThat(result).hasSize(1); } + + @DisplayName("should return no messages for unknown reader identifier") + @Test + void shouldReturnNoMessagesForUnknownReaderIdentifier() { + var result = xtaMessageRepository.findByReaderIdentifierValue("unknown").toList(); + + assertThat(result).isEmpty(); + } + } } diff --git a/src/test/java/de/ozgcloud/xta/test/app/factory/XtaFileTestFactory.java b/src/test/java/de/ozgcloud/xta/test/app/factory/XtaFileTestFactory.java index 47b8ae9ef35612880c11e46261855bcab8a9aa7b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/factory/XtaFileTestFactory.java +++ b/src/test/java/de/ozgcloud/xta/test/app/factory/XtaFileTestFactory.java @@ -1,26 +0,0 @@ -package de.ozgcloud.xta.test.app.factory; - -import java.io.File; -import java.math.BigInteger; - -import de.ozgcloud.xta.test.app.model.XtaFile; - -public class XtaFileTestFactory { - public static final String NAME = "Test_File"; - public static final String XTA_CONTENT = "slkafj3jifsdasx"; - public static final String ZIP_CONTENT_TYPE = "application/zip"; - - public static XtaFile createXtaFile() { - return createXtaFileBuilder().build(); - } - - public static XtaFile.XtaFileBuilder createXtaFileBuilder() { - File tfile = TempFileTestFactory.createFile(XTA_CONTENT); - return XtaFile.builder() - .name(NAME) - .contentType(ZIP_CONTENT_TYPE) - .file(tfile) - .size(BigInteger.valueOf(tfile.getTotalSpace())); - } - -} diff --git a/src/test/java/de/ozgcloud/xta/test/app/factory/XtaMessageMetaDataTestFactory.java b/src/test/java/de/ozgcloud/xta/test/app/factory/XtaMessageMetaDataTestFactory.java index deee01f77108feed12e997f1916167046f64eab3..2fb00a4a9b63586c24195e4b7228d4dd8cbdc332 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/factory/XtaMessageMetaDataTestFactory.java +++ b/src/test/java/de/ozgcloud/xta/test/app/factory/XtaMessageMetaDataTestFactory.java @@ -6,6 +6,7 @@ import de.ozgcloud.xta.test.app.model.Identifier; import de.ozgcloud.xta.test.app.model.XtaMessageMetaData; public class XtaMessageMetaDataTestFactory { + public static final String DEFAULT_MESSAGE_ID = "defaultMessageId"; public static final Identifier AUTHOR_IDENTIFIER = createIdentifier("author", "AUTHOR"); public static final Identifier READER_IDENTIFIER = createIdentifier("reader", "READER"); public static final String SERVICE = "Service"; @@ -15,39 +16,31 @@ public class XtaMessageMetaDataTestFactory { public static final String BUSINESS_SCENARIO_LIST_VERSION_ID = "BusinessScenarioListVersionID"; public static final String MESSAGE_TYPE_CODE = "MessageTypeCode"; public static final String MESSAGE_PAYLOAD_SCHEMA = "MessageTypePayloadSchema"; + public static final BigInteger MESSAGE_SIZE = BigInteger.valueOf(3000); + + public static XtaMessageMetaData create() { + return createBuilder().build(); + } public static XtaMessageMetaData create(String messageId) { - return createBuilder(messageId).build(); + return createBuilder() + .messageId(messageId) + .build(); } - public static XtaMessageMetaData.XtaMessageMetaDataBuilder createBuilder(String messageId) { + public static XtaMessageMetaData.XtaMessageMetaDataBuilder createBuilder() { return XtaMessageMetaData.builder() - .messageId(messageId) + .messageId(DEFAULT_MESSAGE_ID) .authorIdentifier(AUTHOR_IDENTIFIER) .readerIdentifier(READER_IDENTIFIER) .service(SERVICE) - .businessScenario(createUndefinedBusinessScenario()) + .businessScenarioCode(BUSINESS_SCENARIO_CODE) + .businessScenarioName(BUSINESS_SCENARIO_NAME) + .businessScenarioListUri(BUSINESS_SCENARIO_LIST_URI) + .businessScenarioListVersionId(BUSINESS_SCENARIO_LIST_VERSION_ID) .messageTypeCode(MESSAGE_TYPE_CODE) .messageTypePayloadSchema(MESSAGE_PAYLOAD_SCHEMA) - .messageSize(BigInteger.ZERO); - } - - public static XtaMessageMetaData.BusinessScenario createDefinedBusinessScenario() { - return new XtaMessageMetaData.BusinessScenario( - BUSINESS_SCENARIO_CODE, - BUSINESS_SCENARIO_NAME, - BUSINESS_SCENARIO_LIST_URI, - BUSINESS_SCENARIO_LIST_VERSION_ID, - true); - } - - public static XtaMessageMetaData.BusinessScenario createUndefinedBusinessScenario() { - return new XtaMessageMetaData.BusinessScenario( - BUSINESS_SCENARIO_CODE, - null, - null, - null, - false); + .messageSize(MESSAGE_SIZE); } private static Identifier createIdentifier(String value, String category) { diff --git a/src/test/java/de/ozgcloud/xta/test/app/factory/XtaMessageTestFactory.java b/src/test/java/de/ozgcloud/xta/test/app/factory/XtaMessageTestFactory.java index 62a388203029dc65a539bbf3ad9983ae8dc681db..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/factory/XtaMessageTestFactory.java +++ b/src/test/java/de/ozgcloud/xta/test/app/factory/XtaMessageTestFactory.java @@ -1,21 +0,0 @@ -package de.ozgcloud.xta.test.app.factory; - -import java.util.List; - -import de.ozgcloud.xta.test.app.model.XtaMessage; - -public class XtaMessageTestFactory { - public static final String MESSAGE_ID_1 = "status_1"; - public static final String MESSAGE_ID_2 = "status_2"; - - public static XtaMessage create(String messageId) { - return createBuilder(messageId).build(); - } - - public static XtaMessage.XtaMessageBuilder createBuilder(String messageId) { - return XtaMessage.builder() - .metaData(XtaMessageMetaDataTestFactory.create(messageId)) - .messageFile(XtaFileTestFactory.createXtaFile()) - .attachmentFiles(List.of(XtaFileTestFactory.createXtaFile())); - } -} diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/PartyTypeTestFactory.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/PartyTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..f4f6486898ee9d44073323f558972eb9b6f9ab28 --- /dev/null +++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/PartyTypeTestFactory.java @@ -0,0 +1,25 @@ +package de.ozgcloud.xta.test.app.mapper; + + +import static de.ozgcloud.xta.test.app.service.MessageMetaDataTestFactory.*; + +import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType; +import genv3.eu.osci.ws.x2014.x10.transport.PartyType; + +public class PartyTypeTestFactory { + + public static PartyType create() { + var partyIdentifier = new PartyType(); + partyIdentifier.setIdentifier(createIdentifier()); + return partyIdentifier; + } + + private static PartyIdentifierType createIdentifier() { + var identifier = new PartyIdentifierType(); + identifier.setName(READER_IDENTIFIER.getName()); + identifier.setCategory(READER_IDENTIFIER.getCategory()); + identifier.setValue(READER_IDENTIFIER.getValue()); + return identifier; + } + +} diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/RequestMapperTest.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/RequestMapperTest.java index e835fb1d983fe6eed6aaa9e8f8155017eb11bd91..ebeed8da5bf28ba28b410a50b00032b59e554bdc 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/mapper/RequestMapperTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/RequestMapperTest.java @@ -1,6 +1,7 @@ package de.ozgcloud.xta.test.app.mapper; -import static org.assertj.core.api.Assertions.assertThat; +import static de.ozgcloud.xta.test.app.service.XtaMessageMetaDataTestFactory.*; +import static org.assertj.core.api.Assertions.*; import java.nio.file.Files; @@ -11,6 +12,7 @@ import genv3.eu.osci.ws.x2008.x05.transport.MsgSelector; import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData; import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType; import lombok.SneakyThrows; + import org.apache.cxf.ws.addressing.AttributedURIType; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -18,13 +20,23 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; -import de.ozgcloud.xta.test.app.factory.AttributedURITypeTestFactory; -import de.ozgcloud.xta.test.app.factory.ContentTypeTestFactory; -import de.ozgcloud.xta.test.app.factory.GenericContentContainerTestFactory; -import de.ozgcloud.xta.test.app.factory.MessageMetaDataTestFactory; -import de.ozgcloud.xta.test.app.factory.QualifierTypeBusinessScenarioTestFactory; import de.ozgcloud.xta.test.app.model.Identifier; import de.ozgcloud.xta.test.app.model.XtaFile; +import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListingRequest; +import de.ozgcloud.xta.test.app.service.AttributedURITypeTestFactory; +import de.ozgcloud.xta.test.app.service.ContentTypeTestFactory; +import de.ozgcloud.xta.test.app.service.GenericContentContainerTestFactory; +import de.ozgcloud.xta.test.app.service.MessageMetaDataTestFactory; +import de.ozgcloud.xta.test.app.service.MsgBoxStatusListRequestTypeTestFactory; +import de.ozgcloud.xta.test.app.service.QualifierTypeBusinessScenarioTestFactory; +import genv3.de.xoev.transport.xta.x211.ContentType; +import genv3.de.xoev.transport.xta.x211.GenericContentContainer; +import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxFetchRequest; +import genv3.eu.osci.ws.x2008.x05.transport.MsgBoxStatusListRequestType; +import genv3.eu.osci.ws.x2008.x05.transport.MsgSelector; +import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData; +import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType; +import lombok.SneakyThrows; public class RequestMapperTest { @@ -107,13 +119,12 @@ public class RequestMapperTest { messageMetaData.getQualifier().setBusinessScenario(businessScenario); var xtaMessageMetaData = requestMapper.mapXtaMessageMetaData(messageMetaData); - var mappedBusinessScenario = xtaMessageMetaData.businessScenario(); - assertThat(mappedBusinessScenario.businessScenarioCode()).isEqualTo(QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_CODE); - assertThat(mappedBusinessScenario.name()).isEqualTo(QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_NAME); - assertThat(mappedBusinessScenario.listURI()).isEqualTo(QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_LIST_URI); - assertThat(mappedBusinessScenario.listVersionID()).isEqualTo(QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_LIST_VERSION_ID); - assertThat(mappedBusinessScenario.isDefinedCode()).isTrue(); + assertThat(xtaMessageMetaData.businessScenarioCode()).isEqualTo(QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_CODE); + assertThat(xtaMessageMetaData.businessScenarioName()).isEqualTo(QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_NAME); + assertThat(xtaMessageMetaData.businessScenarioListUri()).isEqualTo(QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_LIST_URI); + assertThat(xtaMessageMetaData.businessScenarioListVersionId()).isEqualTo( + QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_LIST_VERSION_ID); } @DisplayName("Should map an undefined business scenario from MessageMetaData") @@ -123,10 +134,9 @@ public class RequestMapperTest { messageMetaData.getQualifier().setBusinessScenario(businessScenario); var xtaMessageMetaData = requestMapper.mapXtaMessageMetaData(messageMetaData); - var mappedBusinessScenario = xtaMessageMetaData.businessScenario(); - assertThat(mappedBusinessScenario.businessScenarioCode()).isEqualTo(QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_CODE); - assertThat(mappedBusinessScenario.isDefinedCode()).isFalse(); + assertThat(xtaMessageMetaData.businessScenarioCode()).isEqualTo(QualifierTypeBusinessScenarioTestFactory.BUSINESS_SCENARIO_CODE); + assertThat(xtaMessageMetaData.businessScenarioListUri()).isNull(); } } @@ -156,4 +166,67 @@ public class RequestMapperTest { } } + @Nested + class MapMaxListItems { + private MsgBoxStatusListRequestType fetchRequest; + + @DisplayName("Should map max list items from MsgBoxStatusListRequestType") + @Test + void shouldMapMaxListItems() { + fetchRequest = MsgBoxStatusListRequestTypeTestFactory.create(10); + + var maxListItems = requestMapper.mapMaxListItems(fetchRequest); + + assertThat(maxListItems).isEqualTo(10); + } + + @DisplayName("Should map unsupported negative max list items value to maximum integer value") + @Test + void shouldMapMaxListItemsToMaxValue() { + fetchRequest = MsgBoxStatusListRequestTypeTestFactory.create(-1); + + var maxListItems = requestMapper.mapMaxListItems(fetchRequest); + + assertThat(maxListItems).isEqualTo(Integer.MAX_VALUE); + } + + @DisplayName("Should map unsupported large max list items value to maximum integer value") + @Test + void shouldMapMaxListItemsToMaxValueWhenOverflowing() { + fetchRequest = MsgBoxStatusListRequestTypeTestFactory.create(Long.MAX_VALUE); + + var maxListItems = requestMapper.mapMaxListItems(fetchRequest); + + assertThat(maxListItems).isEqualTo(Integer.MAX_VALUE); + } + } + + @DisplayName("map message meta data listing request") + @Nested + class TestMapMessageMetaDataListingRequest { + private static final int MAX_LIST_ITEMS = 10; + + @DisplayName("should map client identifier value") + @Test + void shouldMapClientIdentifierValue() { + var result = doMapping(); + + assertThat(result.clientIdentifierValue()).isEqualTo(READER_IDENTIFIER.value()); + } + + @DisplayName("should map max list items") + @Test + void shouldMaxMaxListItems() { + var result = doMapping(); + + assertThat(result.maxListItems()).isEqualTo(MAX_LIST_ITEMS); + } + + private XtaMessageMetaDataListingRequest doMapping() { + return requestMapper.mapMessageMetaDataListingRequest(MsgBoxStatusListRequestTypeTestFactory.create(MAX_LIST_ITEMS), + PartyTypeTestFactory.create()); + } + + } + } diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java index 8b96fa6f9fa7154a4e4f93c0c7e6833e7dd9526b..655a8bd363dd9ffb0c7f779cd161c75e0e5bcdd4 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java @@ -1,5 +1,7 @@ package de.ozgcloud.xta.test.app.mapper; +import static de.ozgcloud.xta.test.app.mapper.ResponseMapper.*; +import static de.ozgcloud.xta.test.app.service.XtaMessageMetaDataTestFactory.*; import static org.assertj.core.api.Assertions.*; import java.math.BigInteger; @@ -19,121 +21,51 @@ import de.ozgcloud.xta.test.app.model.Identifier; import de.ozgcloud.xta.test.app.model.XtaFile; import de.ozgcloud.xta.test.app.model.XtaMessageMetaData; import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListing; +import de.ozgcloud.xta.test.app.service.XtaMessageMetaDataTestFactory; import genv3.de.xoev.transport.xta.x211.ContentType; -import genv3.eu.osci.ws.x2014.x10.transport.PartyIdentifierType; +import genv3.eu.osci.ws.x2008.x05.transport.MsgStatusListType; +import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData; +import genv3.eu.osci.ws.x2014.x10.transport.QualifierType; import lombok.SneakyThrows; public class ResponseMapperTest { private final ResponseMapper mapper = Mappers.getMapper(ResponseMapper.class); + @DisplayName("map PartyIdentifierType") @Nested - class MapMessageMetaDataFromXtaMessageMetaData { - public static final String MESSAGE_ID = "messageId"; + class TestMapPartyIdentifierType { - private XtaMessageMetaData xtaMessageMetaData; - - @DisplayName("should map messageMetaData") + @DisplayName("should map type") @Test - void shouldMapMessageId() { - xtaMessageMetaData = XtaMessageMetaDataTestFactory.create(MESSAGE_ID); - - var messageMetaData = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData); + void shouldMapType() { + var result = mapper.mapPartyIdentifierType(AUTHOR_IDENTIFIER); - assertThat(messageMetaData.getMsgIdentification().getMessageID().getValue()).isEqualTo(MESSAGE_ID); - assertThat(messageMetaData.getQualifier().getService()).isEqualTo(XtaMessageMetaDataTestFactory.SERVICE); - assertThat(messageMetaData.getMsgSize()).isEqualTo(xtaMessageMetaData.messageSize()); + assertThat(result.getType()).isEqualTo(IDENTIFIER_TYPE); } - @DisplayName("should map defined business scenario") + @DisplayName("should map value") @Test - void shouldMapDefinedBusinessScenario() { - xtaMessageMetaData = XtaMessageMetaDataTestFactory.createBuilder(MESSAGE_ID) - .businessScenario(XtaMessageMetaDataTestFactory.createDefinedBusinessScenario()) - .build(); - - var messageMetaData = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData); - var businessScenario = messageMetaData.getQualifier().getBusinessScenario(); + void shouldMapValue() { + var result = mapper.mapPartyIdentifierType(AUTHOR_IDENTIFIER); - assertThat(businessScenario.getDefined().getCode()).isEqualTo(XtaMessageMetaDataTestFactory.BUSINESS_SCENARIO_CODE); - assertThat(businessScenario.getDefined().getName()).isEqualTo(XtaMessageMetaDataTestFactory.BUSINESS_SCENARIO_NAME); - assertThat(businessScenario.getDefined().getListURI()).isEqualTo(XtaMessageMetaDataTestFactory.BUSINESS_SCENARIO_LIST_URI); - assertThat(businessScenario.getDefined().getListVersionID()).isEqualTo(XtaMessageMetaDataTestFactory.BUSINESS_SCENARIO_LIST_VERSION_ID); - assertThat(businessScenario.getUndefined()).isNull(); + assertThat(result.getValue()).isEqualTo(AUTHOR_IDENTIFIER.value()); } - @DisplayName("should map undefined business scenario") + @DisplayName("should map category") @Test - void shouldMapUndefinedBusinessScenario() { - xtaMessageMetaData = XtaMessageMetaDataTestFactory.createBuilder(MESSAGE_ID) - .businessScenario(XtaMessageMetaDataTestFactory.createUndefinedBusinessScenario()) - .build(); - - var messageMetaData = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData); - var businessScenario = messageMetaData.getQualifier().getBusinessScenario(); + void shouldMapCategory() { + var result = mapper.mapPartyIdentifierType(AUTHOR_IDENTIFIER); - assertThat(businessScenario.getDefined()).isNull(); - assertThat(businessScenario.getUndefined()).isEqualTo(XtaMessageMetaDataTestFactory.BUSINESS_SCENARIO_CODE); + assertThat(result.getCategory()).isEqualTo(AUTHOR_IDENTIFIER.category()); } - @DisplayName("should map qualifier message type") + @DisplayName("should map name") @Test - void shouldMapMessageType() { - xtaMessageMetaData = XtaMessageMetaDataTestFactory.create(MESSAGE_ID); - - var messageMetaData = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData); - var messageType = messageMetaData.getQualifier().getMessageType(); + void shouldMapName() { + var result = mapper.mapPartyIdentifierType(AUTHOR_IDENTIFIER); - assertThat(messageType.getCode()).isEqualTo(XtaMessageMetaDataTestFactory.MESSAGE_TYPE_CODE); - assertThat(messageType.getPayloadSchema()).isEqualTo(XtaMessageMetaDataTestFactory.MESSAGE_PAYLOAD_SCHEMA); - assertThat(messageType.getListURI()).isEqualTo(ResponseMapper.MESSAGE_TYPE_LIST_URI); - assertThat(messageType.getListVersionID()).isEqualTo(ResponseMapper.MESSAGE_TYPE_LIST_VERSION_ID); - } - - @DisplayName("should map author and reader identifier") - @Test - void shouldMapIdentifier() { - xtaMessageMetaData = XtaMessageMetaDataTestFactory.create(MESSAGE_ID); - - var messageMetaData = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData); - var authorIdentifier = messageMetaData.getOriginators().getAuthor().getIdentifier(); - var readerIdentifier = messageMetaData.getDestinations().getReader().getIdentifier(); - - assertIdentifiersAreEqual(authorIdentifier, XtaMessageMetaDataTestFactory.AUTHOR_IDENTIFIER); - assertIdentifiersAreEqual(readerIdentifier, XtaMessageMetaDataTestFactory.READER_IDENTIFIER); - } - - @DisplayName("should default sender identifier") - @Test - void shouldSetDefaultSenderIdentifier() { - xtaMessageMetaData = XtaMessageMetaDataTestFactory.create(MESSAGE_ID); - - var messageMetaData = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData); - var senderIdentifier = messageMetaData.getOriginators().getSender().getIdentifier(); - - assertIdentifiersAreEqual(senderIdentifier, ResponseMapper.SENDER_IDENTIFIER); - } - - void assertIdentifiersAreEqual(PartyIdentifierType identifierType, Identifier identifier) { - assertThat(identifierType.getName()).isEqualTo(identifier.name()); - assertThat(identifierType.getCategory()).isEqualTo(identifier.category()); - assertThat(identifierType.getValue()).isEqualTo(identifier.value()); - assertThat(identifierType.getType()).isEqualTo(ResponseMapper.IDENTIFIER_TYPE); - } - - @DisplayName("should set default delivery attributes") - @Test - void shouldSetDefaultDeliveryAttributes() { - xtaMessageMetaData = XtaMessageMetaDataTestFactory.create(MESSAGE_ID); - - var messageMetaData = mapper.mapMessageMetaDataFromXtaMessageMetaData(xtaMessageMetaData); - var deliveryAttributes = messageMetaData.getDeliveryAttributes(); - - assertThat(deliveryAttributes).isNotNull(); - assertThat(deliveryAttributes.getDelivery()).isNotNull(); - assertThat(deliveryAttributes.getInitialFetch()).isNotNull(); - assertThat(deliveryAttributes.getInitialSend()).isNotNull(); - assertThat(deliveryAttributes.getOrigin()).isNotNull(); + assertThat(result.getName()).isEqualTo(AUTHOR_IDENTIFIER.name()); } } @@ -144,8 +76,8 @@ public class ResponseMapperTest { @BeforeEach void beforeEach() { - messageXtaFile = XtaFileTestFactory.createXtaFile(); - attachmentXtaFile = XtaFileTestFactory.createXtaFile(); + messageXtaFile = XtaFileTestFactory.create(); + attachmentXtaFile = XtaFileTestFactory.create(); } @DisplayName("should map generic content container from xta message") @@ -177,39 +109,275 @@ public class ResponseMapperTest { } } + @DisplayName("map MsgBoxResponseType error") @Nested - class MapMsgBoxResponseTypeFromXtaMessageMetaDataListing { - private XtaMessageMetaDataListing xtaMessageMetaDataListing; + class TestMapMsgBoxResponseTypeError { + private static final String ERROR_STRING = "some error"; - @DisplayName("should have no messages available when mapping empty XtaMetaDataListing") + @DisplayName("should map no message available reason") @Test - void shouldHaveNoMessageAvailable() { - xtaMessageMetaDataListing = XtaMessageMetaDataListing.builder() - .requestId("requestId") - .pendingMessageCount(BigInteger.ZERO) - .messages(List.of()) - .build(); - - var msgBoxResponseType = mapper.mapMsgBoxResponseTypeFromXtaMessageMetaDataListing(xtaMessageMetaDataListing); + void shouldMapNoMessageAvailableReason() { + var result = mapper.mapMsgBoxResponseTypeError(ERROR_STRING); - assertThat(msgBoxResponseType.getNoMessageAvailable()).isNotNull(); - assertThat(msgBoxResponseType.getNoMessageAvailable().getReason()).startsWith("NoMatch"); - assertThat(msgBoxResponseType.getItemsPending()).isNull(); + assertThat(result.getNoMessageAvailable().getReason()).isEqualTo(ERROR_STRING); } - @DisplayName("should have items pending when mapping filled XtaMetaDatalisting") + @DisplayName("should map request id") @Test - void shouldHaveItemsPending() { + void shouldMapRequestId() { + var result = mapper.mapMsgBoxResponseTypeError(ERROR_STRING); + + assertThat(result.getMsgBoxRequestID()).isEqualTo(ResponseMapper.REQUEST_ID); + } + } + + @DisplayName("map MsgStatusListType") + @Nested + class TestMapMsgStatusListType { + private XtaMessageMetaDataListing xtaMessageMetaDataListing; + + @BeforeEach + void beforeEach() { xtaMessageMetaDataListing = XtaMessageMetaDataListing.builder() - .requestId("requestId") .pendingMessageCount(BigInteger.ONE) - .messages(List.of(XtaMessageMetaDataTestFactory.create("messageId"))) + .messages(List.of(XtaMessageMetaDataTestFactory.create())) .build(); + } + + @DisplayName("should map message meta data") + @Test + void shouldMapMessageMetaData() { + var result = mapper.mapMsgStatusListType(xtaMessageMetaDataListing); + + assertThat(result.getMessageMetaData()).hasSize(1); + } + + @DisplayName("should map message size") + @Test + void shouldMapMessageSize() { + var result = mapFirstMessageMetaData(); + + assertThat(result.getMsgSize()).isEqualTo(MESSAGE_SIZE); + } + + @DisplayName("should map service") + @Test + void shouldMapService() { + var result = mapFirstMessageMetaData(); + + assertThat(result.getQualifier().getService()).isEqualTo(SERVICE); + } + + @DisplayName("with defined business scenario") + @Nested + class TestWithDefinedBusinessScenario { + + @BeforeEach + void beforeEach() { + xtaMessageMetaDataListing = XtaMessageMetaDataListing.builder() + .pendingMessageCount(BigInteger.ONE) + .messages(List.of(XtaMessageMetaDataTestFactory.create())) + .build(); + } + + @DisplayName("should map code") + @Test + void shouldMapCode() { + var result = mapFirstMessageMetaDataBusinessScenario(); + + assertThat(result.getDefined().getCode()).isEqualTo(BUSINESS_SCENARIO_CODE); + } + + @DisplayName("should map name") + @Test + void shouldMapName() { + var result = mapFirstMessageMetaDataBusinessScenario(); + + assertThat(result.getDefined().getName()).isEqualTo(BUSINESS_SCENARIO_NAME); + } + + @DisplayName("should map list uri") + @Test + void shouldMapListUri() { + var result = mapFirstMessageMetaDataBusinessScenario(); + + assertThat(result.getDefined().getListURI()).isEqualTo(BUSINESS_SCENARIO_LIST_URI); + } + + @DisplayName("should map list version id") + @Test + void shouldMapListVersionId() { + var result = mapFirstMessageMetaDataBusinessScenario(); + + assertThat(result.getDefined().getListVersionID()).isEqualTo(BUSINESS_SCENARIO_LIST_VERSION_ID); + } + } + + @DisplayName("with undefined business scenario") + @Nested + class TestWithUndefinedBusinessScenario { + @BeforeEach + void mock() { + xtaMessageMetaDataListing = XtaMessageMetaDataListing.builder() + .pendingMessageCount(BigInteger.ONE) + .messages(List.of(XtaMessageMetaDataTestFactory.createBuilder() + .businessScenarioListUri(null) + .build())) + .build(); + + } + + @DisplayName("should map code") + @Test + void shouldMapCode() { + var result = mapFirstMessageMetaDataBusinessScenario(); + + assertThat(result.getUndefined()).isEqualTo(BUSINESS_SCENARIO_CODE); + } + + @DisplayName("should map defined null") + @Test + void shouldMapDefinedNull() { + var result = mapFirstMessageMetaDataBusinessScenario(); + + assertThat(result.getDefined()).isNull(); + } + } + + @DisplayName("should map message type code") + @Test + void shouldMapMessageTypeCode() { + var result = mapFirstMessageMetaData(); + + assertThat(result.getQualifier().getMessageType().getCode()).isEqualTo(MESSAGE_TYPE_CODE); + } + + @DisplayName("should map message type list uri") + @Test + void shouldMapMessageTypeListUri() { + var result = mapFirstMessageMetaData(); - var msgBoxResponseType = mapper.mapMsgBoxResponseTypeFromXtaMessageMetaDataListing(xtaMessageMetaDataListing); + assertThat(result.getQualifier().getMessageType().getListURI()).isEqualTo(MESSAGE_TYPE_LIST_URI); + } + + @DisplayName("should map message type list version id") + @Test + void shouldMapMessageTypeListVersionId() { + var result = mapFirstMessageMetaData(); + + assertThat(result.getQualifier().getMessageType().getListVersionID()).isEqualTo(MESSAGE_TYPE_LIST_VERSION_ID); + } + + @DisplayName("should map author identifier") + @Test + void shouldMapAuthorIdentifier() { + var result = mapFirstMessageMetaData(); + + assertThat(result.getOriginators().getAuthor().getIdentifier()) + .usingRecursiveComparison() + .isEqualTo(mapper.mapPartyIdentifierType(AUTHOR_IDENTIFIER)); + } + + @DisplayName("should default sender identifier") + @Test + void shouldSetDefaultSenderIdentifier() { + // TODO + } + + @DisplayName("should map reader identifier") + @Test + void shouldMapReaderIdentifier() { + var result = mapFirstMessageMetaData(); + + assertThat(result.getDestinations().getReader().getIdentifier()) + .usingRecursiveComparison() + .isEqualTo(mapper.mapPartyIdentifierType(READER_IDENTIFIER)); + } + + @DisplayName("should set default delivery attribute delivery") + @Test + void shouldSetDefaultDeliveryAttributeDelivery() { + // TODO + } + + @DisplayName("should set default delivery attribute inital fetch") + @Test + void shouldSetDefaultDeliveryAttributeInitialFetch() { + // TODO + } + + private MsgStatusListType doMapping() { + return mapper.mapMsgStatusListType(xtaMessageMetaDataListing); + } + + private MessageMetaData mapFirstMessageMetaData() { + return doMapping().getMessageMetaData().getFirst(); + } + + private QualifierType.BusinessScenario mapFirstMessageMetaDataBusinessScenario() { + return mapFirstMessageMetaData().getQualifier().getBusinessScenario(); + } + } + + @DisplayName("map MsgBoxResponseType") + @Nested + class TestMapMsgBoxResponseType { + private XtaMessageMetaDataListing xtaMessageMetaDataListing; + + @DisplayName("with no pending messages") + @Nested + class TestWithNoPendingMessages { + @BeforeEach + void beforeEach() { + xtaMessageMetaDataListing = XtaMessageMetaDataListing.builder() + .pendingMessageCount(BigInteger.ZERO) + .messages(List.of()) + .build(); + } + + @DisplayName("should set no message available reason") + @Test + void shouldSetNoMessageAvailableReason() { + var msgBoxResponseType = mapper.mapMsgBoxResponseType(xtaMessageMetaDataListing); + + assertThat(msgBoxResponseType.getNoMessageAvailable().getReason()).isEqualTo(ResponseMapper.NO_MESSAGES_REASON); + } + + @DisplayName("should set items pending to null") + @Test + void shouldSetItemsPendingToNull() { + var msgBoxResponseType = mapper.mapMsgBoxResponseType(xtaMessageMetaDataListing); + + assertThat(msgBoxResponseType.getItemsPending()).isNull(); + } + } - assertThat(msgBoxResponseType.getItemsPending()).isEqualTo(BigInteger.ONE); - assertThat(msgBoxResponseType.getNoMessageAvailable()).isNull(); + @DisplayName("with pending messages") + @Nested + class TestWithPendingMessages { + @BeforeEach + void beforeEach() { + xtaMessageMetaDataListing = XtaMessageMetaDataListing.builder() + .pendingMessageCount(BigInteger.ONE) + .messages(List.of(XtaMessageMetaDataTestFactory.create())) + .build(); + } + + @DisplayName("should set items pending") + @Test + void shouldSetItemsPending() { + var msgBoxResponseType = mapper.mapMsgBoxResponseType(xtaMessageMetaDataListing); + + assertThat(msgBoxResponseType.getItemsPending()).isEqualTo(BigInteger.ONE); + } + + @DisplayName("should set no message available to null") + @Test + void shouldSetNoMessageAvailableToNull() { + var msgBoxResponseType = mapper.mapMsgBoxResponseType(xtaMessageMetaDataListing); + + assertThat(msgBoxResponseType.getNoMessageAvailable()).isNull(); + } } } } diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/XtaFileTestFactory.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/XtaFileTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/XtaMessageTestFactory.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/XtaMessageTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..0234360c9a7aeecc579063303b7fc05e70395915 --- /dev/null +++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/XtaMessageTestFactory.java @@ -0,0 +1,29 @@ +package de.ozgcloud.xta.test.app.mapper; + +import java.util.List; + +import de.ozgcloud.xta.test.app.model.XtaMessage; +import de.ozgcloud.xta.test.app.service.XtaMessageMetaDataTestFactory; + +public class XtaMessageTestFactory { + public static final String MESSAGE_ID_1 = "status_1"; + public static final String MESSAGE_ID_2 = "status_2"; + + public static XtaMessage create(String messageId) { + return createBuilder(messageId).build(); + } + + public static XtaMessage.XtaMessageBuilder createBuilder() { + return XtaMessage.builder() + .metaData(XtaMessageMetaDataTestFactory.create()) + .messageFile(XtaFileTestFactory.create()) + .attachmentFiles(List.of(XtaFileTestFactory.create())); + } + + public static XtaMessage.XtaMessageBuilder createBuilder(String messageId) { + return XtaMessage.builder() + .metaData(XtaMessageMetaDataTestFactory.create(messageId)) + .messageFile(XtaFileTestFactory.create()) + .attachmentFiles(List.of(XtaFileTestFactory.create())); + } +} \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java b/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java index f1c01bd397d50d9892773d412fbbceb2b2ab920d..08fecc6dfedf7dc21599285b9f51c0fa5e85c833 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java @@ -1,6 +1,7 @@ package de.ozgcloud.xta.test.app.service; -import static de.ozgcloud.xta.test.app.factory.XtaMessageTestFactory.*; +import static de.ozgcloud.xta.test.app.mapper.XtaMessageTestFactory.*; +import static de.ozgcloud.xta.test.app.service.XtaMessageMetaDataTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; @@ -15,9 +16,10 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import de.ozgcloud.xta.test.app.data.XtaMessageRepository; -import de.ozgcloud.xta.test.app.factory.XtaMessageTestFactory; +import de.ozgcloud.xta.test.app.mapper.XtaMessageTestFactory; import de.ozgcloud.xta.test.app.model.XtaMessage; import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListing; +import de.ozgcloud.xta.test.app.model.XtaMessageMetaDataListingRequest; public class XtaMessageServiceTest { @Mock @@ -47,10 +49,15 @@ public class XtaMessageServiceTest { @Nested class GetStatusList { - public static final String REQUEST_ID = "request_1"; + private final int MAX_LIST_ITEMS = 50; private final int MESSAGE_COUNT = 2; + private final XtaMessageMetaDataListingRequest messageMetaDataListingRequest = XtaMessageMetaDataListingRequest.builder() + .clientIdentifierValue(READER_IDENTIFIER.value()) + .maxListItems(MAX_LIST_ITEMS) + .build(); + private XtaMessage message1; private XtaMessage message2; @@ -58,15 +65,9 @@ public class XtaMessageServiceTest { void beforeEach() { message1 = XtaMessageTestFactory.create(MESSAGE_ID_1); message2 = XtaMessageTestFactory.create(MESSAGE_ID_2); - when(messageRepository.findAllLimitedTo(MAX_LIST_ITEMS)).thenReturn(List.of(message1, message2)); - when(messageRepository.count()).thenReturn(BigInteger.valueOf(MESSAGE_COUNT)); - } - - @Test - void shouldSetRequestId() { - var statusList = getStatusList(); - assertThat(statusList.requestId()).isEqualTo(REQUEST_ID); + when(messageRepository.findByReaderIdentifierValueLimitedTo(READER_IDENTIFIER.value(), MAX_LIST_ITEMS)).thenReturn(List.of(message1, message2)); + when(messageRepository.countByReaderIdentifierValue(READER_IDENTIFIER.value())).thenReturn(BigInteger.valueOf(MESSAGE_COUNT)); } @Test @@ -80,11 +81,11 @@ public class XtaMessageServiceTest { void shouldSetPendingMessageToMessageCount() { var statusList = getStatusList(); - assertThat(statusList.pendingMessageCount()).isEqualTo(2); + assertThat(statusList.pendingMessageCount()).isEqualTo(MESSAGE_COUNT); } private XtaMessageMetaDataListing getStatusList() { - return service.getStatusList(REQUEST_ID, MAX_LIST_ITEMS); + return service.getStatusList(messageMetaDataListingRequest); } }