From 29c6d94fa9cce04c865b88f1f1b492d9181781f3 Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Fri, 6 Sep 2024 09:59:23 +0200
Subject: [PATCH] OZG-6239 sendMessage: Use validator

---
 .../xta/test/app/mapper/ExceptionMapper.java  |  12 ++
 .../xta/test/app/model/XtaConstants.java      |   2 +-
 .../xta/test/app/server/SendXtaPortImpl.java  | 114 ++++++++----------
 .../test/app/service/XtaMessageService.java   |   3 +-
 .../test/app/validation/RequestValidator.java |   6 +-
 .../test/app/mapper/ExceptionMapperTest.java  |  94 +++++++++------
 .../test/app/server/SendXtaPortImplTest.java  | 102 +++++++++-------
 7 files changed, 184 insertions(+), 149 deletions(-)

diff --git a/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java b/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java
index 6f0763f..afcf35c 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapper.java
@@ -9,6 +9,8 @@ import org.mapstruct.ReportingPolicy;
 import genv3.de.xoev.transport.xta.x211.CodeFehlernummer;
 import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException;
 import genv3.de.xoev.transport.xta.x211.InvalidMessageIDExceptionType;
+import genv3.de.xoev.transport.xta.x211.ParameterIsNotValidException;
+import genv3.de.xoev.transport.xta.x211.ParameterIsNotValidExceptionType;
 import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
 import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemExceptionType;
 
