[SI-163] adjustments due to using one controller for displaying reminder and sending mails; adjust unit tests

Signed-off-by: Holger Rudolph <holger.rudolph@pta.de>
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/FailureInformationReminderMailSentController.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/FailureInformationReminderMailSentController.java
index 42052b3..c31320b 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/FailureInformationReminderMailSentController.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/controller/FailureInformationReminderMailSentController.java
@@ -37,16 +37,8 @@
     @ApiOperation(value = "Anzeigen des Reminder")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
     @GetMapping
-    public Boolean displayReminder() {
-        return failureInformationReminderMailSentService.displayStatusChangeReminder();
-    }
-
-    @Secured({"ROLE_GRID-FAILURE-ADMIN", "ROLE_GRID-FAILURE-PUBLISHER"})
-    @ApiOperation(value = "Anzeigen des Reminder")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
-    @GetMapping("/mail")
-    public Boolean sendReminderMails() {
-        return failureInformationReminderMailSentService.sendReminderMails();
+    public Boolean displayReminderAndSendMails() {
+        return failureInformationReminderMailSentService.displayStatusChangeReminderAndSendMails();
     }
 
 }
diff --git a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentService.java b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentService.java
index 1ceda4a..1b23552 100644
--- a/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentService.java
+++ b/gfsBackendService/src/main/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentService.java
@@ -61,35 +61,30 @@
     @Value("${reminder.status-change.minutes-before}")
     long minutesBefore;
 
-    public Boolean displayStatusChangeReminder() {
+    public Boolean displayStatusChangeReminderAndSendMails() {
         Page<FailureInformationDto> failureInfoPage = failureInformationRepository
             .findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(PageRequest.of(0, 9999999))
             .map(failureInformationMapper::toFailureInformationDto);
 
         LocalDateTime reminderDate = LocalDateTime.now().plusMinutes(minutesBefore);
 
-        return failureInfoPage.getContent()
-                .stream()
-                .filter(f -> f.getStatusInternId() != statusRepository.findById(GfiProcessState.COMPLETED.getStatusValue()).get().getUuid())
-                .filter(f -> f.getFailureEndPlanned() != null )
-                .anyMatch(f -> f.getFailureEndPlanned().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().isBefore(reminderDate) );
-    }
-
-    public boolean sendReminderMails() {
-
-        Page<FailureInformationDto> failureInfoPage = failureInformationRepository
-                .findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(PageRequest.of(0, 9999999))
-                .map(failureInformationMapper::toFailureInformationDto);
-
-        LocalDateTime reminderDate = LocalDateTime.now().plusMinutes(minutesBefore);
-
-        List<FailureInformationDto> failureInformationDtoList = failureInfoPage.getContent()
+        List<FailureInformationDto> failureInformationDtoList =  failureInfoPage.getContent()
                 .stream()
                 .filter(f -> f.getStatusInternId() != statusRepository.findById(GfiProcessState.COMPLETED.getStatusValue()).get().getUuid())
                 .filter(f -> f.getFailureEndPlanned() != null )
                 .filter(f -> f.getFailureEndPlanned().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().isBefore(reminderDate) )
                 .collect(Collectors.toList());
 
+        if (failureInformationDtoList.isEmpty()) {
+            return false;
+        } else {
+            sendReminderMails(failureInformationDtoList);
+            return true;
+        }
+
+    }
+
+    public void sendReminderMails(List<FailureInformationDto> failureInformationDtoList) {
 
         for (FailureInformationDto dto: failureInformationDtoList) {
             boolean sendMail = true;
@@ -115,7 +110,6 @@
             }
         }
 
-        return true;
     }
 
 }
\ No newline at end of file
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/FailureInformationReminderMailSentControllerTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/FailureInformationReminderMailSentControllerTest.java
index c8d6e9e..0dcc812 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/FailureInformationReminderMailSentControllerTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/controller/FailureInformationReminderMailSentControllerTest.java
@@ -45,21 +45,12 @@
     @Test
     public void shouldDisplayReminder() throws Exception {
         Boolean isDisplayed = true;
-        when(failureInformationReminderMailSentService.displayStatusChangeReminder()).thenReturn(isDisplayed);
+        when(failureInformationReminderMailSentService.displayStatusChangeReminderAndSendMails()).thenReturn(isDisplayed);
 
         mockMvc.perform(get("/failure-reminder"))
                 .andExpect(status().is2xxSuccessful())
                 .andExpect(content().contentType(MediaType.APPLICATION_JSON));
     }
 
-    @Test
-    public void shouldSendReminderMail() throws Exception {
-        Boolean hasSent = true;
-        when(failureInformationReminderMailSentService.sendReminderMails()).thenReturn(hasSent);
-
-        mockMvc.perform(get("/failure-reminder/mail"))
-                .andExpect(status().is2xxSuccessful())
-                .andExpect(content().contentType(MediaType.APPLICATION_JSON));
-    }
 
 }
