diff --git a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonPlantDatabase.java b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonPlantDatabase.java index f4872ae..3f84f23 100644 --- a/src/main/java/ch/zhaw/gartenverwaltung/io/JsonPlantDatabase.java +++ b/src/main/java/ch/zhaw/gartenverwaltung/io/JsonPlantDatabase.java @@ -1,6 +1,5 @@ package ch.zhaw.gartenverwaltung.io; -import ch.zhaw.gartenverwaltung.types.GrowthPhase; import ch.zhaw.gartenverwaltung.types.HardinessZone; import ch.zhaw.gartenverwaltung.types.Plant; import com.fasterxml.jackson.databind.ObjectMapper; @@ -32,6 +31,7 @@ public class JsonPlantDatabase implements PlantDatabase { * Creating constant objects required to deserialize the {@link MonthDay} classes */ private final static JavaTimeModule timeModule = new JavaTimeModule(); + static { DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("MM-dd"); MonthDayDeserializer dateDeserializer = new MonthDayDeserializer(dateFormat); @@ -82,21 +82,16 @@ public class JsonPlantDatabase implements PlantDatabase { List result; result = mapper.readerForListOf(Plant.class).readValue(dataSource); - for (Plant plant : result) { - // for discussion because of failing tests: - // for(GrowthPhase growthPhase: plant.lifecycle()) { - // if(growthPhase.zone()==zone) { - // keep in result, remove if no match - // } - // } - plant.inZone(currentZone); - } - - // Turn list into a HashMap with structure id => Plant plantMap = result.stream() + // Remove plants not in the current zone + .filter(plant -> { + plant.inZone(currentZone); + return !plant.lifecycle().isEmpty(); + }) + // Create Hashmap from results .collect(HashMap::new, (res, plant) -> res.put(plant.id(), plant), - (existing, replacement) -> { }); + (existing, replacement) -> {}); } } } diff --git a/src/test/java/ch/zhaw/gartenverwaltung/io/JsonGardenPlanTest.java b/src/test/java/ch/zhaw/gartenverwaltung/io/JsonGardenPlanTest.java index d6e165b..ea22b3b 100644 --- a/src/test/java/ch/zhaw/gartenverwaltung/io/JsonGardenPlanTest.java +++ b/src/test/java/ch/zhaw/gartenverwaltung/io/JsonGardenPlanTest.java @@ -1,16 +1,17 @@ package ch.zhaw.gartenverwaltung.io; import ch.zhaw.gartenverwaltung.types.Crop; -import ch.zhaw.gartenverwaltung.types.HardinessZone; -import ch.zhaw.gartenverwaltung.types.Plant; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Arrays; @@ -18,15 +19,24 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; public class JsonGardenPlanTest { - GardenPlan testDatabase; - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + private GardenPlan testDatabase; + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + /** + * Files to isolate the test-units + */ + private final URL dbDataSource = this.getClass().getResource("user-crops.json"); + private final URL testFile = this.getClass().getResource("test-user-crops.json"); @BeforeEach - void connectToDb() { - testDatabase = new JsonGardenPlan(); + void connectToDb() throws URISyntaxException, IOException { + assertNotNull(testFile); + assertNotNull(dbDataSource); + Files.copy(Path.of(testFile.toURI()), Path.of(dbDataSource.toURI()), StandardCopyOption.REPLACE_EXISTING); + testDatabase = new JsonGardenPlan(dbDataSource); } @@ -42,19 +52,14 @@ public class JsonGardenPlanTest { Assertions.assertEquals(3, testList.size()); List plantIds = testList.stream().map(Crop::getPlantId).collect(Collectors.toList()); - List expected = Arrays.asList(1l, 1l, 0l); + List expected = Arrays.asList(1L, 1L, 0L); Assertions.assertEquals(expected, plantIds); } @Test @DisplayName("Check whether single access works.") - void getCropById() { - Optional testCrop; - try { - testCrop = testDatabase.getCropById(1); - } catch (IOException e) { - throw new RuntimeException(e); - } + void getCropById() throws IOException { + Optional testCrop = testDatabase.getCropById(1); assertTrue(testCrop.isPresent()); Assertions.assertEquals(1, testCrop.get().getPlantId()); } @@ -62,31 +67,22 @@ public class JsonGardenPlanTest { @Test @DisplayName("Check for a nonexisting crop.") - void getCropByIdMustFail() { - Optional testCrop; - try { - testCrop = testDatabase.getCropById(99); - } catch (IOException e) { - throw new RuntimeException(e); - } + void getCropByIdMustFail() throws IOException { + Optional testCrop = testDatabase.getCropById(99); Assertions.assertFalse(testCrop.isPresent()); } @Test @DisplayName("Add new Crop.") void addNewCrop() { - Crop crop = new Crop(2l, LocalDate.parse("22.02.2023", formatter)); + Crop crop = new Crop(3L, LocalDate.parse("2023-02-22", formatter)); try { testDatabase.saveCrop(crop); assertTrue(crop.getCropId().isPresent()); - Optional testCrop; - try { - testCrop = testDatabase.getCropById(crop.getCropId().get()); - } catch (IOException e) { - throw new RuntimeException(e); - } + Optional testCrop = testDatabase.getCropById(crop.getCropId().get()); + assertTrue(testCrop.isPresent()); - Assertions.assertEquals(2l, testCrop.get().getPlantId()); + Assertions.assertEquals(crop, testCrop.get()); } catch (IOException e) { throw new RuntimeException(e); } @@ -96,10 +92,10 @@ public class JsonGardenPlanTest { @DisplayName("Remove crop") void removeCrop(){ try { - Optional crop = testDatabase.getCropById(2l); + Optional crop = testDatabase.getCropById(2L); Assertions.assertTrue(crop.isPresent()); testDatabase.removeCrop(crop.get()); - crop = testDatabase.getCropById(2l); + crop = testDatabase.getCropById(2L); Assertions.assertFalse(crop.isPresent()); } catch (IOException e) { throw new RuntimeException(e);