@@ -37,6 +39,16 @@ public interface ExceptionMapper {
 	@Mapping(target = "errorCode", expression = "java( mapCodeFehlernummer(code, name) )")
 	XTAWSTechnicalProblemExceptionType mapXTAWSTechnicalProblemExceptionType(String code, String name);
 
+	default ParameterIsNotValidException createParameterIsNotValidException(String message) {
+		return new ParameterIsNotValidException(
+				message,
+				mapParameterIsNotValidExceptionType(ERROR_CODE_PARAMETER_MISSING, ERROR_CODE_PARAMETER_MISSING_DESCRIPTION)
+		);
+	}
+
+	@Mapping(target = "errorCode", expression = "java( mapCodeFehlernummer(code, name) )")
+	ParameterIsNotValidExceptionType mapParameterIsNotValidExceptionType(String code, String name);
+
 	@Mapping(target = "listURI", constant = ERROR_CODE_LIST_URN)
 	@Mapping(target = "listVersionID", constant = ERROR_CODE_LIST_VERSION)
 	CodeFehlernummer mapCodeFehlernummer(String code, String name);
diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java
index 7aa512d..ce88d0e 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaConstants.java
@@ -71,7 +71,7 @@ public class XtaConstants {
 	public static final String ERROR_CODE_LIST_URN = "urn:de:xta:webservice:codeliste:fehlernummer";
 	public static final String ERROR_CODE_LIST_VERSION = "2.0.0";
 	public static final String ERROR_CODE_PARAMETER_MISSING = "9020";
-	public static final String ERROR_CODE_PARAMETER_MISSING_DESCRIPTION = "Keine Parameter vorhanden";
+	public static final String ERROR_CODE_PARAMETER_MISSING_DESCRIPTION = "Notwendige Parameter nicht vorhanden";
 	public static final String ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM = "9030";
 	public static final String ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM_DESCRIPTION = "Interner Fehler beim XTA-Server bzw. XTA-Dienstleister";
 	public static final String ERROR_CODE_MESSAGE_ID_UNKNOWN = "9070";
diff --git a/src/main/java/de/ozgcloud/xta/test/app/server/SendXtaPortImpl.java b/src/main/java/de/ozgcloud/xta/test/app/server/SendXtaPortImpl.java
index f2be49e..81832a0 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/server/SendXtaPortImpl.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/server/SendXtaPortImpl.java
@@ -1,19 +1,23 @@
 package de.ozgcloud.xta.test.app.server;
 
-import static de.ozgcloud.xta.test.app.model.XtaConstants.*;
-
-import de.ozgcloud.xta.test.app.mapper.RequestMapper;
+import jakarta.jws.WebService;
 
-import genv3.de.xoev.transport.xta.x211.*;
-import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
-import lombok.RequiredArgsConstructor;
 import org.apache.cxf.annotations.SchemaValidation;
 import org.springframework.stereotype.Component;
 
-import de.ozgcloud.xta.test.app.service.ParameterValidatorService;
+import de.ozgcloud.xta.test.app.mapper.ExceptionMapper;
+import de.ozgcloud.xta.test.app.mapper.RequestMapper;
 import de.ozgcloud.xta.test.app.service.XtaMessageService;
-
-import jakarta.jws.WebService;
+import de.ozgcloud.xta.test.app.validation.RequestValidator;
+import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
+import genv3.de.xoev.transport.xta.x211.MessageSchemaViolationException;
+import genv3.de.xoev.transport.xta.x211.MessageVirusDetectionException;
+import genv3.de.xoev.transport.xta.x211.ParameterIsNotValidException;
+import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
+import genv3.de.xoev.transport.xta.x211.SendPortType;
+import genv3.de.xoev.transport.xta.x211.SyncAsyncException;
+import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
 @WebService(serviceName = "XTAService", portName = "SendXtaPort", targetNamespace = "http://xoev.de/transport/xta/211", wsdlLocation = "classpath:wsdl/XTA.wsdl", endpointInterface = "genv3.de.xoev.transport.xta.x211.SendPortType")
@@ -23,63 +27,47 @@ import lombok.extern.log4j.Log4j2;
 @Log4j2
 public class SendXtaPortImpl implements SendPortType {
 
-    private final ParameterValidatorService validator;
-
-    private final RequestMapper requestMapper;
-    private final XtaMessageService xtaMessageService;
-
-    /*
-     * (non-Javadoc)
-     * @see genv3.de.xoev.transport.xta.x211.SendPortType#sendMessage(genv3.de.xoev.transport.xta.x211.
-     * GenericContentContainer genericContainer, genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData messageMetaData,
-     * genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType x509TokenContainer)*
-     */
-    @Override
-    public void sendMessage(final GenericContentContainer genericContainer,
-            final genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData messageMetaData,
-            final genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType x509TokenContainer)
-            throws SyncAsyncException, XTAWSTechnicalProblemException, MessageVirusDetectionException,
-            MessageSchemaViolationException, PermissionDeniedException, ParameterIsNotValidException {
-        log.info("Executing operation sendMessage");
-        if (messageMetaData == null) {
-			log.error("Die erforderliche Header Variable 'messageMetaData' wurde nicht gefunden");
-            return;
-        }
-        validateMessageId(messageMetaData);
-        validator.checkMessage(genericContainer);
+	private final RequestValidator validator;
 
-        xtaMessageService.sendMessage(requestMapper.mapXtaMessageFromGenericContentContainer(genericContainer, messageMetaData));
-    }
+	private final RequestMapper requestMapper;
+	private final ExceptionMapper exceptionMapper;
+	private final XtaMessageService xtaMessageService;
 
-    public void validateMessageId(MessageMetaData messageMetaData) throws ParameterIsNotValidException {
-        if (messageMetaData.getMsgIdentification() == null || messageMetaData.getMsgIdentification().getMessageID() == null) {
-            throw buildParameterIsNotValidException("Message ID is missing");
-        }
-    }
+	/*
+	 * (non-Javadoc)
+	 * @see genv3.de.xoev.transport.xta.x211.SendPortType#sendMessage(genv3.de.xoev.transport.xta.x211.
+	 * GenericContentContainer genericContainer, genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData messageMetaData,
+	 * genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType x509TokenContainer)*
+	 */
+	@Override
+	public void sendMessage(final GenericContentContainer genericContainer,
+			final genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData messageMetaData,
+			final genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType x509TokenContainer)
+			throws SyncAsyncException, XTAWSTechnicalProblemException, MessageVirusDetectionException,
+			MessageSchemaViolationException, PermissionDeniedException, ParameterIsNotValidException {
+		log.info("Executing operation sendMessage");
+		var request = requestMapper.mapXtaMessageFromGenericContentContainer(genericContainer, messageMetaData);
+		validator.validate(request);
 
-    /*
-     * (non-Javadoc)
-     * @see genv3.de.xoev.transport.xta.x211.SendPortType#sendMessageSync(genv3.de.xoev.transport.xta.x211.
-     * GenericContentContainer genericContainer, genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData messageMetaData,
-     * genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType x509TokenContainer)*
-     */
-    @Override
-    public void sendMessageSync(final jakarta.xml.ws.Holder<GenericContentContainer> genericContainer,
-            final jakarta.xml.ws.Holder<genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData> messageMetaData,
-            final jakarta.xml.ws.Holder<genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType> x509TokenContainer)
-            throws SyncAsyncException, XTAWSTechnicalProblemException, MessageVirusDetectionException,
-            MessageSchemaViolationException, PermissionDeniedException, ParameterIsNotValidException {
-        log.info("Executing operation sendMessageSync");
-        throw new UnsupportedOperationException("sendMessageSync is not supported");
-    }
+		if (!xtaMessageService.sendMessage(request)) {
+			throw exceptionMapper.createParameterIsNotValidException("Failed to send message");
+		}
+	}
 
-    private ParameterIsNotValidException buildParameterIsNotValidException(String message) {
-        var faultInfo = new ParameterIsNotValidExceptionType();
-        faultInfo.getErrorCode().setCode(ERROR_CODE_PARAMETER_MISSING);
-        faultInfo.getErrorCode().setName(ERROR_CODE_PARAMETER_MISSING_DESCRIPTION);
-        faultInfo.getErrorCode().setListURI(ERROR_CODE_LIST_URN);
-        faultInfo.getErrorCode().setListVersionID(ERROR_CODE_LIST_VERSION);
-        return new ParameterIsNotValidException(message, faultInfo);
-    }
+	/*
+	 * (non-Javadoc)
+	 * @see genv3.de.xoev.transport.xta.x211.SendPortType#sendMessageSync(genv3.de.xoev.transport.xta.x211.
+	 * GenericContentContainer genericContainer, genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData messageMetaData,
+	 * genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType x509TokenContainer)*
+	 */
+	@Override
+	public void sendMessageSync(final jakarta.xml.ws.Holder<GenericContentContainer> genericContainer,
+			final jakarta.xml.ws.Holder<genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData> messageMetaData,
+			final jakarta.xml.ws.Holder<genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType> x509TokenContainer)
+			throws SyncAsyncException, XTAWSTechnicalProblemException, MessageVirusDetectionException,
+			MessageSchemaViolationException, PermissionDeniedException, ParameterIsNotValidException {
+		log.info("Executing operation sendMessageSync");
+		throw new UnsupportedOperationException("sendMessageSync is not supported");
+	}
 
 }
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 f6fa061..eca4f2f 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
@@ -20,8 +20,9 @@ import lombok.RequiredArgsConstructor;
 public class XtaMessageService {
 	private final XtaMessageRepository messageRepository;
 
-	public void sendMessage(XtaMessage message) {
+	public boolean sendMessage(XtaMessage message) {
 		messageRepository.save(message);
+		return true;
 	}
 
 	public XtaMessageMetaDataListing getStatusList(XtaMessageMetaDataListingRequest listingRequest) {
diff --git a/src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java b/src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java
index 7d1b71f..3474a64 100644
--- a/src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java
+++ b/src/main/java/de/ozgcloud/xta/test/app/validation/RequestValidator.java
@@ -4,6 +4,7 @@ import java.util.Collection;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import jakarta.annotation.Nullable;
 import jakarta.validation.ConstraintViolation;
 import jakarta.validation.Validation;
 import jakarta.validation.Validator;
@@ -28,7 +29,10 @@ public class RequestValidator {
 
 	private final ExceptionMapper exceptionMapper;
 
-	public <T> void validate(T request) throws XTAWSTechnicalProblemException {
+	public <T> void validate(@Nullable T request) throws XTAWSTechnicalProblemException {
+		if (request == null) {
+			throw exceptionMapper.createTechnicalProblemException("Request is invalid: null");
+		}
 		validate(request, violations ->
 				exceptionMapper.createTechnicalProblemException("Request is invalid:\n" + getViolationsDescription(violations))
 		);
diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java
index deb7a4d..573cd77 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/ExceptionMapperTest.java
@@ -8,8 +8,8 @@ import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mapstruct.factory.Mappers;
 
-import genv3.de.xoev.transport.xta.x211.CodeFehlernummer;
 import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException;
+import genv3.de.xoev.transport.xta.x211.ParameterIsNotValidException;
 import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
 
 class ExceptionMapperTest {
@@ -32,47 +32,49 @@ class ExceptionMapperTest {
 		@DisplayName("should map error code")
 		@Test
 		void shouldMapErrorCode() {
-			var result = createExceptionErrorCode();
+			var result = createException().getFaultInfo().getErrorCode();
 
-			assertThat(result.getCode()).isEqualTo(ERROR_CODE_MESSAGE_ID_UNKNOWN);
+			assertThat(result).usingRecursiveComparison()
+					.isEqualTo(mapper.mapCodeFehlernummer(ERROR_CODE_MESSAGE_ID_UNKNOWN, ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION));
 		}
 
-		@DisplayName("should map error name")
-		@Test
-		void shouldMapErrorName() {
-			var result = createExceptionErrorCode();
-
-			assertThat(result.getName()).isEqualTo(ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION);
+		private InvalidMessageIDException createException() {
+			return mapper.createInvalidMessageIDException(exceptionMessage);
 		}
 
-		@DisplayName("should map list uri")
+	}
+
+	@DisplayName("create technical problem exception")
+	@Nested
+	class TestCreateTechnicalProblemException {
+		private final String exceptionMessage = "test message";
+
+		@DisplayName("should map message")
 		@Test
-		void shouldMapListUri() {
-			var result = createExceptionErrorCode();
+		void shouldMapMessage() {
+			var result = createException();
 
-			assertThat(result.getListURI()).isEqualTo(ERROR_CODE_LIST_URN);
+			assertThat(result.getMessage()).isEqualTo(exceptionMessage);
 		}
 
-		@DisplayName("should map list version id")
+		@DisplayName("should map error code")
 		@Test
-		void shouldMapListVersionId() {
-			var result = createExceptionErrorCode();
+		void shouldMapErrorCode() {
+			var result = createException().getFaultInfo().getErrorCode();
 
-			assertThat(result.getListVersionID()).isEqualTo(ERROR_CODE_LIST_VERSION);
+			assertThat(result).usingRecursiveComparison()
+					.isEqualTo(mapper.mapCodeFehlernummer(ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM, ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM_DESCRIPTION));
 		}
 
-		private InvalidMessageIDException createException() {
-			return mapper.createInvalidMessageIDException(exceptionMessage);
+		private XTAWSTechnicalProblemException createException() {
+			return mapper.createTechnicalProblemException(exceptionMessage);
 		}
 
-		private CodeFehlernummer createExceptionErrorCode() {
-			return createException().getFaultInfo().getErrorCode();
-		}
 	}
 
-	@DisplayName("create technical problem exception")
+	@DisplayName("create parameter is not valid exception")
 	@Nested
-	class TestCreateTechnicalProblemException {
+	class TestCreateParameterIsNotValidException {
 		private final String exceptionMessage = "test message";
 
 		@DisplayName("should map message")
@@ -86,23 +88,43 @@ class ExceptionMapperTest {
 		@DisplayName("should map error code")
 		@Test
 		void shouldMapErrorCode() {
-			var result = createExceptionErrorCode();
+			var result = createException().getFaultInfo().getErrorCode();
+
+			assertThat(result).usingRecursiveComparison()
+					.isEqualTo(mapper.mapCodeFehlernummer(ERROR_CODE_PARAMETER_MISSING, ERROR_CODE_PARAMETER_MISSING_DESCRIPTION));
+		}
+
+		private ParameterIsNotValidException createException() {
+			return mapper.createParameterIsNotValidException(exceptionMessage);
+		}
+	}
+
+	@DisplayName("map code error")
+	@Nested
+	class TestMapCodeError {
+		private final String code = "test code";
+		private final String name = "test name";
 
-			assertThat(result.getCode()).isEqualTo(ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM);
+		@DisplayName("should map code")
+		@Test
+		void shouldMapCode() {
+			var result = mapper.mapCodeFehlernummer(code, name);
+
+			assertThat(result.getCode()).isEqualTo(code);
 		}
 
-		@DisplayName("should map error name")
+		@DisplayName("should map name")
 		@Test
-		void shouldMapErrorName() {
-			var result = createExceptionErrorCode();
+		void shouldMapName() {
+			var result = mapper.mapCodeFehlernummer(code, name);
 
-			assertThat(result.getName()).isEqualTo(ERROR_CODE_INTERNAL_TECHNICAL_PROBLEM_DESCRIPTION);
+			assertThat(result.getName()).isEqualTo(name);
 		}
 
 		@DisplayName("should map list uri")
 		@Test
 		void shouldMapListUri() {
-			var result = createExceptionErrorCode();
+			var result = mapper.mapCodeFehlernummer(code, name);
 
 			assertThat(result.getListURI()).isEqualTo(ERROR_CODE_LIST_URN);
 		}
@@ -110,17 +132,9 @@ class ExceptionMapperTest {
 		@DisplayName("should map list version id")
 		@Test
 		void shouldMapListVersionId() {
-			var result = createExceptionErrorCode();
+			var result = mapper.mapCodeFehlernummer(code, name);
 
 			assertThat(result.getListVersionID()).isEqualTo(ERROR_CODE_LIST_VERSION);
 		}
-
-		private XTAWSTechnicalProblemException createException() {
-			return mapper.createTechnicalProblemException(exceptionMessage);
-		}
-
-		private CodeFehlernummer createExceptionErrorCode() {
-			return createException().getFaultInfo().getErrorCode();
-		}
 	}
 }
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/xta/test/app/server/SendXtaPortImplTest.java b/src/test/java/de/ozgcloud/xta/test/app/server/SendXtaPortImplTest.java
index 4b47d2d..b78c339 100644
--- a/src/test/java/de/ozgcloud/xta/test/app/server/SendXtaPortImplTest.java
+++ b/src/test/java/de/ozgcloud/xta/test/app/server/SendXtaPortImplTest.java
@@ -1,15 +1,9 @@
 package de.ozgcloud.xta.test.app.server;
 
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.assertj.core.api.Assertions.assertThatNoException;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.verify;
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
 
-import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
-import genv3.de.xoev.transport.xta.x211.ParameterIsNotValidException;
-import genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType;
-import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
-import org.assertj.core.api.Condition;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
@@ -18,67 +12,89 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
-import de.ozgcloud.xta.test.app.factory.GenericContentContainerTestFactory;
-import de.ozgcloud.xta.test.app.factory.MessageMetaDataTestFactory;
+import de.ozgcloud.xta.test.app.mapper.ExceptionMapper;
 import de.ozgcloud.xta.test.app.mapper.RequestMapper;
-import de.ozgcloud.xta.test.app.service.ParameterValidatorService;
+import de.ozgcloud.xta.test.app.model.XtaMessage;
 import de.ozgcloud.xta.test.app.service.XtaMessageService;
+import de.ozgcloud.xta.test.app.validation.RequestValidator;
+import genv3.de.xoev.transport.xta.x211.GenericContentContainer;
+import genv3.de.xoev.transport.xta.x211.ParameterIsNotValidException;
+import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
+import genv3.eu.osci.ws.x2008.x05.transport.X509TokenContainerType;
+import genv3.eu.osci.ws.x2014.x10.transport.MessageMetaData;
+import lombok.SneakyThrows;
 
 public class SendXtaPortImplTest {
 	@Spy
-	private ParameterValidatorService validator;
-	@Spy
+	@InjectMocks
+	private SendXtaPortImpl sendXtaPortImpl;
+	@Mock
+	private RequestValidator requestValidator;
+	@Mock
 	private RequestMapper requestMapper;
 	@Mock
 	private XtaMessageService xtaMessageService;
-	@Spy @InjectMocks
-	private SendXtaPortImpl sendXtaPortImpl;
+	@Mock
+	private ExceptionMapper exceptionMapper;
 
+	@DisplayName("send message")
 	@Nested
-	class SendMessage {
-
+	class TestSendMessage {
+		@Mock
 		private GenericContentContainer genericContainer;
+		@Mock
 		private MessageMetaData messageMetaData;
 		@Mock
 		private X509TokenContainerType x509TokenContainer;
 
+		private ParameterIsNotValidException parameterIsNotValidException;
+
+		private XTAWSTechnicalProblemException technicalProblemException;
+
+		@Mock
+		private XtaMessage xtaMessage;
+
 		@BeforeEach
-		void beforeEach() {
-			genericContainer = GenericContentContainerTestFactory.create();
-			messageMetaData = MessageMetaDataTestFactory.create();
+		void mock() {
+			parameterIsNotValidException = new ParameterIsNotValidException();
+			technicalProblemException = new XTAWSTechnicalProblemException();
+			when(requestMapper.mapXtaMessageFromGenericContentContainer(genericContainer, messageMetaData)).thenReturn(xtaMessage);
 		}
 
-		@DisplayName("Should accept valid request")
+		@DisplayName("should return")
 		@Test
-		void shouldAcceptValidRequest() {
-			assertThatNoException().isThrownBy(() -> sendXtaPortImpl.sendMessage(genericContainer, messageMetaData, x509TokenContainer));
+		@SneakyThrows
+		void shouldSendMessage() {
+			when(xtaMessageService.sendMessage(xtaMessage)).thenReturn(true);
+
+			sendMessage();
 		}
 
-		@DisplayName("Should send message to XTA message service")
+		@DisplayName("should throw if send fails")
 		@Test
-		void shouldSendMessageToXtaMessageService() {
-			try{
-				sendXtaPortImpl.sendMessage(genericContainer, messageMetaData, x509TokenContainer);
-			} catch (Exception e) {
-				// ignore
-			}
-
-			verify(xtaMessageService).sendMessage(any());
+		void shouldThrowIfSendFails() {
+			when(xtaMessageService.sendMessage(xtaMessage)).thenReturn(false);
+			when(exceptionMapper.createParameterIsNotValidException(any())).thenReturn(parameterIsNotValidException);
+
+			assertThatThrownBy(this::sendMessage)
+					.isEqualTo(parameterIsNotValidException);
 		}
 
-		@DisplayName("Should reject request without message ID")
+		@DisplayName("should validate request")
 		@Test
-		void shouldRejectRequestWithoutMessageId() {
-			messageMetaData.getMsgIdentification().setMessageID(null);
+		@SneakyThrows
+		void shouldValidateRequest() {
+			doThrow(technicalProblemException).when(requestValidator).validate(xtaMessage);
 
-			assertThatExceptionOfType(ParameterIsNotValidException.class).isThrownBy(
-					() -> sendXtaPortImpl.sendMessage(genericContainer, messageMetaData, x509TokenContainer))
-					.withMessage("Message ID is missing")
-					.has(parameterIsMissingExceptionCondition());
+			assertThatThrownBy(this::sendMessage)
+					.isEqualTo(technicalProblemException);
+		}
+
+		@SneakyThrows
+		private void sendMessage() {
+			sendXtaPortImpl.sendMessage(genericContainer, messageMetaData, x509TokenContainer);
 		}
-	}
 
-	private Condition<ParameterIsNotValidException> parameterIsMissingExceptionCondition() {
-		return new Condition<>(e -> e.getFaultInfo().getErrorCode().getCode().equals("9020"), "error code 9020 for missing parameter");
 	}
+
 }
-- 
GitLab