\ No newline at end of file
diff --git a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentServiceTest.java b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentServiceTest.java
index d33a1b9..7c4960e 100644
--- a/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentServiceTest.java
+++ b/gfsBackendService/src/test/java/org/eclipse/openk/gridfailureinformation/service/FailureInformationReminderMailSentServiceTest.java
@@ -14,7 +14,6 @@
  */
 package org.eclipse.openk.gridfailureinformation.service;
 
-import org.eclipse.openk.gridfailureinformation.bpmn.impl.GfiProcessState;
 import org.eclipse.openk.gridfailureinformation.config.TestConfiguration;
 import org.eclipse.openk.gridfailureinformation.model.RefStatus;
 import org.eclipse.openk.gridfailureinformation.model.TblFailureInformation;
@@ -23,7 +22,9 @@
 import org.eclipse.openk.gridfailureinformation.repository.FailureInformationRepository;
 import org.eclipse.openk.gridfailureinformation.repository.StatusRepository;
 import org.eclipse.openk.gridfailureinformation.support.MockDataHelper;
+import org.eclipse.openk.gridfailureinformation.viewmodel.FailureInformationDto;
 import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@@ -35,12 +36,14 @@
 import java.time.Duration;
 import java.time.Instant;
 import java.util.Date;
+import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -66,6 +69,25 @@
     private ExportService exportService;
 
     @Test
+    public void shouldDisplayReminder() {
+        Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
+        RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
+
+        Date reminderDate = Date.from( Instant.now().plus(Duration.ofHours(2)));
+        mockfailurePage.getContent().stream().findFirst().get().setFailureEndPlanned(reminderDate);
+        TblFailureInformation tblFailureInformation = MockDataHelper.mockTblFailureInformation();
+
+        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
+        when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblFailureInformation));
+        when(failureInformationReminderMailSentRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(Optional.empty());
+
+        Boolean reminderIsDisplayed = failureInformationReminderMailSentService.displayStatusChangeReminderAndSendMails();
+
+        assertEquals(reminderIsDisplayed, true);
+    }
+
+    @Test
     public void shouldNotDisplayReminder() {
         Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
         RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
@@ -73,103 +95,43 @@
         when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
 
-        Boolean reminderIsDisplayed = failureInformationReminderMailSentService.displayStatusChangeReminder();
+        Boolean reminderIsDisplayed = failureInformationReminderMailSentService.displayStatusChangeReminderAndSendMails();
+
+        assertEquals(reminderIsDisplayed, false);
+    }
+
+
+    @Test
+    public void shouldNotDisplayReminder_NoExpectedStatusChangeFound() {
+        Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
+        Date reminderDate = Date.from( Instant.now().plus(Duration.ofHours(96)));
+        mockfailurePage.getContent().stream().forEach(f -> f.setFailureEndPlanned(reminderDate));
+        RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
+        List<FailureInformationDto> failureInformationDtoList = MockDataHelper.mockGridFailureInformationDtos();
+
+        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
+        when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
+        when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
+
+        Boolean reminderIsDisplayed = failureInformationReminderMailSentService.displayStatusChangeReminderAndSendMails();
 
         assertEquals(reminderIsDisplayed, false);
     }
 
     @Test
