From c3d78505c864b311a6be0a741b22b487628f88d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Wo=C5=BAniak?= Date: Sat, 26 Dec 2020 14:18:47 +0100 Subject: [PATCH] Added new test for new columns and update groups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcin Woźniak --- .../configutils/FileToDatabaseMigrator.java | 8 +++- .../java/com/plannaplan/entities/Groups.java | 41 ++++++++++++++++++ .../services/ConfiguratorServiceTest.java | 32 ++++++++++++++ .../test/resources/ZajeciaAfterUpdate.xlsx | Bin 0 -> 9341 bytes .../test/resources/ZajeciaBeforeUpdate.xlsx | Bin 0 -> 9582 bytes 5 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 buisnesslogic/src/test/resources/ZajeciaAfterUpdate.xlsx create mode 100644 buisnesslogic/src/test/resources/ZajeciaBeforeUpdate.xlsx diff --git a/buisnesslogic/src/main/java/com/plannaplan/configutils/FileToDatabaseMigrator.java b/buisnesslogic/src/main/java/com/plannaplan/configutils/FileToDatabaseMigrator.java index 0f9f033..44af1f6 100755 --- a/buisnesslogic/src/main/java/com/plannaplan/configutils/FileToDatabaseMigrator.java +++ b/buisnesslogic/src/main/java/com/plannaplan/configutils/FileToDatabaseMigrator.java @@ -92,8 +92,12 @@ public class FileToDatabaseMigrator { .orElseGet(() -> this.lecturerService .save(new Lecturer(lecturerTitle, lecturerName, lecturerSurname))); - this.groupService.find(zajCykId, grNr).orElseGet( - () -> this.groupService.save(new Groups(capacity, room, course, time, groupDay, lecturer, zajCykId, grNr))); + Groups group = this.groupService.find(zajCykId, grNr).orElseGet( + () -> new Groups(capacity, room, course, time, groupDay, lecturer, zajCykId, grNr)); + + group.update(capacity, room, course, time, null, groupDay, lecturer); + + this.groupService.save(group); } diff --git a/buisnesslogic/src/main/java/com/plannaplan/entities/Groups.java b/buisnesslogic/src/main/java/com/plannaplan/entities/Groups.java index c6bbf4e..e26ce6a 100755 --- a/buisnesslogic/src/main/java/com/plannaplan/entities/Groups.java +++ b/buisnesslogic/src/main/java/com/plannaplan/entities/Groups.java @@ -130,6 +130,47 @@ public class Groups { this(capacity, room, course, time, time + DEFAULT_CLASS_TIME, day, lecturer); } + /** + * Updates given values other that are not null + * + * @param capacity capacity given to the groups + * @param room room given to the groups + * @param course course given to the groups + * @param time time given to the groups + * @param endTime end time of class in minutes + * @param day day given to the groups + * @param lecturer lecturer given to the groups + */ + public void update(Integer capacity, String room, Course course, Integer time, Integer endTime, WeekDay day, Lecturer lecturer){ + if (capacity != null){ + this.capacity = capacity; + } + + if (room != null){ + this.room = room; + } + + if (course != null){ + this.course = course; + } + + if (time != null){ + this.time = time; + } + + if (endTime != null){ + this.endTime = endTime; + } + + if (day != null){ + this.day = day; + } + + if (lecturer != null){ + this.lecturer = lecturer; + } + } + /** * get time of class end * diff --git a/buisnesslogic/src/test/java/com/plannaplan/services/ConfiguratorServiceTest.java b/buisnesslogic/src/test/java/com/plannaplan/services/ConfiguratorServiceTest.java index 0190b2c..d69754d 100755 --- a/buisnesslogic/src/test/java/com/plannaplan/services/ConfiguratorServiceTest.java +++ b/buisnesslogic/src/test/java/com/plannaplan/services/ConfiguratorServiceTest.java @@ -2,6 +2,8 @@ package com.plannaplan.services; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.MethodMode; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; @@ -9,9 +11,11 @@ import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.sql.Date; +import java.util.Optional; import com.plannaplan.TestApplication; import com.plannaplan.entities.AppConfig; +import com.plannaplan.entities.Groups; import com.plannaplan.models.ConfigData; import com.plannaplan.models.TourData; import com.plannaplan.repositories.AppConfigRepository; @@ -24,6 +28,9 @@ import org.junit.runner.RunWith; @ContextConfiguration public class ConfiguratorServiceTest { + private final static String BEFORE_UPDATE_FILE = "ZajeciaBeforeUpdate.xlsx"; + private final static String AFTER_UPDATE_FILE = "ZajeciaAfterUpdate.xlsx"; + @Autowired private ConfiguratorService configuratorService; @@ -57,6 +64,31 @@ public class ConfiguratorServiceTest { assertTrue(courses_ammount > 0 && groups_ammount > 0 && lecturers_ammount > 0); } + @Test + @DirtiesContext(methodMode = MethodMode.BEFORE_METHOD) + public void shouldUpdatePreviousImport(){ + final InputStream inputStream = getClass().getClassLoader() + .getResourceAsStream(ConfiguratorServiceTest.BEFORE_UPDATE_FILE); + this.configuratorService.importCoursesStream(inputStream); + int groups_ammount = this.groupService.getGroupsAmmount(); + + assertTrue(groups_ammount == 2); + + final InputStream inputStream2 = getClass().getClassLoader() + .getResourceAsStream(ConfiguratorServiceTest.AFTER_UPDATE_FILE); + this.configuratorService.importCoursesStream(inputStream2); + int groups_ammount2 = this.groupService.getGroupsAmmount(); + + Optional newGroup = this.groupService.find(456458, 3); + Optional updateGroup = this.groupService.find(456457, 2); + + assertTrue(groups_ammount2 == 3); + assertTrue(newGroup.isPresent()); + assertTrue(updateGroup.get().getLecturer().getSurname().equals("Murawski")); + assertTrue(updateGroup.get().getLecturer().getName().equals("Roman")); + assertTrue(updateGroup.get().getLecturer().getTitle().equals("prof. dr hab.")); + } + @Test public void shouldRetrunNewestConfig() throws InterruptedException { final Date dateToCheck = new Date(System.currentTimeMillis()); diff --git a/buisnesslogic/src/test/resources/ZajeciaAfterUpdate.xlsx b/buisnesslogic/src/test/resources/ZajeciaAfterUpdate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bb3d3603ffbe5dcd679e93c73a318a59a4cb4b52 GIT binary patch literal 9341 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 Y0Z~N(0lK>Yz!T^z5GvSP6hA-xA2*LrDgXcg literal 0 HcmV?d00001 diff --git a/buisnesslogic/src/test/resources/ZajeciaBeforeUpdate.xlsx b/buisnesslogic/src/test/resources/ZajeciaBeforeUpdate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..15b73678a455eff3f2e1e092ee263abfdd921b9a GIT binary patch literal 9582 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 literal 0 HcmV?d00001