From 0aa243d87fade40355a11b8f5a0434f751cf9ece Mon Sep 17 00:00:00 2001 From: Tom Wetjens Date: Fri, 8 Mar 2024 09:01:07 +0100 Subject: [PATCH] #76 Pass signedMessage XML and payload XML to UftpIncomingHandler Signed-off-by: Tom Wetjens --- README.md | 22 +- .../core/model/IncomingUftpMessage.java | 36 ++ .../core/model/OutgoingUftpMessage.java | 23 + .../shapeshifter/core/model/UftpMessage.java | 36 +- .../service/handler/UftpPayloadHandler.java | 27 +- .../receiving/ReceivedMessageProcessor.java | 12 +- .../receiving/UftpReceivedMessageService.java | 33 +- .../sending/UftpSendMessageService.java | 3 +- .../validation/CongestionPointSupport.java | 4 +- .../core/model/UftpMessageFixture.java | 29 +- .../core/model/UftpMessageTest.java | 10 +- .../ReceivedMessageProcessorTest.java | 29 +- .../UftpReceivedMessageServiceTest.java | 419 ++++++++---------- .../base/IspConflictsValidatorTest.java | 7 +- .../service/handler/UftpIncomingHandler.java | 17 +- .../service/handler/UftpOutgoingHandler.java | 35 +- .../handler/UftpPayloadDispatcher.java | 22 +- .../receiving/UftpInternalController.java | 4 +- .../ShapeshifterSpringIntegrationTest.java | 99 +++-- .../handler/UftpPayloadDispatcherTest.java | 47 +- .../receiving/UftpInternalControllerTest.java | 14 +- 21 files changed, 539 insertions(+), 389 deletions(-) create mode 100644 core/src/main/java/org/lfenergy/shapeshifter/core/model/IncomingUftpMessage.java create mode 100644 core/src/main/java/org/lfenergy/shapeshifter/core/model/OutgoingUftpMessage.java diff --git a/README.md b/README.md index 3322c2e..8b2006c 100644 --- a/README.md +++ b/README.md @@ -207,7 +207,7 @@ public class IncomingMessageHandler implements UftpIncomingHandler } @Override - public void handle(UftpParticipant sender, FlexRequest message) { + public void handle(IncomingUftpMessage message) { // call UftpReceivedMessageService immediately or queue for later processing } } @@ -222,7 +222,7 @@ To process a message (asynchronously) you can use the `UftpReceivedMessageServic @Autowired UftpReceivedMessageService uftpReceivedMessageService; - uftpReceivedMessageService.process(sender,message); + uftpReceivedMessageService.process(message); ``` To verify an incoming message, the connector must know the sender's public key. For this you must @@ -262,9 +262,19 @@ public class MyUftpMessageSupport implements UftpMessageSupport { // ... @Override - public Optional getPreviousMessage(String messageID, String recipientDomain) { + public Optional findDuplicateMessage(String messageID, String senderDomain, String recipientDomain) { // Add the retrieval of the previous message here.... } + + @Override + public Optional findReferencedMessage(UftpMessageReference reference) { + // Add the retrieval of the referenced message here.... + } + + @Override + public Optional findFlexRevocation(String conversationID, String flexOfferMessageID, String senderDomain, String recipientDomain) { + // Add the retrieval of the revocation message here.... + } } ``` @@ -276,7 +286,7 @@ interface; public class MyCongestionPointSupport implements CongestionPointSupport { @Override - public boolean areKnownCongestionPoints(Collection connectionPoints) { + public boolean areKnownCongestionPoints(Collection congestionPoints) { // connect this to your local administration of congestion points } } @@ -307,7 +317,7 @@ public class MyCustomValidator implements UftpUserDefinedValidator } @Override - public boolean valid(UftpParticipant sender, FlexRequest flexRequest) { + public boolean valid(UftpMessage uftpMessage) { // implement your validation logic here; return true if valid, false otherwise } @@ -341,7 +351,7 @@ public class OutgoingMessageHandler implements UftpOutgoingHandler } @Override - public void handle(UftpParticipant sender, FlexRequest message) { + public void handle(OutgoingUftpMessage message) { // call UftpSendMessageService immediately or queue message for sending later } diff --git a/core/src/main/java/org/lfenergy/shapeshifter/core/model/IncomingUftpMessage.java b/core/src/main/java/org/lfenergy/shapeshifter/core/model/IncomingUftpMessage.java new file mode 100644 index 0000000..60da052 --- /dev/null +++ b/core/src/main/java/org/lfenergy/shapeshifter/core/model/IncomingUftpMessage.java @@ -0,0 +1,36 @@ +// Copyright 2024 Contributors to the Shapeshifter project +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.shapeshifter.core.model; + +import org.lfenergy.shapeshifter.api.PayloadMessageType; + +public final class IncomingUftpMessage extends UftpMessage { + + private final String signedMessageXml; + private final String payloadMessageXml; + + private IncomingUftpMessage(UftpParticipant sender, T payloadMessage, String signedMessageXml, String payloadMessageXml) { + super(sender, payloadMessage); + this.signedMessageXml = signedMessageXml; + this.payloadMessageXml = payloadMessageXml; + } + + public static IncomingUftpMessage create(UftpParticipant sender, T payloadMessage, String signedMessageXml, String payloadMessageXml) { + return new IncomingUftpMessage<>(sender, payloadMessage, signedMessageXml, payloadMessageXml); + } + + @Override + public UftpMessageDirection direction() { + return UftpMessageDirection.INCOMING; + } + + public String signedMessageXml() { + return signedMessageXml; + } + + public String payloadMessageXml() { + return payloadMessageXml; + } +} diff --git a/core/src/main/java/org/lfenergy/shapeshifter/core/model/OutgoingUftpMessage.java b/core/src/main/java/org/lfenergy/shapeshifter/core/model/OutgoingUftpMessage.java new file mode 100644 index 0000000..4ca1987 --- /dev/null +++ b/core/src/main/java/org/lfenergy/shapeshifter/core/model/OutgoingUftpMessage.java @@ -0,0 +1,23 @@ +// Copyright 2024 Contributors to the Shapeshifter project +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.shapeshifter.core.model; + +import org.lfenergy.shapeshifter.api.PayloadMessageType; + +public final class OutgoingUftpMessage extends UftpMessage { + + private OutgoingUftpMessage(UftpParticipant sender, T payloadMessage) { + super(sender, payloadMessage); + } + + public static OutgoingUftpMessage create(UftpParticipant sender, T payloadMessage) { + return new OutgoingUftpMessage<>(sender, payloadMessage); + } + + @Override + public UftpMessageDirection direction() { + return UftpMessageDirection.OUTGOING; + } +} diff --git a/core/src/main/java/org/lfenergy/shapeshifter/core/model/UftpMessage.java b/core/src/main/java/org/lfenergy/shapeshifter/core/model/UftpMessage.java index d45afa7..fc5c21c 100644 --- a/core/src/main/java/org/lfenergy/shapeshifter/core/model/UftpMessage.java +++ b/core/src/main/java/org/lfenergy/shapeshifter/core/model/UftpMessage.java @@ -8,18 +8,22 @@ import org.lfenergy.shapeshifter.api.PayloadMessageType; import org.lfenergy.shapeshifter.api.TestMessageResponse; -public record UftpMessage( - UftpParticipant sender, - UftpMessageDirection direction, - T payloadMessage -) { - - public static UftpMessage createIncoming(UftpParticipant sender, T payloadMessage) { - return new UftpMessage<>(sender, UftpMessageDirection.INCOMING, payloadMessage); +public abstract sealed class UftpMessage permits IncomingUftpMessage, OutgoingUftpMessage { + + private final UftpParticipant sender; + private final T payloadMessage; + + protected UftpMessage(UftpParticipant sender, T payloadMessage) { + this.sender = sender; + this.payloadMessage = payloadMessage; } - public static UftpMessage createOutgoing(UftpParticipant sender, T payloadMessage) { - return new UftpMessage<>(sender, UftpMessageDirection.OUTGOING, payloadMessage); + public static IncomingUftpMessage createIncoming(UftpParticipant sender, T payloadMessage, String signedMessageXml, String payloadMessageXml) { + return IncomingUftpMessage.create(sender, payloadMessage, signedMessageXml, payloadMessageXml); + } + + public static OutgoingUftpMessage createOutgoing(UftpParticipant sender, T payloadMessage) { + return OutgoingUftpMessage.create(sender, payloadMessage); } /** @@ -36,7 +40,7 @@ public UftpMessageReference referenceToPreviou return new UftpMessageReference<>(referencedMessageID, conversationID, // Having the correct direction is crucial for distinguishing between sender and recipient domain - direction.inverse(), + direction().inverse(), // Flip domains as the referencing message is sent by the recipient of the referenced message payloadMessage.getRecipientDomain(), payloadMessage.getSenderDomain(), @@ -46,4 +50,14 @@ public UftpMessageReference referenceToPreviou public static boolean isResponse(PayloadMessageType message) { return message instanceof PayloadMessageResponseType || message instanceof TestMessageResponse; } + + public UftpParticipant sender() { + return sender; + } + + public T payloadMessage() { + return payloadMessage; + } + + public abstract UftpMessageDirection direction(); } diff --git a/core/src/main/java/org/lfenergy/shapeshifter/core/service/handler/UftpPayloadHandler.java b/core/src/main/java/org/lfenergy/shapeshifter/core/service/handler/UftpPayloadHandler.java index 08292eb..5fc96b4 100644 --- a/core/src/main/java/org/lfenergy/shapeshifter/core/service/handler/UftpPayloadHandler.java +++ b/core/src/main/java/org/lfenergy/shapeshifter/core/service/handler/UftpPayloadHandler.java @@ -1,12 +1,35 @@ package org.lfenergy.shapeshifter.core.service.handler; import org.lfenergy.shapeshifter.api.PayloadMessageType; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; +import org.lfenergy.shapeshifter.core.model.OutgoingUftpMessage; import org.lfenergy.shapeshifter.core.model.UftpParticipant; public interface UftpPayloadHandler { - void notifyNewIncomingMessage(UftpParticipant from, PayloadMessageType message); + /** + * @deprecated This method will be removed in the future. Use {@link #notifyNewIncomingMessage(IncomingUftpMessage)} instead. + */ + @Deprecated(forRemoval = true, since = "2.3.0") + default void notifyNewIncomingMessage(UftpParticipant from, PayloadMessageType message) { + // Default implementation to allow switching to the new method without breaking later when it's removed. + throw new UnsupportedOperationException("Deprecated for removal"); + } - void notifyNewOutgoingMessage(UftpParticipant from, PayloadMessageType message); + default void notifyNewIncomingMessage(IncomingUftpMessage message) { + notifyNewIncomingMessage(message.sender(), message.payloadMessage()); + } + /** + * @deprecated This method will be removed in the future. Use {@link #notifyNewOutgoingMessage(OutgoingUftpMessage)} instead. + */ + @Deprecated(forRemoval = true, since = "2.3.0") + default void notifyNewOutgoingMessage(UftpParticipant from, PayloadMessageType message) { + // Default implementation to allow switching to the new method without breaking later when it's removed. + throw new UnsupportedOperationException("Deprecated for removal"); + } + + default void notifyNewOutgoingMessage(OutgoingUftpMessage message) { + notifyNewOutgoingMessage(message.sender(), message.payloadMessage()); + } } diff --git a/core/src/main/java/org/lfenergy/shapeshifter/core/service/receiving/ReceivedMessageProcessor.java b/core/src/main/java/org/lfenergy/shapeshifter/core/service/receiving/ReceivedMessageProcessor.java index fe4a022..fb49bc1 100644 --- a/core/src/main/java/org/lfenergy/shapeshifter/core/service/receiving/ReceivedMessageProcessor.java +++ b/core/src/main/java/org/lfenergy/shapeshifter/core/service/receiving/ReceivedMessageProcessor.java @@ -7,12 +7,15 @@ import lombok.RequiredArgsConstructor; import lombok.extern.apachecommons.CommonsLog; import org.lfenergy.shapeshifter.api.PayloadMessageType; -import org.lfenergy.shapeshifter.api.SignedMessage; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; import org.lfenergy.shapeshifter.core.model.UftpParticipant; import org.lfenergy.shapeshifter.core.service.UftpErrorProcessor; import org.lfenergy.shapeshifter.core.service.handler.UftpPayloadHandler; import org.lfenergy.shapeshifter.core.service.receiving.DuplicateMessageDetection.DuplicateMessageResult; +/** + * This is an internal API and should not be used by applications. It may change or be removed in a future release. + */ @CommonsLog @RequiredArgsConstructor public class ReceivedMessageProcessor { @@ -21,8 +24,9 @@ public class ReceivedMessageProcessor { private final DuplicateMessageDetection duplicateDetection; private final UftpErrorProcessor errorProcessor; - public void onReceivedMessage(SignedMessage signedMessage, PayloadMessageType request) { - var sender = new UftpParticipant(signedMessage); + public void onReceivedMessage(IncomingUftpMessage message) { + var request = message.payloadMessage(); + var sender = message.sender(); log.debug(String.format("Processing of received %s message from %s", request.getClass().getSimpleName(), sender)); if (isDuplicateMessage(sender, request)) { @@ -30,7 +34,7 @@ public void onReceivedMessage(SignedMessage signedMessage, PayloadMessageType re "Received " + request.getClass().getSimpleName() + " with MessageID '" + request.getMessageID() + "' from " + sender + " is a duplicate and has already been received."); } - payloadHandler.notifyNewIncomingMessage(sender, request); + payloadHandler.notifyNewIncomingMessage(message); } private boolean isDuplicateMessage(UftpParticipant sender, PayloadMessageType payloadMessage) { diff --git a/core/src/main/java/org/lfenergy/shapeshifter/core/service/receiving/UftpReceivedMessageService.java b/core/src/main/java/org/lfenergy/shapeshifter/core/service/receiving/UftpReceivedMessageService.java index 513bb6c..8672a5c 100644 --- a/core/src/main/java/org/lfenergy/shapeshifter/core/service/receiving/UftpReceivedMessageService.java +++ b/core/src/main/java/org/lfenergy/shapeshifter/core/service/receiving/UftpReceivedMessageService.java @@ -9,6 +9,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.apachecommons.CommonsLog; import org.lfenergy.shapeshifter.api.PayloadMessageType; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; import org.lfenergy.shapeshifter.core.model.UftpMessage; import org.lfenergy.shapeshifter.core.model.UftpParticipant; import org.lfenergy.shapeshifter.core.service.handler.UftpPayloadHandler; @@ -41,14 +42,36 @@ public class UftpReceivedMessageService { * @param from The company uftp details of the recipient * @param payloadMessage The details of the flex message, including messageID and conversationID * @return The validation result, either `ok` or `rejected` including a rejection reason + * @deprecated This method will be removed in the future. Use {@link #process(IncomingUftpMessage)} instead. */ + @Deprecated(forRemoval = true, since = "2.3.0") public ValidationResult process(UftpParticipant from, PayloadMessageType payloadMessage) { - var validationResult = validateMessage(from, payloadMessage); + return process(IncomingUftpMessage.create(from, payloadMessage, null, null)); + } + + /** + * Processes an incoming flex message in a specific conversation. Can be called from within your own incoming flex message processor. When the message passed validation, a + * response message is created and sent. + * + *