-    public void shouldDisplayReminder() {
-        Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
-        RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
-
-        Date reminderDate = Date.from( Instant.now().plus(Duration.ofHours(2)));
-        mockfailurePage.getContent().stream().findFirst().get().setFailureEndPlanned(reminderDate);
-
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
-        when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
-
-        Boolean reminderIsDisplayed = failureInformationReminderMailSentService.displayStatusChangeReminder();
-
-        assertEquals(reminderIsDisplayed, true);
-    }
-
-    @Test
-    public void shouldSendReminderMails() {
-        Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
-        Date reminderDate = Date.from( Instant.now().plus(Duration.ofHours(2)));
-        mockfailurePage.getContent().stream().findFirst().get().setFailureEndPlanned(reminderDate);
-        RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
-
-        TblFailureInformation tblFailureInformation = MockDataHelper.mockTblFailureInformation();
-
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
-        when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
-        when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblFailureInformation));
-        when(failureInformationReminderMailSentRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(Optional.empty());
-        when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
-
-        Boolean mailHasSent = failureInformationReminderMailSentService.sendReminderMails();
-        assertEquals(mailHasSent, true);
-
-    }
-
-    @Test
-    public void shouldNotSendNoReminderMails_MailsAlreadySent() {
-        Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
-        Date reminderDate = Date.from( Instant.now().plus(Duration.ofHours(2)));
-        mockfailurePage.getContent().stream().findFirst().get().setFailureEndPlanned(reminderDate);
-        RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
-
-        TblFailureInformation tblFailureInformation = MockDataHelper.mockTblFailureInformation();
-        TblFailureInformationReminderMailSent failureInfoReminderMailSent = MockDataHelper.mockTblFailureInformationReminderMailSent();
-
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
-        when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
-        when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblFailureInformation));
-        when(failureInformationReminderMailSentRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(Optional.of(failureInfoReminderMailSent));
-        when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
-
-        Boolean mailHasSent = failureInformationReminderMailSentService.sendReminderMails();
-
-        verify(exportService, never()).exportFailureInformationReminderMail(any(UUID.class));
-        assertEquals(mailHasSent, true);
-
-    }
-
-    @Test
-    public void shouldNotSendReminderMails_NoExpectedStatusChangeFound() {
-        Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
-        Date reminderDate = Date.from( Instant.now().plus(Duration.ofHours(96)));
-        mockfailurePage.getContent().stream().forEach(f -> f.setFailureEndPlanned(reminderDate));
-        RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
-
-        when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
-        when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
-        when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
-
-        Boolean mailHasSent = failureInformationReminderMailSentService.sendReminderMails();
-
-        verify(exportService, never()).exportFailureInformationReminderMail(any(UUID.class));
-        assertEquals(mailHasSent, true);
-
-    }
-
-    @Test
-    public void shouldNotSendReminderMails_NoFailureEndPlanned() {
+    public void shouldNotDisplayReminder_NoFailureEndPlanned() {
         Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
         mockfailurePage.getContent().stream().forEach(f -> f.setFailureEndPlanned(null));
         RefStatus mockRefStatus = MockDataHelper.mockRefStatusCreated();
+        List<FailureInformationDto> failureInformationDtoList = MockDataHelper.mockGridFailureInformationDtos();
 
         when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
         when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
 
-        Boolean mailHasSent = failureInformationReminderMailSentService.sendReminderMails();
+        Boolean reminderIsDisplayed = failureInformationReminderMailSentService.displayStatusChangeReminderAndSendMails();
 
-        verify(exportService, never()).exportFailureInformationReminderMail(any(UUID.class));
-        assertEquals(mailHasSent, true);
-
+        assertEquals(reminderIsDisplayed, false);
     }
 
     @Test
@@ -177,16 +139,47 @@
         Page<TblFailureInformation> mockfailurePage = MockDataHelper.mockTblFailureInformationPage();
         RefStatus mockRefStatus = MockDataHelper.mockRefStatusCOMPLETED();
         mockfailurePage.getContent().stream().forEach(f -> f.setRefStatusIntern(null));
+        List<FailureInformationDto> failureInformationDtoList = MockDataHelper.mockGridFailureInformationDtos();
 
         when(failureInformationRepository.findByTblFailureInformationCondensedIdIsNullOrderByFailureBeginDescIdAsc(any(Pageable.class))).thenReturn(mockfailurePage);
         when(statusRepository.findById(any(Long.class))).thenReturn(Optional.of(mockRefStatus));
         when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
 
-        Boolean mailHasSent = failureInformationReminderMailSentService.sendReminderMails();
+        Boolean reminderIsDisplayed = failureInformationReminderMailSentService.displayStatusChangeReminderAndSendMails();
 
-        verify(exportService, never()).exportFailureInformationReminderMail(any(UUID.class));
-        assertEquals(mailHasSent, true);
+        assertEquals(reminderIsDisplayed, false);
+    }
+
+    @Test
+    public void shouldSendReminderMails() {
+
+        TblFailureInformation tblFailureInformation = MockDataHelper.mockTblFailureInformation();
+        List<FailureInformationDto> failureInformationDtoList = MockDataHelper.mockGridFailureInformationDtos();
+
+        when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblFailureInformation));
+        when(failureInformationReminderMailSentRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(Optional.empty());
+        when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
+
+        failureInformationReminderMailSentService.sendReminderMails(failureInformationDtoList);
+        Mockito.verify(failureInformationReminderMailSentRepository, times(2)).save(any(TblFailureInformationReminderMailSent.class));
 
     }
 
+    @Test
+    public void shouldNotSendNoReminderMails_MailsAlreadySent() {
+
+        TblFailureInformation tblFailureInformation = MockDataHelper.mockTblFailureInformation();
+        TblFailureInformationReminderMailSent failureInfoReminderMailSent = MockDataHelper.mockTblFailureInformationReminderMailSent();
+        List<FailureInformationDto> failureInformationDtoList = MockDataHelper.mockGridFailureInformationDtos();
+
+        when(failureInformationRepository.findByUuid(any(UUID.class))).thenReturn(Optional.of(tblFailureInformation));
+        when(failureInformationReminderMailSentRepository.findByTblFailureInformation(any(TblFailureInformation.class))).thenReturn(Optional.of(failureInfoReminderMailSent));
+        when(exportService.exportFailureInformationReminderMail(any(UUID.class))).thenReturn(true);
+
+        failureInformationReminderMailSentService.sendReminderMails(failureInformationDtoList);
+
+        verify(exportService, never()).exportFailureInformationReminderMail(any(UUID.class));
+    }
+
+
 }