From 2d47b01bcce160faf557e5f20c6cc7e13881785c Mon Sep 17 00:00:00 2001 From: Pieter Van Eeckhout Date: Mon, 25 Mar 2024 01:42:27 +0100 Subject: [PATCH] 159 fix issue when journaldocked message is missing landing pad info (#160) * #159 Refactor MybatisStationEntityMapper and expand tests The method 'getLandingPads' in 'MybatisStationEntityMapper.java' was refactored to improve functionality when mapping landing pad sizes. A new private method 'filterLandingPads' was added for handling empty landing pad maps. Additionally, tests were expanded in 'MybatisStationEntityMapperTest.java' to cover conditions when station landing pads are empty or null. * #159 Add null-check to landingPadSizeFromPayload method The 'landingPadSizeFromPayload()' method in 'ReceiveJournalDockedService.java' has been updated to handle possibly null landing pads with the help of Optional. An Optional.ofNullable has been added to elegantly handle any potential null values of the payload's landing pads. This offers a more robust and foolproof way of mapping landing pad sizes. --- .../mapper/MybatisStationEntityMapper.java | 14 ++- .../service/ReceiveJournalDockedService.java | 12 ++- .../MybatisStationEntityMapperTest.java | 95 +++++++++++++++++++ 3 files changed, 112 insertions(+), 9 deletions(-) diff --git a/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/persistence/entity/mapper/MybatisStationEntityMapper.java b/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/persistence/entity/mapper/MybatisStationEntityMapper.java index f3d85c32..766be90a 100644 --- a/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/persistence/entity/mapper/MybatisStationEntityMapper.java +++ b/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/persistence/entity/mapper/MybatisStationEntityMapper.java @@ -16,10 +16,16 @@ public class MybatisStationEntityMapper { private final MybatisSystemEntityMapper systemEntityMapper; private static Map getLandingPads(Station station) { - return LandingPadSize.KNOWN_LANDING_PAD_SIZES.stream() - .collect(Collectors.toMap( - LandingPadSize::name, - landingPadSize -> station.landingPads().getOrDefault(landingPadSize, 0))); + return Optional.ofNullable(station.landingPads()) + .flatMap(MybatisStationEntityMapper::filterLandingPads) + .orElse(null); + } + + private static Optional> filterLandingPads(Map landingPads) { + Map filteredLandingPadsMap = landingPads.entrySet().stream() + .filter(entry -> LandingPadSize.KNOWN_LANDING_PAD_SIZES.contains(entry.getKey())) + .collect(Collectors.toMap(entry -> entry.getKey().name(), Map.Entry::getValue)); + return filteredLandingPadsMap.isEmpty() ? Optional.empty() : Optional.of(filteredLandingPadsMap); } private static Map getLandingPads(MybatisStationEntity stationEntity) { diff --git a/exploration-module/src/main/java/io/edpn/backend/exploration/application/service/ReceiveJournalDockedService.java b/exploration-module/src/main/java/io/edpn/backend/exploration/application/service/ReceiveJournalDockedService.java index 4a86c3a9..1b3fa36d 100644 --- a/exploration-module/src/main/java/io/edpn/backend/exploration/application/service/ReceiveJournalDockedService.java +++ b/exploration-module/src/main/java/io/edpn/backend/exploration/application/service/ReceiveJournalDockedService.java @@ -19,6 +19,7 @@ import java.time.LocalDateTime; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.stream.Collectors; @@ -65,11 +66,12 @@ private void createOrUpdateFromPayload(DockedMessage.V1.Payload payload, LocalDa } private Map landingPadSizeFromPayload(DockedMessage.V1.Payload payload) { - return Map.of( - LandingPadSize.LARGE, payload.landingPads().large(), - LandingPadSize.MEDIUM, payload.landingPads().medium(), - LandingPadSize.SMALL, payload.landingPads().small() - ); + return Optional.ofNullable(payload.landingPads()) + .map(landingPads -> Map.of( + LandingPadSize.LARGE, landingPads.large(), + LandingPadSize.MEDIUM, landingPads.medium(), + LandingPadSize.SMALL, landingPads.small() + )).orElse(null); } private Map stationEconomiesFromPayload(DockedMessage.V1.Payload payload) { diff --git a/exploration-module/src/test/java/io/edpn/backend/exploration/adapter/persistence/entity/mapper/MybatisStationEntityMapperTest.java b/exploration-module/src/test/java/io/edpn/backend/exploration/adapter/persistence/entity/mapper/MybatisStationEntityMapperTest.java index a9fdc2ec..e8bfb44d 100644 --- a/exploration-module/src/test/java/io/edpn/backend/exploration/adapter/persistence/entity/mapper/MybatisStationEntityMapperTest.java +++ b/exploration-module/src/test/java/io/edpn/backend/exploration/adapter/persistence/entity/mapper/MybatisStationEntityMapperTest.java @@ -128,6 +128,101 @@ public void testMap_givenStation_shouldReturnStationEntity() { MybatisStationEntity result = underTest.map(station); + assertThat(result.getId(), equalTo(station.id())); + assertThat(result.getMarketId(), equalTo(station.marketId())); + assertThat(result.getName(), equalTo(station.name())); + assertThat(result.getType(), equalTo(station.type())); + assertThat(result.getDistanceFromStar(), equalTo(station.distanceFromStar())); + assertThat(result.getSystem(), equalTo(systemEntity)); + assertThat(result.getLandingPads(), equalTo(expectedLandingPadSizes)); + assertThat(result.getEconomies(), equalTo(station.economies())); + assertThat(result.getServices(), equalTo(station.services())); + assertThat(result.getEconomy(), equalTo(station.economy())); + assertThat(result.getGovernment(), equalTo(station.government())); + assertThat(result.getOdyssey(), equalTo(station.odyssey())); + assertThat(result.getHorizons(), equalTo(station.horizons())); + assertThat(result.getUpdatedAt(), equalTo(station.updatedAt())); + } + @Test + public void testMap_givenStation_withEmptyLandingPads() { + UUID stationId = UUID.randomUUID(); + System system = mock(System.class); + MybatisSystemEntity systemEntity = mock(MybatisSystemEntity.class); + when(systemEntityMapper.map(any(System.class))).thenReturn(systemEntity); + Map expectedLandingPadSizes = null; + + Station station = new Station( + stationId, + 123L, + "stationName", + "Corriolis", + 1000.0, + system, + Map.of(), + Map.of( + "economy1", 0.1, + "economy2", 0.9 + ), + List.of("service1", "service2"), + "economy2", + "government", + true, + true, + LocalDateTime.of(2020, 1, 1, 0, 0, 0) + ); + + + MybatisStationEntity result = underTest.map(station); + + + assertThat(result.getId(), equalTo(station.id())); + assertThat(result.getMarketId(), equalTo(station.marketId())); + assertThat(result.getName(), equalTo(station.name())); + assertThat(result.getType(), equalTo(station.type())); + assertThat(result.getDistanceFromStar(), equalTo(station.distanceFromStar())); + assertThat(result.getSystem(), equalTo(systemEntity)); + assertThat(result.getLandingPads(), equalTo(expectedLandingPadSizes)); + assertThat(result.getEconomies(), equalTo(station.economies())); + assertThat(result.getServices(), equalTo(station.services())); + assertThat(result.getEconomy(), equalTo(station.economy())); + assertThat(result.getGovernment(), equalTo(station.government())); + assertThat(result.getOdyssey(), equalTo(station.odyssey())); + assertThat(result.getHorizons(), equalTo(station.horizons())); + assertThat(result.getUpdatedAt(), equalTo(station.updatedAt())); + } + + @Test + public void testMap_givenStation_withNullLandingPads() { + UUID stationId = UUID.randomUUID(); + System system = mock(System.class); + MybatisSystemEntity systemEntity = mock(MybatisSystemEntity.class); + when(systemEntityMapper.map(any(System.class))).thenReturn(systemEntity); + Map expectedLandingPadSizes = null; + + Station station = new Station( + stationId, + 123L, + "stationName", + "Corriolis", + 1000.0, + system, + null, + Map.of( + "economy1", 0.1, + "economy2", 0.9 + ), + List.of("service1", "service2"), + "economy2", + "government", + true, + true, + LocalDateTime.of(2020, 1, 1, 0, 0, 0) + ); + + + MybatisStationEntity result = underTest.map(station); + + assertThat(result.getId(), equalTo(station.id())); assertThat(result.getMarketId(), equalTo(station.marketId())); assertThat(result.getName(), equalTo(station.name()));