From 439c1560d8caa257581a72eab865a5814c2315e5 Mon Sep 17 00:00:00 2001 From: steam Date: Fri, 28 Feb 2020 18:28:03 +0100 Subject: [PATCH] DataService implementation is done and tested. The application is now working end-2-end --- .../satellite/service/DataServiceImpl.java | 38 +++++++- .../service/DataTransformationService.java | 7 +- .../service/DataServiceImplTest.java | 86 ++++++++++++++++++- .../DataTransformationServiceTest.java | 45 ++-------- .../testutil/FeaturesCollectionCreator.java | 43 ++++++++++ 5 files changed, 175 insertions(+), 44 deletions(-) create mode 100644 src/test/java/click/poweronoff/satellite/testutil/FeaturesCollectionCreator.java diff --git a/src/main/java/click/poweronoff/satellite/service/DataServiceImpl.java b/src/main/java/click/poweronoff/satellite/service/DataServiceImpl.java index 8bc6603..724b9f2 100644 --- a/src/main/java/click/poweronoff/satellite/service/DataServiceImpl.java +++ b/src/main/java/click/poweronoff/satellite/service/DataServiceImpl.java @@ -2,13 +2,18 @@ package click.poweronoff.satellite.service; import click.poweronoff.satellite.domain.Feature; import click.poweronoff.satellite.repository.JsonFileRepository; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.io.IOException; import java.util.List; import java.util.Optional; @Component +@AllArgsConstructor +@Slf4j public class DataServiceImpl implements DataService { @Autowired @@ -18,16 +23,43 @@ public class DataServiceImpl implements DataService { DataTransformationService dataTransformationService; public Optional> getAllFeatures() { - return Optional.empty(); + try { + List features = dataTransformationService.transformToFeatureList(jsonFileRepository.readAllFeatures()); + if (!features.isEmpty()) { + return Optional.of(features); + } + return Optional.empty(); + } catch (IOException e) { + log.error("exception on getAllFeatures() occurred, please check your app configuration"); + return Optional.empty(); + } } @Override public Optional getFeature(String featureId) { - return Optional.empty(); + try { + List features = dataTransformationService.transformToFeatureList(jsonFileRepository.readAllFeatures()); + if (!features.isEmpty()) { + return features.stream().filter(feature -> feature.getId().equals(featureId)).findFirst(); + } + return Optional.empty(); + } catch (IOException e) { + log.error("exception on getFeature() and featureIo {} occurred, please check your app configuration", featureId); + return Optional.empty(); + } } @Override public Optional getPicture(String featureId) { - return Optional.empty(); + try { + List features = dataTransformationService.transformToFeatureList(jsonFileRepository.readAllFeatures()); + if (!features.isEmpty()) { + return features.stream().filter(feature -> feature.getId().equals(featureId)).findFirst().filter(feature -> feature.getPicture() != null).map(Feature::getPicture); + } + return Optional.empty(); + } catch (IOException e) { + log.error("exception on getPicture() and featureIo {} occurred, please check your app configuration", featureId); + return Optional.empty(); + } } } diff --git a/src/main/java/click/poweronoff/satellite/service/DataTransformationService.java b/src/main/java/click/poweronoff/satellite/service/DataTransformationService.java index 4eb0505..9b01677 100644 --- a/src/main/java/click/poweronoff/satellite/service/DataTransformationService.java +++ b/src/main/java/click/poweronoff/satellite/service/DataTransformationService.java @@ -7,9 +7,10 @@ import org.apache.tomcat.util.codec.binary.Base64; import org.springframework.stereotype.Service; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import static java.util.Arrays.stream; + @Service public class DataTransformationService { @@ -17,7 +18,7 @@ public class DataTransformationService { List featuresList = new ArrayList<>(); - Arrays.stream(collections).forEach(collection -> Arrays.stream(collection.getFeatures()).forEach(feature -> featuresList.add(createFeature(feature)))); + stream(collections).forEach(collection -> stream(collection.getFeatures()).forEach(feature -> featuresList.add(createFeature(feature)))); return featuresList; } @@ -29,7 +30,7 @@ public class DataTransformationService { Long.parseLong(features.getProperties().getAcquisition().getBeginViewingDate()), Long.parseLong(features.getProperties().getAcquisition().getEndViewingDate()), features.getProperties().getAcquisition().getMissionName(), - Base64.decodeBase64(features.getProperties().getQuicklook().getBytes()) + features.getProperties().getQuicklook() != null ? Base64.decodeBase64(features.getProperties().getQuicklook().getBytes()) : null ); } } diff --git a/src/test/java/click/poweronoff/satellite/service/DataServiceImplTest.java b/src/test/java/click/poweronoff/satellite/service/DataServiceImplTest.java index 100bfd9..f23bc1d 100644 --- a/src/test/java/click/poweronoff/satellite/service/DataServiceImplTest.java +++ b/src/test/java/click/poweronoff/satellite/service/DataServiceImplTest.java @@ -1,7 +1,91 @@ package click.poweronoff.satellite.service; -//@RunWith(MockitoJUnitRunner.class) +import click.poweronoff.satellite.domain.Feature; +import click.poweronoff.satellite.repository.JsonFileRepository; +import click.poweronoff.satellite.repository.dto.FeaturesCollection; +import click.poweronoff.satellite.testutil.FeaturesCollectionCreator; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) public class DataServiceImplTest { + @Mock + JsonFileRepository jsonFileRepository; + + DataServiceImpl dataService; + + DataTransformationService dataTransformationService; + + @Before + public void setup() { + dataTransformationService = new DataTransformationService(); + dataService = new DataServiceImpl(jsonFileRepository, dataTransformationService); + } + + @Test + public void getAllFeaturesReturnsEmpty() throws IOException { + when(jsonFileRepository.readAllFeatures()).thenReturn(new FeaturesCollection[]{}); + assertThat(dataService.getAllFeatures()).isEmpty(); + } + + @Test + public void getAllFeaturesReturnsAListOfFeatures() throws IOException { + when(jsonFileRepository.readAllFeatures()).thenReturn(FeaturesCollectionCreator.createTestFeaturesCollection()); + assertThat(dataService.getAllFeatures()).isNotEmpty(); + assertThat(dataService.getAllFeatures().get()).hasSize(1); + } + + @Test + public void getFeatureReturnsEmpty() throws IOException { + when(jsonFileRepository.readAllFeatures()).thenReturn(new FeaturesCollection[]{}); + assertThat(dataService.getFeature(FeaturesCollectionCreator.ID)).isEmpty(); + } + + @Test + public void getFeatureWithNonexistentIdReturnsEmpty() throws IOException { + when(jsonFileRepository.readAllFeatures()).thenReturn(FeaturesCollectionCreator.createTestFeaturesCollection()); + assertThat(dataService.getFeature("non-existing-feature")).isEmpty(); + } + + @Test + public void getFeatureReturnFeature() throws IOException { + when(jsonFileRepository.readAllFeatures()).thenReturn(FeaturesCollectionCreator.createTestFeaturesCollection()); + assertThat(dataService.getFeature(FeaturesCollectionCreator.ID)).isNotEmpty(); + assertThat(dataService.getFeature(FeaturesCollectionCreator.ID)).isPresent().hasValue(new Feature( + FeaturesCollectionCreator.ID, + FeaturesCollectionCreator.TIMESTAMP, + FeaturesCollectionCreator.BEGIN_VIEWING_DATE, + FeaturesCollectionCreator.END_VIEWING_DATE, + FeaturesCollectionCreator.MISSION_NAME, + FeaturesCollectionCreator.SATELLITE.getBytes())); + } + + @Test + public void getPictureReturnsEmpty() throws IOException { + when(jsonFileRepository.readAllFeatures()).thenReturn(new FeaturesCollection[]{}); + assertThat(dataService.getPicture(FeaturesCollectionCreator.ID)).isEmpty(); + } + + @Test + public void getPictureWithNonexistentIdReturnsEmpty() throws IOException { + when(jsonFileRepository.readAllFeatures()).thenReturn(FeaturesCollectionCreator.createTestFeaturesCollection()); + assertThat(dataService.getPicture("non-existing-feature")).isEmpty(); + } + + @Test + public void getPictureReturnsPicture() throws IOException { + when(jsonFileRepository.readAllFeatures()).thenReturn(FeaturesCollectionCreator.createTestFeaturesCollection()); + assertThat(dataService.getPicture(FeaturesCollectionCreator.ID)).isPresent().hasValue(FeaturesCollectionCreator.SATELLITE.getBytes()); + } + } \ No newline at end of file diff --git a/src/test/java/click/poweronoff/satellite/service/DataTransformationServiceTest.java b/src/test/java/click/poweronoff/satellite/service/DataTransformationServiceTest.java index b8ae5c6..c05002f 100644 --- a/src/test/java/click/poweronoff/satellite/service/DataTransformationServiceTest.java +++ b/src/test/java/click/poweronoff/satellite/service/DataTransformationServiceTest.java @@ -2,27 +2,16 @@ package click.poweronoff.satellite.service; import click.poweronoff.satellite.domain.Feature; -import click.poweronoff.satellite.repository.dto.Acquisition; -import click.poweronoff.satellite.repository.dto.Features; -import click.poweronoff.satellite.repository.dto.FeaturesCollection; -import click.poweronoff.satellite.repository.dto.Properties; +import click.poweronoff.satellite.testutil.FeaturesCollectionCreator; import org.junit.Before; import org.junit.Test; -import java.util.Base64; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; public class DataTransformationServiceTest { - private static final String ID = "id"; - private static final long TIMESTAMP = 271770505L; - private static final long BEGIN_VIEWING_DATE = 271770509L; - private static final long END_VIEWING_DATE = 271770512L; - private static final String MISSION_NAME = "cool-mission"; - private static final String SATELLITE = "satellite"; - DataTransformationService dataTransformationService; @@ -34,32 +23,14 @@ public class DataTransformationServiceTest { @Test public void transformToFeatureListShouldTransformToFeatureList() { - List objectUnderTest = dataTransformationService.transformToFeatureList(createTestFeaturesCollection()); + List objectUnderTest = dataTransformationService.transformToFeatureList(FeaturesCollectionCreator.createTestFeaturesCollection()); assertThat(objectUnderTest).isNotEmpty(); assertThat(objectUnderTest).hasSize(1); - assertThat(objectUnderTest).containsOnly(new Feature(ID, TIMESTAMP, BEGIN_VIEWING_DATE, END_VIEWING_DATE, MISSION_NAME, SATELLITE.getBytes())); - } - - - private FeaturesCollection[] createTestFeaturesCollection() { - - Acquisition acquisition = new Acquisition(); - acquisition.setBeginViewingDate(Long.toString(BEGIN_VIEWING_DATE)); - acquisition.setEndViewingDate(Long.toString(END_VIEWING_DATE)); - acquisition.setMissionName(MISSION_NAME); - - Properties properties = new Properties(); - properties.setId(ID); - properties.setQuicklook(new String(Base64.getEncoder().encode("satellite".getBytes()))); - properties.setTimestamp(Long.toString(TIMESTAMP)); - properties.setAcquisition(acquisition); - - Features features = new Features(); - features.setProperties(properties); - - FeaturesCollection featuresCollection = new FeaturesCollection(); - featuresCollection.setFeatures(new Features[]{features}); - - return new FeaturesCollection[]{featuresCollection}; + assertThat(objectUnderTest).containsOnly(new Feature(FeaturesCollectionCreator.ID, + FeaturesCollectionCreator.TIMESTAMP, + FeaturesCollectionCreator.BEGIN_VIEWING_DATE, + FeaturesCollectionCreator.END_VIEWING_DATE, + FeaturesCollectionCreator.MISSION_NAME, + FeaturesCollectionCreator.SATELLITE.getBytes())); } } diff --git a/src/test/java/click/poweronoff/satellite/testutil/FeaturesCollectionCreator.java b/src/test/java/click/poweronoff/satellite/testutil/FeaturesCollectionCreator.java new file mode 100644 index 0000000..234cbc4 --- /dev/null +++ b/src/test/java/click/poweronoff/satellite/testutil/FeaturesCollectionCreator.java @@ -0,0 +1,43 @@ +package click.poweronoff.satellite.testutil; + +import click.poweronoff.satellite.repository.dto.Acquisition; +import click.poweronoff.satellite.repository.dto.Features; +import click.poweronoff.satellite.repository.dto.FeaturesCollection; +import click.poweronoff.satellite.repository.dto.Properties; + +import java.util.Base64; + +public class FeaturesCollectionCreator { + + + public static final String ID = "id"; + public static final long TIMESTAMP = 271770505L; + public static final long BEGIN_VIEWING_DATE = 271770509L; + public static final long END_VIEWING_DATE = 271770512L; + public static final String MISSION_NAME = "cool-mission"; + public static final String SATELLITE = "satellite"; + + + public static FeaturesCollection[] createTestFeaturesCollection() { + + Acquisition acquisition = new Acquisition(); + acquisition.setBeginViewingDate(Long.toString(BEGIN_VIEWING_DATE)); + acquisition.setEndViewingDate(Long.toString(END_VIEWING_DATE)); + acquisition.setMissionName(MISSION_NAME); + + Properties properties = new Properties(); + properties.setId(ID); + properties.setQuicklook(new String(Base64.getEncoder().encode(SATELLITE.getBytes()))); + properties.setTimestamp(Long.toString(TIMESTAMP)); + properties.setAcquisition(acquisition); + + Features features = new Features(); + features.setProperties(properties); + + FeaturesCollection featuresCollection = new FeaturesCollection(); + featuresCollection.setFeatures(new Features[]{features}); + + return new FeaturesCollection[]{featuresCollection}; + } + +}