diff --git a/src/main/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepository.java b/src/main/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepository.java index 6f67093387f7da3b03953af445443fa875144686..39aac3396b11a2fb9ad29b6d03bd167b7b74071d 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepository.java +++ b/src/main/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepository.java @@ -1,7 +1,7 @@ package de.ozgcloud.xta.test.app.data; import java.time.Clock; -import java.time.LocalDateTime; +import java.time.ZonedDateTime; import java.util.HashMap; import java.util.Optional; @@ -42,7 +42,7 @@ public class XtaTransportReportRepository { return Optional.of(XtaTransportReport.builder() .messageMetaData(messageIdTomessageMetaData.get(messageId)) .status(messageIdToStatus.get(messageId)) - .reportTime(LocalDateTime.now(clock)) + .reportTime(ZonedDateTime.now(clock)) .build()); } return Optional.empty(); 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 86ef8153f60008df2201c6a098dc85df72fcb425..34f1fb2b318e8d40bfbd6bb34b3f31c90ac77105 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 @@ -26,19 +26,14 @@ public interface ExceptionMapper { String ERROR_CODE_MESSAGE_ID_UNKNOWN = "9070"; String ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION = "MessageID für den Account nicht bekannt"; - default InvalidMessageIDException createInvalidMessageIDException(String message) { + default InvalidMessageIDException createInvalidMessageIDException(String messageId, String clientIdentifierValue) { return new InvalidMessageIDException( - message, + "No message with messageID \"%s\" available for identifier \"%s\"." + .formatted(messageId, clientIdentifierValue), mapInvalidMessageIDExceptionType(ERROR_CODE_MESSAGE_ID_UNKNOWN, ERROR_CODE_MESSAGE_ID_UNKNOWN_DESCRIPTION) ); } - default InvalidMessageIDException createInvalidMessageIDException(String messageId, String clientIdentifierValue) { - return createInvalidMessageIDException( - "No message with messageID \"%s\" available for identifier \"%s\"." - .formatted(messageId, clientIdentifierValue)); - } - @Mapping(target = "errorCode", expression = "java( mapCodeFehlernummer(code, name) )") InvalidMessageIDExceptionType mapInvalidMessageIDExceptionType(String code, String name); diff --git a/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java b/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java index e070ac27ad8f41b7acfe0f38f32223634a562942..d3456fc16bdcc21ccb9de892a712266bb919efd2 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java +++ b/src/main/java/de/ozgcloud/xta/test/app/mapper/ResponseMapper.java @@ -2,8 +2,8 @@ package de.ozgcloud.xta.test.app.mapper; import java.io.File; import java.math.BigInteger; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; +import java.time.ZonedDateTime; +import java.util.GregorianCalendar; import java.util.List; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; @@ -116,13 +116,13 @@ public interface ResponseMapper { @SneakyThrows default XMLGregorianCalendar createNowXmlGregorianCalendar() { - return mapXmlGregorianCalendarFromLocalDateTime(LocalDateTime.now()); + return mapXmlGregorianCalendarFromZonedDateTime(ZonedDateTime.now()); } @SneakyThrows - default XMLGregorianCalendar mapXmlGregorianCalendarFromLocalDateTime(LocalDateTime localDateTime) { - var isoTimeString = DateTimeFormatter.ISO_DATE_TIME.format(localDateTime); - return DatatypeFactory.newInstance().newXMLGregorianCalendar(isoTimeString); + default XMLGregorianCalendar mapXmlGregorianCalendarFromZonedDateTime(ZonedDateTime zonedDateTime) { + GregorianCalendar gregorianCalendar = GregorianCalendar.from(zonedDateTime); + return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar); } @Mapping(target = "itemsPending", expression = "java( BigInteger.ZERO )") diff --git a/src/main/java/de/ozgcloud/xta/test/app/model/XtaTransportReport.java b/src/main/java/de/ozgcloud/xta/test/app/model/XtaTransportReport.java index 2c5fe2b5d5e96e1ea256199a83e7b09ad35f61e0..af9d76a2be7a71baa43241117f563c7adcc82a98 100644 --- a/src/main/java/de/ozgcloud/xta/test/app/model/XtaTransportReport.java +++ b/src/main/java/de/ozgcloud/xta/test/app/model/XtaTransportReport.java @@ -1,6 +1,6 @@ package de.ozgcloud.xta.test.app.model; -import java.time.LocalDateTime; +import java.time.ZonedDateTime; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; @@ -9,7 +9,7 @@ import lombok.Builder; @Builder public record XtaTransportReport( @Valid XtaMessageMetaData messageMetaData, - @NotNull LocalDateTime reportTime, + @NotNull ZonedDateTime reportTime, @NotNull MessageStatus status) { public enum MessageStatus { diff --git a/src/test/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepositoryTest.java b/src/test/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepositoryTest.java index cc20e5c0c8c5b99f21598ee5019155d84333a7df..0805e0c98c532be89484fbcd26fc20fcecedf2ce 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepositoryTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/data/XtaTransportReportRepositoryTest.java @@ -1,43 +1,32 @@ package de.ozgcloud.xta.test.app.data; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; import java.time.Clock; import java.time.Instant; -import java.time.LocalDateTime; +import java.time.ZonedDateTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; import de.ozgcloud.xta.test.app.factory.XtaMessageMetaDataTestFactory; import de.ozgcloud.xta.test.app.model.XtaMessageMetaData; import de.ozgcloud.xta.test.app.model.XtaTransportReport; public class XtaTransportReportRepositoryTest { + @InjectMocks private XtaTransportReportRepository repository; + @Mock private Clock clock; private final XtaMessageMetaData messageMetaData = XtaMessageMetaDataTestFactory.create(); - @BeforeEach - void beforeEach() { - clock = Clock.fixed(Instant.now(), Clock.systemDefaultZone().getZone()); - repository = new XtaTransportReportRepository(clock); - } - @Nested class Add{ - @Test - void shouldAddTransportReport() { - repository.add(messageMetaData); - - var result = repository.get(messageMetaData.messageId()); - - assertThat(result).isPresent(); - assertThat(result.get().messageMetaData()).isEqualTo(messageMetaData); - } - @Test void shouldReturnTrue() { var result = repository.add(messageMetaData); @@ -57,39 +46,62 @@ public class XtaTransportReportRepositoryTest { @Nested class Get { + @Nested + class WithExistingMessageId { + @BeforeEach + void beforeEach() { + mockClock(); + } - @Test - void shouldReturnEmpty() { - var result = repository.get(messageMetaData.messageId()); + @Test + void shouldReturnReport() { + repository.add(messageMetaData); - assertThat(result).isEmpty(); - } + var result = repository.get(messageMetaData.messageId()); - @Test - void shouldSetStatusOffen() { - repository.add(messageMetaData); + assertThat(result).isPresent(); + assertThat(result.get().messageMetaData()).isEqualTo(messageMetaData); + } - var result = repository.get(messageMetaData.messageId()); + @Test + void shouldSetReportTimeNow() { + repository.add(messageMetaData); - assertThat(result).isPresent(); - assertThat(result.get().status()).isEqualTo(XtaTransportReport.MessageStatus.OFFEN); - } + var result = repository.get(messageMetaData.messageId()); - @Test - void shouldSetReportTimeNow() { - repository.add(messageMetaData); + assertThat(result).isPresent(); + assertThat(result.get().reportTime()).isEqualTo(ZonedDateTime.now(clock)); + } - var result = repository.get(messageMetaData.messageId()); - assertThat(result).isPresent(); - assertThat(result.get().reportTime()).isEqualTo(LocalDateTime.now(clock)); + @Test + void shouldSetStatusOffen() { + repository.add(messageMetaData); + + var result = repository.get(messageMetaData.messageId()); + + assertThat(result).isPresent(); + assertThat(result.get().status()).isEqualTo(XtaTransportReport.MessageStatus.OFFEN); + } } + + @Nested + class WithMissingMessageId { + @Test + void shouldReturnEmpty() { + var result = repository.get(messageMetaData.messageId()); + + assertThat(result).isEmpty(); + } + } + } @Nested class SetClosedStatus { @Test void shouldSetClosedStatus() { + mockClock(); repository.add(messageMetaData); repository.setClosedStatus(messageMetaData.messageId()); @@ -115,4 +127,9 @@ public class XtaTransportReportRepositoryTest { assertThat(result).isFalse(); } } + + private void mockClock() { + when(clock.instant()).thenReturn(Instant.now()); + when(clock.getZone()).thenReturn(Clock.systemDefaultZone().getZone()); + } } 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 e032487ea01b288c8dbcfc5d3b6000091476ad7b..8155892407ee3e270170ca020b48b52adcb04031 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 @@ -19,14 +19,15 @@ class ExceptionMapperTest { @DisplayName("create invalid message id exception") @Nested class TestCreateInvalidMessageIdException { - private final String exceptionMessage = "test message"; + private static final String MESSAGE_ID = "messageid:test"; + private static final String IDENTIFIER = "Author"; - @DisplayName("should map message") + @DisplayName("should map message id and identifier to message") @Test void shouldMapMessage() { var result = createException(); - assertThat(result.getMessage()).isEqualTo(exceptionMessage); + assertThat(result.getMessage()).isEqualTo("No message with messageID \"messageid:test\" available for identifier \"Author\"."); } @DisplayName("should map error code") @@ -39,15 +40,7 @@ class ExceptionMapperTest { } private InvalidMessageIDException createException() { - return mapper.createInvalidMessageIDException(exceptionMessage); - } - - @DisplayName("should map message id and identifier to message") - @Test - void shouldMapMessageIdAndIdentifier() { - var result = mapper.createInvalidMessageIDException("id-1234", "identifier-5678"); - - assertThat(result.getMessage()).isEqualTo("No message with messageID \"id-1234\" available for identifier \"identifier-5678\"."); + return mapper.createInvalidMessageIDException(MESSAGE_ID, IDENTIFIER); } } diff --git a/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java b/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java index 59595411fe9674228f2f4b167bed53f0d573b0a5..4a2a5709f3ede5baa3d9a6d3fdae46d1c4887fae 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/mapper/ResponseMapperTest.java @@ -9,9 +9,8 @@ import static org.assertj.core.api.Assertions.assertThat; import java.math.BigInteger; import java.nio.charset.StandardCharsets; -import java.time.LocalDateTime; +import java.time.ZonedDateTime; import java.util.List; -import javax.xml.datatype.DatatypeConstants; import genv3.de.xoev.transport.xta.x211.ContentType; import genv3.de.xoev.transport.xta.x211.LookupServiceResponse; @@ -492,12 +491,12 @@ public class ResponseMapperTest { @Nested class TestMapTransportReport { private XtaMessageMetaData xtaMessageMetaData; - private LocalDateTime reportTime; + private ZonedDateTime reportTime; @BeforeEach void beforeEach() { xtaMessageMetaData = XtaMessageMetaDataTestFactory.create(); - reportTime = LocalDateTime.now(); + reportTime = ZonedDateTime.now(); } @DisplayName("should map message meta data") @@ -522,7 +521,7 @@ public class ResponseMapperTest { void shouldMapReportTime() { var result = doMapping(); - assertThat(result.getReportTime()).isEqualTo(mapper.mapXmlGregorianCalendarFromLocalDateTime(reportTime)); + assertThat(result.getReportTime()).isEqualTo(mapper.mapXmlGregorianCalendarFromZonedDateTime(reportTime)); } @DisplayName("should set server identity") @@ -549,26 +548,20 @@ public class ResponseMapperTest { @DisplayName("map XmlGregorianCalendar from LocalDateTime") @Nested class TestMapXmlGregorianCalendarFromLocalDateTime { - private LocalDateTime localDateTime; + private ZonedDateTime zonedDateTime; + private static final String ISO_TIME_STRING = "2007-12-03T10:15:30.000Z"; @BeforeEach void beforeEach() { - localDateTime = LocalDateTime.parse("2007-12-03T10:15:30"); + zonedDateTime = ZonedDateTime.parse(ISO_TIME_STRING); } - @DisplayName("should map xml gregorian calendar from local date time") + @DisplayName("should map xml gregorian calendar from zoned date time") @Test void shouldMapXmlGregorianCalendarFromLocalDateTime() { - var result = mapper.mapXmlGregorianCalendarFromLocalDateTime(localDateTime); - - assertThat(result.getDay()).isEqualTo(3); - assertThat(result.getMonth()).isEqualTo(12); - assertThat(result.getYear()).isEqualTo(2007); - assertThat(result.getEon() == null || result.getEon().equals(BigInteger.ZERO)).isTrue(); - assertThat(result.getHour()).isEqualTo(10); - assertThat(result.getMinute()).isEqualTo(15); - assertThat(result.getSecond()).isEqualTo(30); - assertThat(result.getTimezone()).isEqualTo(DatatypeConstants.FIELD_UNDEFINED); + var result = mapper.mapXmlGregorianCalendarFromZonedDateTime(zonedDateTime); + + assertThat(result.toXMLFormat()).isEqualTo(ISO_TIME_STRING); } } } diff --git a/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java b/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java index e4daf69633fd66f8588772d1c95897d7804dda92..ff75022fd71553d543e318141972ab35824ba3a6 100644 --- a/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java +++ b/src/test/java/de/ozgcloud/xta/test/app/service/XtaMessageServiceTest.java @@ -164,7 +164,34 @@ public class XtaMessageServiceTest { @DisplayName("is author or reader of message") @Nested class TestIsAuthorOrReaderOfMessage { + @Test + void shouldUseIsAuthorOrReaderOfMessageMetaData() { + var message = XtaMessageTestFactory.create(MESSAGE_ID_1); + + service.isAuthorOrReaderOfMessage(READER_IDENTIFIER.value()).test(message); + verify(service).isAuthorOrReaderOfMessageMetadata(READER_IDENTIFIER.value()); + } + } + + @DisplayName("is author or reader of transport report") + @Nested + class TestIsAuthorOrReaderOfTransportReport { + @Test + void shouldUseIsAuthorOrReaderOfMessageMetaData() { + var transportReport = XtaTransportReport.builder() + .messageMetaData(XtaMessageMetaDataTestFactory.create(MESSAGE_ID_1)) + .build(); + + service.isAuthorOrReaderOfTransportReport(READER_IDENTIFIER.value()).test(transportReport); + + verify(service).isAuthorOrReaderOfMessageMetadata(READER_IDENTIFIER.value()); + } + } + + @DisplayName("is author or reader of message metadata") + @Nested + class TestIsAuthorOrReaderOfMessageMetaData { @DisplayName("should return true if reader identifier value matches") @Test void shouldReturnTrueIfReaderIdentifierValueMatches() { @@ -215,6 +242,7 @@ public class XtaMessageServiceTest { assertThat(result).isEqualTo(deleted); } + @DisplayName("should set transport status to closed") @Test void shouldSetTransportReportClosedStatus() { var request = XtaCloseRequestTestFactory.create();