+   * public void process(IncomingUftpMessage<? extends PayloadMessageType> message) {
+   *   var validationResult = uftpReceivedMessageService.process(message);
+   *
+   *   // implement further business logic here
+   * }
+   * 
+ * + * @param uftpMessage The flex message + * @return The validation result, either `ok` or `rejected` including a rejection reason + */ + public ValidationResult process(IncomingUftpMessage uftpMessage) { + var validationResult = validateMessage(uftpMessage); + var payloadMessage = uftpMessage.payloadMessage(); if (UftpMessage.isResponse(payloadMessage)) { processPayloadMessageResponse(payloadMessage, validationResult); } else { - processPayloadMessage(from, payloadMessage, validationResult); + processPayloadMessage(uftpMessage.sender(), payloadMessage, validationResult); } return validationResult; @@ -64,12 +87,12 @@ private void processPayloadMessage(UftpParticipant from, PayloadMessageType payl var response = UftpValidationResponseCreator.getResponseForMessage(payloadMessage, validationResult); var originalRecipient = new UftpParticipant(payloadMessage.getRecipientDomain(), getRecipientRoleBySenderRole(from.role())); - payloadHandler.notifyNewOutgoingMessage(originalRecipient, response); + payloadHandler.notifyNewOutgoingMessage(UftpMessage.createOutgoing(originalRecipient, response)); } - private ValidationResult validateMessage(UftpParticipant from, PayloadMessageType payloadMessage) { + private ValidationResult validateMessage(UftpMessage uftpMessage) { if (shouldPerformValidations) { - return validationService.validate(UftpMessage.createIncoming(from, payloadMessage)); + return validationService.validate(uftpMessage); } return ValidationResult.ok(); } diff --git a/core/src/main/java/org/lfenergy/shapeshifter/core/service/sending/UftpSendMessageService.java b/core/src/main/java/org/lfenergy/shapeshifter/core/service/sending/UftpSendMessageService.java index 905c210..27c678f 100644 --- a/core/src/main/java/org/lfenergy/shapeshifter/core/service/sending/UftpSendMessageService.java +++ b/core/src/main/java/org/lfenergy/shapeshifter/core/service/sending/UftpSendMessageService.java @@ -22,7 +22,6 @@ import org.lfenergy.shapeshifter.core.common.HttpStatusCode; import org.lfenergy.shapeshifter.core.model.SigningDetails; import org.lfenergy.shapeshifter.core.model.UftpMessage; -import org.lfenergy.shapeshifter.core.model.UftpMessageDirection; import org.lfenergy.shapeshifter.core.model.UftpParticipant; import org.lfenergy.shapeshifter.core.service.crypto.UftpCryptoService; import org.lfenergy.shapeshifter.core.service.participant.ParticipantResolutionService; @@ -106,7 +105,7 @@ public void attemptToSendMessage(@NonNull PayloadMessageType payloadMessage, @No public void attemptToValidateAndSendMessage(@NonNull PayloadMessageType payloadMessage, @NonNull SigningDetails details) throws UftpSendException { // We will validate outgoing messages, but we will not validate outgoing response messages. if (!(payloadMessage instanceof PayloadMessageResponseType)) { - var uftpMessage = new UftpMessage<>(details.sender(), UftpMessageDirection.OUTGOING, payloadMessage); + var uftpMessage = UftpMessage.createOutgoing(details.sender(), payloadMessage); var validationResult = uftpValidationService.validate(uftpMessage); if (!validationResult.valid()) { throw new UftpSendException(MessageFormat.format(MSG_VALIDATION_FAILED, payloadMessage.getClass().getSimpleName(), validationResult.rejectionReason())); diff --git a/core/src/main/java/org/lfenergy/shapeshifter/core/service/validation/CongestionPointSupport.java b/core/src/main/java/org/lfenergy/shapeshifter/core/service/validation/CongestionPointSupport.java index ab23c15..1d77c69 100644 --- a/core/src/main/java/org/lfenergy/shapeshifter/core/service/validation/CongestionPointSupport.java +++ b/core/src/main/java/org/lfenergy/shapeshifter/core/service/validation/CongestionPointSupport.java @@ -30,8 +30,8 @@ public interface CongestionPointSupport { /** * Checks whether every congestion point in a given list is a known congestion point * - * @param connectionPoints The list of congestion points to be checked + * @param congestionPoints The list of congestion points to be checked * @return Whether all given congestion points are a known congestion point */ - boolean areKnownCongestionPoints(Collection connectionPoints); + boolean areKnownCongestionPoints(Collection congestionPoints); } diff --git a/core/src/test/java/org/lfenergy/shapeshifter/core/model/UftpMessageFixture.java b/core/src/test/java/org/lfenergy/shapeshifter/core/model/UftpMessageFixture.java index 1d476a3..9c0faa2 100644 --- a/core/src/test/java/org/lfenergy/shapeshifter/core/model/UftpMessageFixture.java +++ b/core/src/test/java/org/lfenergy/shapeshifter/core/model/UftpMessageFixture.java @@ -9,19 +9,20 @@ public final class UftpMessageFixture { - private UftpMessageFixture() { - // Utility class - } - - public static UftpMessage createIncoming(UftpParticipant sender, T payloadMessage) { - return new UftpMessage<>(sender, UftpMessageDirection.INCOMING, payloadMessage); - } - public static UftpMessage createIncomingResponse(UftpParticipant sender, T payloadMessage) { - return new UftpMessage<>(sender, UftpMessageDirection.INCOMING, payloadMessage); - } - - public static UftpMessage createOutgoing(UftpParticipant sender, T payloadMessage) { - return new UftpMessage<>(sender, UftpMessageDirection.OUTGOING, payloadMessage); - } + private UftpMessageFixture() { + // Utility class + } + + public static UftpMessage createIncoming(UftpParticipant sender, T payloadMessage) { + return UftpMessage.createIncoming(sender, payloadMessage, "", ""); + } + + public static UftpMessage createIncomingResponse(UftpParticipant sender, T payloadMessage) { + return UftpMessage.createIncoming(sender, payloadMessage,"", ""); + } + + public static UftpMessage createOutgoing(UftpParticipant sender, T payloadMessage) { + return UftpMessage.createOutgoing(sender, payloadMessage); + } } diff --git a/core/src/test/java/org/lfenergy/shapeshifter/core/model/UftpMessageTest.java b/core/src/test/java/org/lfenergy/shapeshifter/core/model/UftpMessageTest.java index 731e662..b5859d8 100644 --- a/core/src/test/java/org/lfenergy/shapeshifter/core/model/UftpMessageTest.java +++ b/core/src/test/java/org/lfenergy/shapeshifter/core/model/UftpMessageTest.java @@ -4,13 +4,13 @@ package org.lfenergy.shapeshifter.core.model; -import static org.assertj.core.api.Assertions.assertThat; - import org.junit.jupiter.api.Test; import org.lfenergy.shapeshifter.api.FlexOffer; import org.lfenergy.shapeshifter.api.FlexRequest; import org.lfenergy.shapeshifter.api.USEFRoleType; +import static org.assertj.core.api.Assertions.assertThat; + class UftpMessageTest { private static final String DSO_DOMAIN = "DSO_DOMAIN"; @@ -22,12 +22,16 @@ class UftpMessageTest { void createIncoming() { var sender = new UftpParticipant(DSO_DOMAIN, USEFRoleType.DSO); var payloadMessage = new FlexRequest(); + var signedMessageXml = ""; + var payloadMessageXml = ""; - var uftpMessage = UftpMessage.createIncoming(sender, payloadMessage); + var uftpMessage = UftpMessage.createIncoming(sender, payloadMessage, signedMessageXml, payloadMessageXml); assertThat(uftpMessage.direction()).isEqualTo(UftpMessageDirection.INCOMING); assertThat(uftpMessage.payloadMessage()).isSameAs(payloadMessage); assertThat(uftpMessage.sender()).isSameAs(sender); + assertThat(uftpMessage.signedMessageXml()).isEqualTo(signedMessageXml); + assertThat(uftpMessage.payloadMessageXml()).isEqualTo(payloadMessageXml); } @Test diff --git a/core/src/test/java/org/lfenergy/shapeshifter/core/service/receiving/ReceivedMessageProcessorTest.java b/core/src/test/java/org/lfenergy/shapeshifter/core/service/receiving/ReceivedMessageProcessorTest.java index 1f990da..1fe3031 100644 --- a/core/src/test/java/org/lfenergy/shapeshifter/core/service/receiving/ReceivedMessageProcessorTest.java +++ b/core/src/test/java/org/lfenergy/shapeshifter/core/service/receiving/ReceivedMessageProcessorTest.java @@ -21,6 +21,7 @@ import org.lfenergy.shapeshifter.api.FlexRequestResponse; import org.lfenergy.shapeshifter.api.SignedMessage; import org.lfenergy.shapeshifter.api.USEFRoleType; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; import org.lfenergy.shapeshifter.core.model.UftpParticipant; import org.lfenergy.shapeshifter.core.service.UftpErrorProcessor; import org.lfenergy.shapeshifter.core.service.handler.UftpPayloadHandler; @@ -36,6 +37,8 @@ class ReceivedMessageProcessorTest { private static final String SENDER_DOMAIN = "SENDER_DOMAIN"; private static final USEFRoleType SENDER_ROLE = USEFRoleType.AGR; private static final String MESSAGE_ID = "MESSAGE_ID"; + private static final String SIGNED_MESSAGE_XML = "TRANSPORT_XML"; + private static final String PAYLOAD_MESSAGE_XML = "PAYLOAD_XML"; @Mock private UftpPayloadHandler payloadHandler; @@ -84,14 +87,10 @@ void onReceivedMessage_businessMsg_smoothSailing() { given(duplicateDetection.isDuplicate(businessMsg)).willReturn(NEW_MESSAGE); - testSubject.onReceivedMessage(signedMessage, businessMsg); + var incomingUftpMessage = IncomingUftpMessage.create(new UftpParticipant(signedMessage), businessMsg, SIGNED_MESSAGE_XML, PAYLOAD_MESSAGE_XML); + testSubject.onReceivedMessage(incomingUftpMessage); - verify(payloadHandler, times(1)).notifyNewIncomingMessage(senderCaptor.capture(), eq(businessMsg)); - - assertThat(senderCaptor.getAllValues()).hasSize(1); - UftpParticipant sender = senderCaptor.getValue(); - assertThat(sender.domain()).isEqualTo(SENDER_DOMAIN); - assertThat(sender.role()).isEqualTo(SENDER_ROLE); + verify(payloadHandler, times(1)).notifyNewIncomingMessage(incomingUftpMessage); noMoreErrorInteractionProcessor(); } @@ -103,7 +102,8 @@ void onReceivedMessage_businessMsg_exceptionWhileProcessing() { var exception = new RuntimeException("Simulated error during duplicate detection"); given(duplicateDetection.isDuplicate(businessMsg)).willThrow(exception); - assertThatThrownBy(() -> testSubject.onReceivedMessage(signedMessage, businessMsg)) + var incomingUftpMessage = IncomingUftpMessage.create(new UftpParticipant(signedMessage), businessMsg, SIGNED_MESSAGE_XML, PAYLOAD_MESSAGE_XML); + assertThatThrownBy(() -> testSubject.onReceivedMessage(incomingUftpMessage)) .isSameAs(exception); } @@ -113,7 +113,8 @@ void onReceivedMessage_businessMsg_isDuplicate() { given(duplicateDetection.isDuplicate(businessMsg)).willReturn(DUPLICATE_MESSAGE); given(businessMsg.getMessageID()).willReturn(MESSAGE_ID); - assertThatThrownBy(() -> testSubject.onReceivedMessage(signedMessage, businessMsg)) + var incomingUftpMessage = IncomingUftpMessage.create(new UftpParticipant(signedMessage), businessMsg, SIGNED_MESSAGE_XML, PAYLOAD_MESSAGE_XML); + assertThatThrownBy(() -> testSubject.onReceivedMessage(incomingUftpMessage)) .isInstanceOf(DuplicateMessageException.class); verify(errorProcessor).onDuplicateReceived(senderCaptor.capture(), eq(businessMsg)); @@ -129,14 +130,10 @@ void onReceivedMessage_responseMsg_smoothSailing() { given(duplicateDetection.isDuplicate(responseMsg)).willReturn(NEW_MESSAGE); - testSubject.onReceivedMessage(signedMessage, responseMsg); + var incomingUftpMessage = IncomingUftpMessage.create(new UftpParticipant(signedMessage), responseMsg, SIGNED_MESSAGE_XML, PAYLOAD_MESSAGE_XML); + testSubject.onReceivedMessage(incomingUftpMessage); - verify(payloadHandler, times(1)).notifyNewIncomingMessage(senderCaptor.capture(), eq(responseMsg)); - - assertThat(senderCaptor.getAllValues()).hasSize(1); - UftpParticipant sender = senderCaptor.getValue(); - assertThat(sender.domain()).isEqualTo(SENDER_DOMAIN); - assertThat(sender.role()).isEqualTo(SENDER_ROLE); + verify(payloadHandler, times(1)).notifyNewIncomingMessage(incomingUftpMessage); noMoreErrorInteractionProcessor(); } diff --git a/core/src/test/java/org/lfenergy/shapeshifter/core/service/receiving/UftpReceivedMessageServiceTest.java b/core/src/test/java/org/lfenergy/shapeshifter/core/service/receiving/UftpReceivedMessageServiceTest.java index dc3cc7d..84124a5 100644 --- a/core/src/test/java/org/lfenergy/shapeshifter/core/service/receiving/UftpReceivedMessageServiceTest.java +++ b/core/src/test/java/org/lfenergy/shapeshifter/core/service/receiving/UftpReceivedMessageServiceTest.java @@ -1,22 +1,9 @@ package org.lfenergy.shapeshifter.core.service.receiving; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -import java.util.UUID; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.lfenergy.shapeshifter.api.AcceptedRejectedType; -import org.lfenergy.shapeshifter.api.FlexRequest; -import org.lfenergy.shapeshifter.api.FlexRequestResponse; -import org.lfenergy.shapeshifter.api.PayloadMessageType; -import org.lfenergy.shapeshifter.api.TestMessage; -import org.lfenergy.shapeshifter.api.TestMessageResponse; -import org.lfenergy.shapeshifter.api.USEFRoleType; +import org.lfenergy.shapeshifter.api.*; +import org.lfenergy.shapeshifter.core.model.OutgoingUftpMessage; import org.lfenergy.shapeshifter.core.model.UftpMessage; import org.lfenergy.shapeshifter.core.model.UftpParticipant; import org.lfenergy.shapeshifter.core.service.handler.UftpPayloadHandler; @@ -28,297 +15,265 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -@ExtendWith(MockitoExtension.class) -class UftpReceivedMessageServiceTest { - - private static final String REQUEST_MESSAGE_ID = UUID.randomUUID().toString(); - private static final String RESPONSE_MESSAGE_ID = UUID.randomUUID().toString(); - private static final String SENDER_DOMAIN = "SENDER_DOMAIN"; - private static final USEFRoleType SENDER_ROLE = USEFRoleType.DSO; - private static final String RECIPIENT_DOMAIN = "RECIPIENT_DOMAIN"; - private static final USEFRoleType RECIPIENT_ROLE = USEFRoleType.AGR; - private static final String REJECTION_REASON = "Reason for rejection"; - private static final String CONVERSATION_ID = UUID.randomUUID().toString(); - - @Mock - private UftpValidationService validator; - - @Mock - private UftpPayloadHandler payloadHandler; - - @InjectMocks - private UftpReceivedMessageService testSubject; - - @Mock - private FlexRequest request; - - @Mock - private FlexRequestResponse response; - - @Mock - private TestMessage testMessage; - - @Mock - private TestMessageResponse testMessageResponse; - - private UftpParticipant sender; +import java.util.UUID; - private UftpParticipant recipient; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; - @Captor - private ArgumentCaptor recipientCaptor; +@ExtendWith(MockitoExtension.class) +class UftpReceivedMessageServiceTest { - @Captor - private ArgumentCaptor senderCaptor; + private static final String REQUEST_MESSAGE_ID = UUID.randomUUID().toString(); + private static final String RESPONSE_MESSAGE_ID = UUID.randomUUID().toString(); + private static final String SENDER_DOMAIN = "SENDER_DOMAIN"; + private static final USEFRoleType SENDER_ROLE = USEFRoleType.DSO; + private static final String RECIPIENT_DOMAIN = "RECIPIENT_DOMAIN"; + private static final USEFRoleType RECIPIENT_ROLE = USEFRoleType.AGR; + private static final String REJECTION_REASON = "Reason for rejection"; + private static final String CONVERSATION_ID = UUID.randomUUID().toString(); - @Captor - private ArgumentCaptor> uftpMessageCaptor; + @Mock + private UftpValidationService validator; - @Captor - private ArgumentCaptor responseCaptor; + @Mock + private UftpPayloadHandler payloadHandler; - @Captor - private ArgumentCaptor testMessageResponseCaptor; + @InjectMocks + private UftpReceivedMessageService testSubject; - @BeforeEach - void setUp() { - this.sender = new UftpParticipant(SENDER_DOMAIN, SENDER_ROLE); - this.recipient = new UftpParticipant(RECIPIENT_DOMAIN, RECIPIENT_ROLE); - } + private final String signedMessageXml = ""; - @Test - void createAndSendResponseForUftpMessage_valid_request_validationsEnabled() { - setupRequest(); - testSubject.setShouldPerformValidations(true); + private final FlexRequest request = new FlexRequest(); + private final String requestXml = ""; - given(validator.validate(uftpMessageCaptor.capture())).willReturn(ValidationResult.ok()); + private final FlexRequestResponse response = new FlexRequestResponse(); + private final String responseXml = ""; - testSubject.process(sender, request); + private final TestMessage testMessage = new TestMessage(); + private final String testMessageXml = ""; - verify(payloadHandler).notifyNewOutgoingMessage(recipientCaptor.capture(), responseCaptor.capture()); + private final TestMessageResponse testMessageResponse = new TestMessageResponse(); + private final String testMessageResponseXml = ""; - assertThat(uftpMessageCaptor.getAllValues().get(0).sender()).isNotNull(); - var actualSender = uftpMessageCaptor.getAllValues().get(0).sender(); - validateUftpParticipant(actualSender, sender); + private final UftpParticipant sender = new UftpParticipant(SENDER_DOMAIN, SENDER_ROLE); - assertThat(recipientCaptor.getAllValues()).hasSize(1); - var actualRecipient = recipientCaptor.getValue(); - validateUftpParticipant(actualRecipient, recipient); + private final UftpParticipant recipient = new UftpParticipant(RECIPIENT_DOMAIN, RECIPIENT_ROLE); - var uftpMessages = uftpMessageCaptor.getAllValues(); - assertThat(uftpMessages).hasSize(1); - var actualRequest = uftpMessages.get(0).payloadMessage(); + @Captor + private ArgumentCaptor> outgoingUftpMessageCaptor; - assertThat(responseCaptor.getAllValues()).hasSize(1); - var actualResponse = (FlexRequestResponse) responseCaptor.getValue(); + @Test + void createAndSendResponseForUftpMessage_valid_request_validationsEnabled() { + setupRequest(); + testSubject.setShouldPerformValidations(true); - assertThat(actualRequest.getMessageID()).isEqualTo(REQUEST_MESSAGE_ID); - assertThat(actualResponse.getFlexRequestMessageID()).isEqualTo(REQUEST_MESSAGE_ID); - assertThat(actualResponse.getResult()).isEqualTo(AcceptedRejectedType.ACCEPTED); - } + var incomingUftpMessage = UftpMessage.createIncoming(sender, request, signedMessageXml, requestXml); + given(validator.validate(incomingUftpMessage)).willReturn(ValidationResult.ok()); - @Test - void createAndSendResponseForUftpMessage_invalid_request_validationsEnabled() { - setupRequest(); - testSubject.setShouldPerformValidations(true); + testSubject.process(incomingUftpMessage); - given(validator.validate(uftpMessageCaptor.capture())).willReturn(ValidationResult.rejection(REJECTION_REASON)); + verify(validator).validate(incomingUftpMessage); + verify(payloadHandler).notifyNewOutgoingMessage(outgoingUftpMessageCaptor.capture()); - testSubject.process(sender, request); + var outgoingUftpMessage = outgoingUftpMessageCaptor.getValue(); + validateUftpParticipant(outgoingUftpMessage.sender(), recipient); - verify(payloadHandler).notifyNewOutgoingMessage(recipientCaptor.capture(), responseCaptor.capture()); + var actualResponse = (FlexRequestResponse) outgoingUftpMessage.payloadMessage(); - var uftpMessages = uftpMessageCaptor.getAllValues(); - assertThat(uftpMessages.get(0).sender()).isNotNull(); - var actualSender = uftpMessages.get(0).sender(); - validateUftpParticipant(actualSender, sender); + assertThat(actualResponse.getFlexRequestMessageID()).isEqualTo(REQUEST_MESSAGE_ID); + assertThat(actualResponse.getResult()).isEqualTo(AcceptedRejectedType.ACCEPTED); + } - assertThat(recipientCaptor.getAllValues()).hasSize(1); - var actualRecipient = recipientCaptor.getValue(); - validateUftpParticipant(actualRecipient, recipient); + @Test + void createAndSendResponseForUftpMessage_invalid_request_validationsEnabled() { + setupRequest(); + testSubject.setShouldPerformValidations(true); - var actualRequest = uftpMessages.get(0).payloadMessage(); + var incomingUftpMessage = UftpMessage.createIncoming(sender, request, signedMessageXml, requestXml); + given(validator.validate(incomingUftpMessage)).willReturn(ValidationResult.rejection(REJECTION_REASON)); - assertThat(responseCaptor.getAllValues()).hasSize(1); - var actualResponse = (FlexRequestResponse) responseCaptor.getValue(); + testSubject.process(incomingUftpMessage); - assertThat(actualRequest.getMessageID()).isEqualTo(REQUEST_MESSAGE_ID); - assertThat(actualResponse.getFlexRequestMessageID()).isEqualTo(REQUEST_MESSAGE_ID); - assertThat(actualResponse.getResult()).isEqualTo(AcceptedRejectedType.REJECTED); - assertThat(actualResponse.getRejectionReason()).isEqualTo(REJECTION_REASON); - } + verify(validator).validate(incomingUftpMessage); + verify(payloadHandler).notifyNewOutgoingMessage(outgoingUftpMessageCaptor.capture()); - @Test - void createAndSendResponseForUftpMessage_valid_request_validationsDisabled() { - setupRequest(); - testSubject.setShouldPerformValidations(false); + var outgoingUftpMessage = outgoingUftpMessageCaptor.getValue(); + validateUftpParticipant(outgoingUftpMessage.sender(), recipient); - testSubject.process(sender, request); + var actualResponse = (FlexRequestResponse) outgoingUftpMessage.payloadMessage(); - verify(payloadHandler).notifyNewOutgoingMessage(recipientCaptor.capture(), responseCaptor.capture()); + assertThat(actualResponse.getFlexRequestMessageID()).isEqualTo(REQUEST_MESSAGE_ID); + assertThat(actualResponse.getResult()).isEqualTo(AcceptedRejectedType.REJECTED); + assertThat(actualResponse.getRejectionReason()).isEqualTo(REJECTION_REASON); + } - assertThat(recipientCaptor.getAllValues()).hasSize(1); - var actualRecipient = recipientCaptor.getValue(); - validateUftpParticipant(actualRecipient, recipient); + @Test + void createAndSendResponseForUftpMessage_valid_request_validationsDisabled() { + setupRequest(); + testSubject.setShouldPerformValidations(false); - assertThat(responseCaptor.getAllValues()).hasSize(1); - var actualResponse = (FlexRequestResponse) responseCaptor.getValue(); + testSubject.process(UftpMessage.createIncoming(sender, request, signedMessageXml, requestXml)); - assertThat(actualResponse.getFlexRequestMessageID()).isEqualTo(REQUEST_MESSAGE_ID); - assertThat(actualResponse.getResult()).isEqualTo(AcceptedRejectedType.ACCEPTED); - } + verify(payloadHandler).notifyNewOutgoingMessage(outgoingUftpMessageCaptor.capture()); - @Test - void createAndSendResponseForUftpMessage_invalid_request_validationsDisabled() { - setupRequest(); - testSubject.setShouldPerformValidations(false); + var outgoingUftpMessage = outgoingUftpMessageCaptor.getValue(); + validateUftpParticipant(outgoingUftpMessage.sender(), recipient); - testSubject.process(sender, request); + var actualResponse = (FlexRequestResponse) outgoingUftpMessage.payloadMessage(); - verify(payloadHandler).notifyNewOutgoingMessage(recipientCaptor.capture(), responseCaptor.capture()); + assertThat(actualResponse.getFlexRequestMessageID()).isEqualTo(REQUEST_MESSAGE_ID); + assertThat(actualResponse.getResult()).isEqualTo(AcceptedRejectedType.ACCEPTED); + } - assertThat(recipientCaptor.getAllValues()).hasSize(1); - var actualRecipient = recipientCaptor.getValue(); - validateUftpParticipant(actualRecipient, recipient); + @Test + void createAndSendResponseForUftpMessage_invalid_request_validationsDisabled() { + setupRequest(); + testSubject.setShouldPerformValidations(false); - assertThat(responseCaptor.getAllValues()).hasSize(1); - var actualResponse = (FlexRequestResponse) responseCaptor.getValue(); + testSubject.process(UftpMessage.createIncoming(sender, request, signedMessageXml, requestXml)); - assertThat(actualResponse.getFlexRequestMessageID()).isEqualTo(REQUEST_MESSAGE_ID); - assertThat(actualResponse.getResult()).isEqualTo(AcceptedRejectedType.ACCEPTED); - } + verify(payloadHandler).notifyNewOutgoingMessage(outgoingUftpMessageCaptor.capture()); - @Test - void createAndSendResponseForUftpMessage_valid_response_validationsEnabled() { - setupResponse(); - testSubject.setShouldPerformValidations(true); + var outgoingUftpMessage = outgoingUftpMessageCaptor.getValue(); + validateUftpParticipant(outgoingUftpMessage.sender(), recipient); - given(validator.validate(uftpMessageCaptor.capture())).willReturn(ValidationResult.ok()); + var actualResponse = (FlexRequestResponse) outgoingUftpMessage.payloadMessage(); - testSubject.process(recipient, response); + assertThat(actualResponse.getFlexRequestMessageID()).isEqualTo(REQUEST_MESSAGE_ID); + assertThat(actualResponse.getResult()).isEqualTo(AcceptedRejectedType.ACCEPTED); + } - var uftpMessages = uftpMessageCaptor.getAllValues(); - var actualSender = uftpMessages.get(0).sender(); - assertThat(actualSender).isNotNull(); - validateUftpParticipant(actualSender, recipient); - var actualRequest = uftpMessages.get(0).payloadMessage(); + @Test + void createAndSendResponseForUftpMessage_valid_response_validationsEnabled() { + setupResponse(); + testSubject.setShouldPerformValidations(true); - assertThat(actualRequest.getMessageID()).isEqualTo(RESPONSE_MESSAGE_ID); - } + var incomingUftpMessage = UftpMessage.createIncoming(sender, response, signedMessageXml, responseXml); + given(validator.validate(any())).willReturn(ValidationResult.ok()); - @Test - void createAndSendResponseForUftpMessage_invalid_response_validationsEnabled() { - setupResponse(); - testSubject.setShouldPerformValidations(true); + testSubject.process(incomingUftpMessage); - given(validator.validate(uftpMessageCaptor.capture())).willReturn(ValidationResult.rejection(REJECTION_REASON)); + verify(validator).validate(incomingUftpMessage); + verify(payloadHandler, never()).notifyNewOutgoingMessage(any(OutgoingUftpMessage.class)); + } - testSubject.process(recipient, response); + @Test + void createAndSendResponseForUftpMessage_invalid_response_validationsEnabled() { + setupResponse(); + testSubject.setShouldPerformValidations(true); - assertThat(uftpMessageCaptor.getAllValues().get(0).sender()).isNotNull(); - var actualSender = uftpMessageCaptor.getAllValues().get(0).sender(); - validateUftpParticipant(actualSender, recipient); + var incomingUftpMessage = UftpMessage.createIncoming(sender, response, signedMessageXml, responseXml); + given(validator.validate(incomingUftpMessage)).willReturn(ValidationResult.rejection(REJECTION_REASON)); - assertThat(uftpMessageCaptor.getAllValues().get(0).payloadMessage()).isNotNull(); - var actualRequest = uftpMessageCaptor.getAllValues().get(0).payloadMessage(); + testSubject.process(incomingUftpMessage); - assertThat(actualRequest.getMessageID()).isEqualTo(RESPONSE_MESSAGE_ID); - } + verify(validator).validate(incomingUftpMessage); + verify(payloadHandler, never()).notifyNewOutgoingMessage(any(OutgoingUftpMessage.class)); + } - @Test - void createAndSendResponseForUftpMessage_response_validationsDisabled() { - testSubject.setShouldPerformValidations(false); + @Test + void createAndSendResponseForUftpMessage_response_validationsDisabled() { + testSubject.setShouldPerformValidations(false); - testSubject.process(recipient, response); + testSubject.process(UftpMessage.createIncoming(sender, response, signedMessageXml, responseXml)); - verify(validator, never()).validate(any(UftpMessage.class)); - verify(payloadHandler, never()).notifyNewOutgoingMessage(any(UftpParticipant.class), any(PayloadMessageType.class)); - } + verify(validator, never()).validate(any(UftpMessage.class)); + verify(payloadHandler, never()).notifyNewOutgoingMessage(any(OutgoingUftpMessage.class)); + } - @Test - void process_valid_testMessage() { - setupTestMessage(); - testSubject.setShouldPerformValidations(true); + @Test + void process_valid_testMessage() { + setupTestMessage(); + testSubject.setShouldPerformValidations(true); - given(validator.validate(UftpMessage.createIncoming(sender, testMessage))).willReturn(ValidationResult.ok()); + var incomingUftpMessage = UftpMessage.createIncoming(sender, testMessage, signedMessageXml, testMessageXml); + given(validator.validate(incomingUftpMessage)).willReturn(ValidationResult.ok()); - var result = testSubject.process(sender, testMessage); - assertThat(result.valid()).isTrue(); + var result = testSubject.process(incomingUftpMessage); + assertThat(result.valid()).isTrue(); - verify(payloadHandler).notifyNewOutgoingMessage(senderCaptor.capture(), testMessageResponseCaptor.capture()); + verify(payloadHandler).notifyNewOutgoingMessage(outgoingUftpMessageCaptor.capture()); - var participant = senderCaptor.getValue(); - assertThat(participant.domain()).isEqualTo(RECIPIENT_DOMAIN); - assertThat(participant.role()).isEqualTo(USEFRoleType.AGR); + var outgoingUftpMessage = outgoingUftpMessageCaptor.getValue(); + var participant = outgoingUftpMessage.sender(); + assertThat(participant.domain()).isEqualTo(RECIPIENT_DOMAIN); + assertThat(participant.role()).isEqualTo(USEFRoleType.AGR); - var response = testMessageResponseCaptor.getValue(); - assertThat(response.getSenderDomain()).isEqualTo(RECIPIENT_DOMAIN); - assertThat(response.getConversationID()).isEqualTo(CONVERSATION_ID); - } + var response = (TestMessageResponse) outgoingUftpMessage.payloadMessage(); + assertThat(response.getSenderDomain()).isEqualTo(RECIPIENT_DOMAIN); + assertThat(response.getConversationID()).isEqualTo(CONVERSATION_ID); + } - @Test - void process_invalid_testMessage() { - setupTestMessage(); - testSubject.setShouldPerformValidations(true); + @Test + void process_invalid_testMessage() { + setupTestMessage(); + testSubject.setShouldPerformValidations(true); - given(validator.validate(UftpMessage.createIncoming(sender, testMessage))).willReturn(ValidationResult.rejection(REJECTION_REASON)); + var incomingUftpMessage = UftpMessage.createIncoming(sender, testMessage, signedMessageXml, testMessageXml); + given(validator.validate(incomingUftpMessage)).willReturn(ValidationResult.rejection(REJECTION_REASON)); - var result = testSubject.process(sender, testMessage); - assertThat(result.valid()).isFalse(); + var result = testSubject.process(incomingUftpMessage); + assertThat(result.valid()).isFalse(); - verify(payloadHandler).notifyNewOutgoingMessage(senderCaptor.capture(), testMessageResponseCaptor.capture()); + verify(payloadHandler).notifyNewOutgoingMessage(outgoingUftpMessageCaptor.capture()); - var participant = senderCaptor.getValue(); - assertThat(participant.domain()).isEqualTo(RECIPIENT_DOMAIN); - assertThat(participant.role()).isEqualTo(USEFRoleType.AGR); + var outgoingUftpMessage = outgoingUftpMessageCaptor.getValue(); + var participant = outgoingUftpMessage.sender(); + assertThat(participant.domain()).isEqualTo(RECIPIENT_DOMAIN); + assertThat(participant.role()).isEqualTo(USEFRoleType.AGR); - var response = testMessageResponseCaptor.getValue(); - assertThat(response.getSenderDomain()).isEqualTo(RECIPIENT_DOMAIN); - assertThat(response.getConversationID()).isEqualTo(CONVERSATION_ID); - } + var response = (TestMessageResponse) outgoingUftpMessage.payloadMessage(); + assertThat(response.getSenderDomain()).isEqualTo(RECIPIENT_DOMAIN); + assertThat(response.getConversationID()).isEqualTo(CONVERSATION_ID); + } - @Test - void process_testMessageResponse() { - testSubject.setShouldPerformValidations(true); + @Test + void process_testMessageResponse() { + testSubject.setShouldPerformValidations(true); - given(validator.validate(UftpMessage.createIncoming(sender, testMessageResponse))).willReturn(ValidationResult.ok()); + var incomingUftpMessage = UftpMessage.createIncoming(sender, testMessageResponse, signedMessageXml, testMessageResponseXml); + given(validator.validate(incomingUftpMessage)).willReturn(ValidationResult.ok()); - var result = testSubject.process(sender, testMessageResponse); - assertThat(result.valid()).isTrue(); + var result = testSubject.process(incomingUftpMessage); + assertThat(result.valid()).isTrue(); - verify(payloadHandler, never()).notifyNewOutgoingMessage(any(), any()); - } + verify(payloadHandler, never()).notifyNewOutgoingMessage(any(OutgoingUftpMessage.class)); + } - @Test - void process_invalid_testMessageResponse() { - testSubject.setShouldPerformValidations(true); + @Test + void process_invalid_testMessageResponse() { + testSubject.setShouldPerformValidations(true); - given(validator.validate(UftpMessage.createIncoming(sender, testMessageResponse))).willReturn(ValidationResult.rejection("test reason")); + var incomingUftpMessage = UftpMessage.createIncoming(sender, testMessageResponse, signedMessageXml, testMessageResponseXml); + given(validator.validate(incomingUftpMessage)).willReturn(ValidationResult.rejection("test reason")); - var result = testSubject.process(sender, testMessageResponse); - assertThat(result.valid()).isFalse(); + var result = testSubject.process(incomingUftpMessage); + assertThat(result.valid()).isFalse(); - verify(payloadHandler, never()).notifyNewOutgoingMessage(any(), any()); - } + verify(payloadHandler, never()).notifyNewOutgoingMessage(any(OutgoingUftpMessage.class)); + } - private void setupRequest() { - given(request.getMessageID()).willReturn(REQUEST_MESSAGE_ID); - given(request.getSenderDomain()).willReturn(SENDER_DOMAIN); - given(request.getRecipientDomain()).willReturn(RECIPIENT_DOMAIN); - } + private void setupRequest() { + request.setMessageID(REQUEST_MESSAGE_ID); + request.setSenderDomain(SENDER_DOMAIN); + request.setRecipientDomain(RECIPIENT_DOMAIN); + } - private void setupResponse() { - given(response.getMessageID()).willReturn(RESPONSE_MESSAGE_ID); - } + private void setupResponse() { + response.setMessageID(RESPONSE_MESSAGE_ID); + } - private void validateUftpParticipant(UftpParticipant actual, UftpParticipant expected) { - assertThat(actual.domain()).isEqualTo(expected.domain()); - assertThat(actual.role()).isEqualTo(expected.role()); - } + private void validateUftpParticipant(UftpParticipant actual, UftpParticipant expected) { + assertThat(actual.domain()).isEqualTo(expected.domain()); + assertThat(actual.role()).isEqualTo(expected.role()); + } - private void setupTestMessage() { - given(testMessage.getConversationID()).willReturn(CONVERSATION_ID); - given(testMessage.getRecipientDomain()).willReturn(RECIPIENT_DOMAIN); - } + private void setupTestMessage() { + testMessage.setConversationID(CONVERSATION_ID); + testMessage.setRecipientDomain(RECIPIENT_DOMAIN); + } } \ No newline at end of file diff --git a/core/src/test/java/org/lfenergy/shapeshifter/core/service/validation/base/IspConflictsValidatorTest.java b/core/src/test/java/org/lfenergy/shapeshifter/core/service/validation/base/IspConflictsValidatorTest.java index 5f500fa..799b220 100644 --- a/core/src/test/java/org/lfenergy/shapeshifter/core/service/validation/base/IspConflictsValidatorTest.java +++ b/core/src/test/java/org/lfenergy/shapeshifter/core/service/validation/base/IspConflictsValidatorTest.java @@ -17,7 +17,8 @@ import static org.lfenergy.shapeshifter.core.model.PayloadMessageFixture.DURATION_15_MINUTES; import static org.lfenergy.shapeshifter.core.model.UftpMessage.createIncoming; import static org.lfenergy.shapeshifter.core.service.participant.UftpParticipantFixture.DSO; -import static org.lfenergy.shapeshifter.core.service.validation.base.IspInfoFixture.*; +import static org.lfenergy.shapeshifter.core.service.validation.base.IspInfoFixture.flexOfferOption; +import static org.lfenergy.shapeshifter.core.service.validation.base.IspInfoFixture.meteringProfile; class IspConflictsValidatorTest { @@ -36,7 +37,7 @@ void getReason() { void isValid(PayloadMessageType msg, List ispList, boolean expectedResult) { setISPs(msg, ispList); - assertThat(testSubject.isValid(createIncoming(DSO, msg))).isEqualTo(expectedResult); + assertThat(testSubject.isValid(createIncoming(DSO, msg, "", ""))).isEqualTo(expectedResult); } @ParameterizedTest @@ -44,7 +45,7 @@ void isValid(PayloadMessageType msg, List ispList, boolean expectedResu void isValid_overlapDueToDuration(PayloadMessageType msg, List ispList, boolean expectedResult) { setISPs(msg, ispList); - assertThat(testSubject.isValid(createIncoming(DSO, msg))).isEqualTo(expectedResult); + assertThat(testSubject.isValid(createIncoming(DSO, msg, "", ""))).isEqualTo(expectedResult); } private static Stream testCases() { diff --git a/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpIncomingHandler.java b/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpIncomingHandler.java index ce94b4b..fa6e329 100644 --- a/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpIncomingHandler.java +++ b/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpIncomingHandler.java @@ -5,6 +5,7 @@ package org.lfenergy.shapeshifter.spring.service.handler; import org.lfenergy.shapeshifter.api.PayloadMessageType; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; import org.lfenergy.shapeshifter.core.model.UftpParticipant; /** @@ -20,7 +21,21 @@ public interface UftpIncomingHandler { /** * Handles the incoming message either by immediately calling {@link org.lfenergy.shapeshifter.core.service.receiving.UftpReceivedMessageService} or by queueing the message * somehow for later processing. + * @deprecated This method will be removed in the future. Use {@link #handle(IncomingUftpMessage)} instead. */ - void handle(UftpParticipant sender, T message); + @Deprecated(forRemoval = true, since = "2.3.0") + default void handle(UftpParticipant sender, T message) { + // Default implementation to allow switching to the new method without breaking later when it's removed. + throw new UnsupportedOperationException("Not implemented"); + } + + /** + * Handles the incoming message either by immediately calling {@link org.lfenergy.shapeshifter.core.service.receiving.UftpReceivedMessageService} or by queueing the message + * somehow for later processing. + * @param message the incoming message + */ + default void handle(IncomingUftpMessage message) { + handle(message.sender(), message.payloadMessage()); + } } diff --git a/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpOutgoingHandler.java b/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpOutgoingHandler.java index ec920f8..edcd3a9 100644 --- a/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpOutgoingHandler.java +++ b/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpOutgoingHandler.java @@ -5,6 +5,7 @@ package org.lfenergy.shapeshifter.spring.service.handler; import org.lfenergy.shapeshifter.api.PayloadMessageType; +import org.lfenergy.shapeshifter.core.model.OutgoingUftpMessage; import org.lfenergy.shapeshifter.core.model.UftpParticipant; /** @@ -12,15 +13,31 @@ */ public interface UftpOutgoingHandler { - /** - * Returns true if the handler supports the given message type. - */ - boolean isSupported(Class messageType); + /** + * Returns true if the handler supports the given message type. + */ + boolean isSupported(Class messageType); - /** - * Handles the outgoing message either by immediately calling {@link org.lfenergy.shapeshifter.core.service.sending.UftpSendMessageService} or by queueing the message - * somehow for later sending. - */ - void handle(UftpParticipant sender, T message); + /** + * Handles the outgoing message either by immediately calling {@link org.lfenergy.shapeshifter.core.service.sending.UftpSendMessageService} or by queueing the message + * somehow for later sending. + * + * @deprecated This method will be removed in the future. Use {@link #handle(OutgoingUftpMessage)} instead. + */ + @Deprecated(forRemoval = true, since = "2.3.0") + default void handle(UftpParticipant sender, T message) { + // Default implementation to allow switching to the new method without breaking later when it's removed. + throw new UnsupportedOperationException("Not implemented"); + } + + /** + * Handles the outgoing message either by immediately calling {@link org.lfenergy.shapeshifter.core.service.sending.UftpSendMessageService} or by queueing the message + * somehow for later sending. + * + * @param message the outgoing message + */ + default void handle(OutgoingUftpMessage message) { + handle(message.sender(), message.payloadMessage()); + } } diff --git a/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpPayloadDispatcher.java b/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpPayloadDispatcher.java index 8c675e2..4554b12 100644 --- a/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpPayloadDispatcher.java +++ b/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/handler/UftpPayloadDispatcher.java @@ -4,16 +4,18 @@ package org.lfenergy.shapeshifter.spring.service.handler; -import java.util.List; import lombok.extern.apachecommons.CommonsLog; import org.lfenergy.shapeshifter.api.PayloadMessageType; import org.lfenergy.shapeshifter.core.common.HttpStatusCode; import org.lfenergy.shapeshifter.core.common.exception.UftpConnectorException; -import org.lfenergy.shapeshifter.core.model.UftpParticipant; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; +import org.lfenergy.shapeshifter.core.model.OutgoingUftpMessage; import org.lfenergy.shapeshifter.core.service.handler.UftpPayloadHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; + /** * {@link UftpPayloadHandler} that takes any incoming or outgoing UFTP message and dispatches it to one or more appropriate registered handlers. */ @@ -42,10 +44,10 @@ public UftpPayloadDispatcher(List message) { + var messageType = message.payloadMessage().getClass(); - log.debug(String.format("Notifying application handler of incoming %s message from %s", messageType.getSimpleName(), from)); + log.debug(String.format("Notifying application handler of incoming %s message from %s", messageType.getSimpleName(), message.sender())); var matchingHandlers = incomingHandlers.stream() .filter(incomingHandler -> incomingHandler.isSupported(messageType)) @@ -56,16 +58,16 @@ public void notifyNewIncomingMessage(UftpParticipant from, PayloadMessageType me } for (var handler : matchingHandlers) { - ((UftpIncomingHandler) handler).handle(from, message); + ((UftpIncomingHandler) handler).handle(message); } } @Override @SuppressWarnings({"unchecked", "rawtypes"}) - public void notifyNewOutgoingMessage(UftpParticipant from, PayloadMessageType message) { - var messageType = message.getClass(); + public void notifyNewOutgoingMessage(OutgoingUftpMessage message) { + var messageType = message.payloadMessage().getClass(); - log.debug(String.format("Notifying application handler of outgoing %s message from %s", messageType.getSimpleName(), from)); + log.debug(String.format("Notifying application handler of outgoing %s message from %s", messageType.getSimpleName(), message.sender())); var matchingHandlers = outgoingHandlers.stream() .filter(outgoingHandler -> outgoingHandler.isSupported(messageType)) @@ -76,7 +78,7 @@ public void notifyNewOutgoingMessage(UftpParticipant from, PayloadMessageType me } for (var handler : matchingHandlers) { - ((UftpOutgoingHandler) handler).handle(from, message); + ((UftpOutgoingHandler) handler).handle(message); } } diff --git a/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/receiving/UftpInternalController.java b/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/receiving/UftpInternalController.java index d8c3aa1..d1e886c 100644 --- a/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/receiving/UftpInternalController.java +++ b/spring/src/main/java/org/lfenergy/shapeshifter/spring/service/receiving/UftpInternalController.java @@ -14,6 +14,8 @@ import lombok.extern.apachecommons.CommonsLog; import org.lfenergy.shapeshifter.api.SignedMessage; import org.lfenergy.shapeshifter.core.common.exception.UftpConnectorException; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; +import org.lfenergy.shapeshifter.core.model.UftpParticipant; import org.lfenergy.shapeshifter.core.service.UftpErrorProcessor; import org.lfenergy.shapeshifter.core.service.crypto.UftpCryptoService; import org.lfenergy.shapeshifter.core.service.receiving.DuplicateMessageException; @@ -75,7 +77,7 @@ public ResponseEntity postUftpMessage( log.debug("Received UFTP message unsealed."); var payloadMessage = deserializer.fromPayloadXml(payloadXml); - processor.onReceivedMessage(signedMessage, payloadMessage); + processor.onReceivedMessage(IncomingUftpMessage.create(new UftpParticipant(signedMessage), payloadMessage, transportXml, payloadXml)); return ResponseEntity.ok(null); } catch (DuplicateMessageException e) { diff --git a/spring/src/test/java/org/lfenergy/shapeshifter/spring/ShapeshifterSpringIntegrationTest.java b/spring/src/test/java/org/lfenergy/shapeshifter/spring/ShapeshifterSpringIntegrationTest.java index 75ab888..73ce81c 100644 --- a/spring/src/test/java/org/lfenergy/shapeshifter/spring/ShapeshifterSpringIntegrationTest.java +++ b/spring/src/test/java/org/lfenergy/shapeshifter/spring/ShapeshifterSpringIntegrationTest.java @@ -4,46 +4,19 @@ package org.lfenergy.shapeshifter.spring; -import static org.assertj.core.api.Assertions.assertThat; -import static org.lfenergy.shapeshifter.api.USEFRoleType.AGR; -import static org.lfenergy.shapeshifter.api.USEFRoleType.DSO; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.time.Duration; -import java.time.OffsetDateTime; -import java.util.Collection; -import java.util.Optional; -import java.util.TimeZone; -import java.util.UUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.lfenergy.shapeshifter.api.AcceptedRejectedType; -import org.lfenergy.shapeshifter.api.AvailableRequestedType; -import org.lfenergy.shapeshifter.api.FlexRequest; -import org.lfenergy.shapeshifter.api.FlexRequestISPType; -import org.lfenergy.shapeshifter.api.FlexRequestResponse; -import org.lfenergy.shapeshifter.api.PayloadMessageType; -import org.lfenergy.shapeshifter.api.TestMessage; -import org.lfenergy.shapeshifter.api.TestMessageResponse; -import org.lfenergy.shapeshifter.api.USEFRoleType; +import org.lfenergy.shapeshifter.api.*; import org.lfenergy.shapeshifter.api.model.UftpParticipantInformation; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; +import org.lfenergy.shapeshifter.core.model.OutgoingUftpMessage; import org.lfenergy.shapeshifter.core.model.UftpParticipant; import org.lfenergy.shapeshifter.core.service.UftpErrorProcessor; import org.lfenergy.shapeshifter.core.service.UftpParticipantService; import org.lfenergy.shapeshifter.core.service.crypto.UftpCryptoService; import org.lfenergy.shapeshifter.core.service.receiving.UftpReceivedMessageService; import org.lfenergy.shapeshifter.core.service.serialization.UftpSerializer; -import org.lfenergy.shapeshifter.core.service.validation.CongestionPointSupport; -import org.lfenergy.shapeshifter.core.service.validation.ContractSupport; -import org.lfenergy.shapeshifter.core.service.validation.ParticipantSupport; -import org.lfenergy.shapeshifter.core.service.validation.UftpMessageSupport; -import org.lfenergy.shapeshifter.core.service.validation.UftpValidatorSupport; +import org.lfenergy.shapeshifter.core.service.validation.*; import org.lfenergy.shapeshifter.spring.ShapeshifterSpringIntegrationTest.TestConfig; import org.lfenergy.shapeshifter.spring.config.EnableShapeshifter; import org.lfenergy.shapeshifter.spring.service.handler.UftpIncomingHandler; @@ -59,6 +32,23 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.web.servlet.MockMvc; +import java.time.Duration; +import java.time.OffsetDateTime; +import java.util.Collection; +import java.util.Optional; +import java.util.TimeZone; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.lfenergy.shapeshifter.api.USEFRoleType.AGR; +import static org.lfenergy.shapeshifter.api.USEFRoleType.DSO; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + @WebMvcTest(controllers = UftpInternalController.class) @ContextConfiguration(classes = TestConfig.class) class ShapeshifterSpringIntegrationTest { @@ -116,9 +106,9 @@ static class TestConfig { private MockMvc mockMvc; @Captor - private ArgumentCaptor requestCaptor; + private ArgumentCaptor> incomingUftpMessageCaptor; @Captor - private ArgumentCaptor responseCaptor; + private ArgumentCaptor> outgoingUftpMessageCaptor; @BeforeEach void setUp() { @@ -138,16 +128,21 @@ void postUftpMessage_flexRequest_happyFlow() throws Exception { .content(createSignedMessageXml(DSO_PARTICIPANT, flexRequest))) .andExpect(status().isOk()); - verify(uftpIncomingHandler).handle(eq(DSO_PARTICIPANT), requestCaptor.capture()); + verify(uftpIncomingHandler).handle(incomingUftpMessageCaptor.capture()); + + var incomingUftpMessage = incomingUftpMessageCaptor.getValue(); + assertThat(incomingUftpMessage.sender()).isEqualTo(DSO_PARTICIPANT); - var request = (FlexRequest) requestCaptor.getValue(); + var request = (FlexRequest) incomingUftpMessage.payloadMessage(); assertThat(request).usingRecursiveComparison().isEqualTo(flexRequest); - uftpReceivedMessageService.process(DSO_PARTICIPANT, requestCaptor.getValue()); + uftpReceivedMessageService.process(incomingUftpMessage); - verify(uftpOutgoingHandler).handle(eq(AGR_PARTICIPANT), responseCaptor.capture()); + verify(uftpOutgoingHandler).handle(outgoingUftpMessageCaptor.capture()); - var response = (FlexRequestResponse) responseCaptor.getValue(); + var outgoingUftpMessage = outgoingUftpMessageCaptor.getValue(); + assertThat(outgoingUftpMessage.sender()).isEqualTo(AGR_PARTICIPANT); + var response = (FlexRequestResponse) outgoingUftpMessage.payloadMessage(); assertThat(response.getFlexRequestMessageID()).isEqualTo(flexRequest.getMessageID()); assertThat(response.getResult()).isEqualTo(AcceptedRejectedType.ACCEPTED); assertThat(response.getRejectionReason()).isBlank(); @@ -185,16 +180,20 @@ void postUftpMessage_flexRequest_validationError() throws Exception { .content(createSignedMessageXml(DSO_PARTICIPANT, flexRequest))) .andExpect(status().isOk()); - verify(uftpIncomingHandler).handle(eq(DSO_PARTICIPANT), requestCaptor.capture()); + verify(uftpIncomingHandler).handle(incomingUftpMessageCaptor.capture()); - var request = (FlexRequest) requestCaptor.getValue(); + var incomingUftpMessage = incomingUftpMessageCaptor.getValue(); + assertThat(incomingUftpMessage.sender()).isEqualTo(DSO_PARTICIPANT); + var request = (FlexRequest) incomingUftpMessage.payloadMessage(); assertThat(request).usingRecursiveComparison().isEqualTo(flexRequest); - uftpReceivedMessageService.process(DSO_PARTICIPANT, requestCaptor.getValue()); + uftpReceivedMessageService.process(incomingUftpMessage); - verify(uftpOutgoingHandler).handle(eq(AGR_PARTICIPANT), responseCaptor.capture()); + verify(uftpOutgoingHandler).handle(outgoingUftpMessageCaptor.capture()); - var response = (FlexRequestResponse) responseCaptor.getValue(); + var outgoingUftpMessage = outgoingUftpMessageCaptor.getValue(); + assertThat(outgoingUftpMessage.sender()).isEqualTo(AGR_PARTICIPANT); + var response = (FlexRequestResponse) outgoingUftpMessage.payloadMessage(); assertThat(response.getFlexRequestMessageID()).isEqualTo(flexRequest.getMessageID()); assertThat(response.getResult()).isEqualTo(AcceptedRejectedType.REJECTED); assertThat(response.getRejectionReason()).isEqualTo("ISP duration rejected"); @@ -214,16 +213,20 @@ void postUftpMessage_testMessage_happyFlow() throws Exception { .content(createSignedMessageXml(DSO_PARTICIPANT, testMessage))) .andExpect(status().isOk()); - verify(uftpIncomingHandler).handle(eq(DSO_PARTICIPANT), requestCaptor.capture()); + verify(uftpIncomingHandler).handle(incomingUftpMessageCaptor.capture()); - var request = (TestMessage) requestCaptor.getValue(); + var incomingUftpMessage = incomingUftpMessageCaptor.getValue(); + assertThat(incomingUftpMessage.sender()).isEqualTo(DSO_PARTICIPANT); + var request = (TestMessage) incomingUftpMessage.payloadMessage(); assertThat(request).usingRecursiveComparison().isEqualTo(testMessage); - uftpReceivedMessageService.process(DSO_PARTICIPANT, requestCaptor.getValue()); + uftpReceivedMessageService.process(incomingUftpMessage); - verify(uftpOutgoingHandler).handle(eq(AGR_PARTICIPANT), responseCaptor.capture()); + verify(uftpOutgoingHandler).handle(outgoingUftpMessageCaptor.capture()); - var response = (TestMessageResponse) responseCaptor.getValue(); + var outgoingUftpMessage = outgoingUftpMessageCaptor.getValue(); + assertThat(outgoingUftpMessage.sender()).isEqualTo(AGR_PARTICIPANT); + var response = (TestMessageResponse) outgoingUftpMessage.payloadMessage(); assertThat(response.getSenderDomain()).isEqualTo(AGR_DOMAIN); assertThat(response.getRecipientDomain()).isEqualTo(DSO_DOMAIN); assertThat(response.getConversationID()).isEqualTo(testMessage.getConversationID()); diff --git a/spring/src/test/java/org/lfenergy/shapeshifter/spring/service/handler/UftpPayloadDispatcherTest.java b/spring/src/test/java/org/lfenergy/shapeshifter/spring/service/handler/UftpPayloadDispatcherTest.java index 2841389..d6df3e0 100644 --- a/spring/src/test/java/org/lfenergy/shapeshifter/spring/service/handler/UftpPayloadDispatcherTest.java +++ b/spring/src/test/java/org/lfenergy/shapeshifter/spring/service/handler/UftpPayloadDispatcherTest.java @@ -4,13 +4,6 @@ package org.lfenergy.shapeshifter.spring.service.handler; -import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; - -import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -18,14 +11,24 @@ import org.lfenergy.shapeshifter.api.PayloadMessageType; import org.lfenergy.shapeshifter.api.USEFRoleType; import org.lfenergy.shapeshifter.core.common.exception.UftpConnectorException; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; +import org.lfenergy.shapeshifter.core.model.OutgoingUftpMessage; import org.lfenergy.shapeshifter.core.model.UftpParticipant; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; + @SuppressWarnings("unchecked") @ExtendWith(MockitoExtension.class) class UftpPayloadDispatcherTest { + public static final String SIGNED_MESSAGE_XML = ""; + public static final String PAYLOAD_MESSAGE_XML = ""; @Mock private UftpIncomingHandler incomingHandler; @@ -49,10 +52,11 @@ void notifyNewIncomingMessage() { given(incomingHandler.isSupported(FlexRequest.class)).willReturn(true); - testSubject.notifyNewIncomingMessage(sender, message); + var incomingUftpMessage = IncomingUftpMessage.create(sender, message, SIGNED_MESSAGE_XML, PAYLOAD_MESSAGE_XML); + testSubject.notifyNewIncomingMessage(incomingUftpMessage); verify(incomingHandler).isSupported(FlexRequest.class); - verify(incomingHandler).handle(sender, message); + verify(incomingHandler).handle(incomingUftpMessage); } @Test @@ -60,7 +64,8 @@ void notifyNewIncomingMessage_noSupportedHandler() { var sender = new UftpParticipant("domain", USEFRoleType.DSO); var message = new FlexRequest(); - assertThatThrownBy(() -> testSubject.notifyNewIncomingMessage(sender, message)) + var incomingUftpMessage = IncomingUftpMessage.create(sender, message, SIGNED_MESSAGE_XML, PAYLOAD_MESSAGE_XML); + assertThatThrownBy(() -> testSubject.notifyNewIncomingMessage(incomingUftpMessage)) .isInstanceOf(UftpConnectorException.class) .hasMessage("No incoming handler for message type: FlexRequest"); @@ -83,13 +88,14 @@ void notifyNewIncomingMessage_multipleSupportedHandlers() { given(incomingHandler.isSupported(FlexRequest.class)).willReturn(true); given(incomingHandler2.isSupported(FlexRequest.class)).willReturn(true); - testSubject.notifyNewIncomingMessage(sender, message); + var incomingUftpMessage = IncomingUftpMessage.create(sender, message, SIGNED_MESSAGE_XML, PAYLOAD_MESSAGE_XML); + testSubject.notifyNewIncomingMessage(incomingUftpMessage); verify(incomingHandler).isSupported(FlexRequest.class); - verify(incomingHandler).handle(sender, message); + verify(incomingHandler).handle(incomingUftpMessage); verify(incomingHandler2).isSupported(FlexRequest.class); - verify(incomingHandler2).handle(sender, message); + verify(incomingHandler2).handle(incomingUftpMessage); } @Test @@ -97,12 +103,13 @@ void notifyNewOutgoingMessage() { var sender = new UftpParticipant("domain", USEFRoleType.DSO); var message = new FlexRequest(); + OutgoingUftpMessage outgoingUftpMessage = OutgoingUftpMessage.create(sender, message); given(outgoingHandler.isSupported(FlexRequest.class)).willReturn(true); - testSubject.notifyNewOutgoingMessage(sender, message); + testSubject.notifyNewOutgoingMessage(outgoingUftpMessage); verify(outgoingHandler).isSupported(FlexRequest.class); - verify(outgoingHandler).handle(sender, message); + verify(outgoingHandler).handle(outgoingUftpMessage); } @Test @@ -110,7 +117,8 @@ void notifyNewOutgoingMessage_noSupportedHandler() { var sender = new UftpParticipant("domain", USEFRoleType.DSO); var message = new FlexRequest(); - assertThatThrownBy(() -> testSubject.notifyNewOutgoingMessage(sender, message)) + var outgoingUftpMessage = OutgoingUftpMessage.create(sender, message); + assertThatThrownBy(() -> testSubject.notifyNewOutgoingMessage(outgoingUftpMessage)) .isInstanceOf(UftpConnectorException.class) .hasMessage("No outgoing handler for message type: FlexRequest"); @@ -133,13 +141,14 @@ void notifyNewOutgoingMessage_multipleSupportedHandlers() { given(outgoingHandler.isSupported(FlexRequest.class)).willReturn(true); given(outgoingHandler2.isSupported(FlexRequest.class)).willReturn(true); - testSubject.notifyNewOutgoingMessage(sender, message); + OutgoingUftpMessage outgoingUftpMessage = OutgoingUftpMessage.create(sender, message); + testSubject.notifyNewOutgoingMessage(outgoingUftpMessage); verify(outgoingHandler).isSupported(FlexRequest.class); - verify(outgoingHandler).handle(sender, message); + verify(outgoingHandler).handle(outgoingUftpMessage); verify(outgoingHandler2).isSupported(FlexRequest.class); - verify(outgoingHandler2).handle(sender, message); + verify(outgoingHandler2).handle(outgoingUftpMessage); } } \ No newline at end of file diff --git a/spring/src/test/java/org/lfenergy/shapeshifter/spring/service/receiving/UftpInternalControllerTest.java b/spring/src/test/java/org/lfenergy/shapeshifter/spring/service/receiving/UftpInternalControllerTest.java index e7bbcd9..7a8739a 100644 --- a/spring/src/test/java/org/lfenergy/shapeshifter/spring/service/receiving/UftpInternalControllerTest.java +++ b/spring/src/test/java/org/lfenergy/shapeshifter/spring/service/receiving/UftpInternalControllerTest.java @@ -15,8 +15,10 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.lfenergy.shapeshifter.api.PayloadMessageType; import org.lfenergy.shapeshifter.api.SignedMessage; +import org.lfenergy.shapeshifter.api.USEFRoleType; import org.lfenergy.shapeshifter.core.common.HttpStatusCode; import org.lfenergy.shapeshifter.core.common.exception.UftpConnectorException; +import org.lfenergy.shapeshifter.core.model.IncomingUftpMessage; import org.lfenergy.shapeshifter.core.service.UftpErrorProcessor; import org.lfenergy.shapeshifter.core.service.crypto.UftpCryptoService; import org.lfenergy.shapeshifter.core.service.receiving.ReceivedMessageProcessor; @@ -58,6 +60,8 @@ class UftpInternalControllerTest { private RuntimeException runtimeException; @Captor private ArgumentCaptor uftpExceptionCaptor; + @Captor + private ArgumentCaptor> incomingUftpMessageCaptor; @AfterEach void noMore() { @@ -108,6 +112,7 @@ void receiveUftpMessageOtherException() { void receiveUftpMessageOk() { given(deserializer.fromSignedXml(TRANSPORT_XML)).willReturn(signedMessage); given(signedMessage.getSenderDomain()).willReturn(SENDER_DOMAIN); + given(signedMessage.getSenderRole()).willReturn(USEFRoleType.DSO); given(uftpCryptoService.verifySignedMessage(signedMessage)).willReturn(PAYLOAD_XML); given(deserializer.fromPayloadXml(PAYLOAD_XML)).willReturn(payloadMessage); @@ -115,6 +120,13 @@ void receiveUftpMessageOk() { assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(result.getBody()).isNull(); - verify(processor).onReceivedMessage(signedMessage, payloadMessage); + verify(processor).onReceivedMessage(incomingUftpMessageCaptor.capture()); + + var incomingUftpMessage = incomingUftpMessageCaptor.getValue(); + assertThat(incomingUftpMessage.sender().domain()).isEqualTo(SENDER_DOMAIN); + assertThat(incomingUftpMessage.sender().role()).isEqualTo(USEFRoleType.DSO); + assertThat(incomingUftpMessage.payloadMessage()).isSameAs(payloadMessage); + assertThat(incomingUftpMessage.signedMessageXml()).isEqualTo(TRANSPORT_XML); + assertThat(incomingUftpMessage.payloadMessageXml()).isEqualTo(PAYLOAD_XML); } } \ No newline at end of file