blob: 025639415fd7240f804bf62bade2501cfcc0b5f6 [file] [log] [blame]
package org.eclipse.openk.sp.controller;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.ws.rs.core.Response;
import org.eclipse.openk.sp.abstracts.AbstractDto;
import org.eclipse.openk.sp.abstracts.AbstractEntity;
import org.eclipse.openk.sp.controller.reports.ReportController;
import org.eclipse.openk.sp.db.converter.EntityConverter;
import org.eclipse.openk.sp.db.dao.CyclicReportGenerationConfigRepository;
import org.eclipse.openk.sp.db.model.ReportGenerationConfig;
import org.eclipse.openk.sp.dto.ReportGenerationConfigDto;
import org.eclipse.openk.sp.dto.report.ReportDto;
import org.eclipse.openk.sp.exceptions.SpException;
import org.eclipse.openk.sp.util.ArchiveHelper;
import org.eclipse.openk.sp.util.MailHelper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.test.util.ReflectionTestUtils;
@RunWith(MockitoJUnitRunner.class)
public class CyclicReportsControllerTest {
@InjectMocks
private CyclicReportsController automaticReportsController;
@Mock
private CyclicReportGenerationConfigRepository automaticReportGenerationConfigRepository;
@Mock
private MailHelper mailHelper;
@Mock
private ArchiveHelper archiveHelper;
@Mock
private EntityConverter entityConverter;
@Mock
private ReportController reportController;
@Before
public void init() {
ReflectionTestUtils.setField(automaticReportsController, "datePattern", "yyyy-MM-dd");
ReflectionTestUtils.setField(automaticReportsController, "timePattern", "HH-mm");
ReflectionTestUtils.setField(automaticReportsController, "weekPattern", "'KW'ww");
ReflectionTestUtils.setField(automaticReportsController, "archivePath", "/opt/openk/reports");
ReflectionTestUtils.setField(automaticReportsController, "slotDeltaMin", 5);
ReflectionTestUtils.setField(automaticReportsController, "zoneName", "Europe/Berlin");
ReflectionTestUtils.setField(automaticReportsController, "locale", "de");
ReflectionTestUtils.setField(automaticReportsController, "sendReportMail", true);
ReflectionTestUtils.setField(automaticReportsController, "archiveReport", true);
ReflectionTestUtils.invokeMethod(automaticReportsController, "init");
}
@Test
public void constructorTest() {
CyclicReportsController controller = new CyclicReportsController();
assertNotNull(controller);
}
@Test
public void getAllReportGenerationConfigTest() throws SpException {
List<ReportGenerationConfig> configs = new ArrayList<>();
ReportGenerationConfig config = new ReportGenerationConfig();
configs.add(config);
Mockito.when(automaticReportGenerationConfigRepository.findAll()).thenReturn(configs);
ReportGenerationConfigDto reportGenerationConfigDto = new ReportGenerationConfigDto();
Mockito.when(entityConverter.convertEntityToDto((AbstractEntity) any(), (AbstractDto) any()))
.thenReturn((AbstractDto) reportGenerationConfigDto);
List<ReportGenerationConfigDto> configDtos = automaticReportsController.getAllReportGenerationConfig();
assertNotNull(configDtos);
assertTrue(configDtos.size() == 1);
ReportGenerationConfigDto configDto = configDtos.get(0);
assertTrue(configDto == reportGenerationConfigDto);
}
@Test
public void deleteReportGenerationConfigTest() throws SpException {
Long configId = 23L;
ReportGenerationConfig config = new ReportGenerationConfig();
Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.of(config));
Response response = automaticReportsController.deleteReportGenerationConfig(configId);
assertEquals(204, response.getStatus());
Mockito.verify(automaticReportGenerationConfigRepository).delete(Mockito.eq(configId));
}
@Test
public void deleteReportGenerationConfigTestNotFound() {
Long configId = 23L;
Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.empty());
try {
automaticReportsController.deleteReportGenerationConfig(configId);
fail("Should have thrown SpException");
} catch (SpException e) {
// pass
}
}
@Test
public void editReportGenerationConfigTest() throws SpException {
Long configId = 23L;
ReportGenerationConfig config = new ReportGenerationConfig();
config.setId(configId);
Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.of(config));
ReportGenerationConfigDto reportGenerationConfigDto = new ReportGenerationConfigDto();
Mockito.when(entityConverter.convertDtoToEntity((AbstractDto) any(), (AbstractEntity) any())).thenReturn((AbstractEntity) config);
ReportGenerationConfigDto response = automaticReportsController.editReportGenerationConfig(configId, reportGenerationConfigDto);
assertEquals(configId, response.getId());
Mockito.verify(automaticReportGenerationConfigRepository).save(Mockito.eq(config));
}
@Test
public void editReportGenerationConfigTestNotFound() throws SpException {
Long configId = 23L;
ReportGenerationConfigDto config = new ReportGenerationConfigDto();
Mockito.when(automaticReportGenerationConfigRepository.findById(Mockito.eq(configId))).thenReturn(Optional.empty());
try {
automaticReportsController.editReportGenerationConfig(configId, config);
fail("Should have thrown SpException");
} catch (SpException e) {
// pass
}
}
@Test
public void addReportGenerationConfigTest() throws SpException {
Long configId = 23L;
ReportGenerationConfig config = new ReportGenerationConfig();
config.setId(configId);
ReportGenerationConfigDto reportGenerationConfigDto = new ReportGenerationConfigDto();
Mockito.when(entityConverter.convertDtoToEntity((AbstractDto) any(), (AbstractEntity) any())).thenReturn((AbstractEntity) config);
Mockito.when(entityConverter.convertEntityToDto((AbstractEntity) any(), (AbstractDto) any()))
.thenReturn((AbstractDto) reportGenerationConfigDto);
ReportGenerationConfigDto response = automaticReportsController.addReportGenerationConfig(reportGenerationConfigDto);
assertEquals(reportGenerationConfigDto, response);
Mockito.verify(automaticReportGenerationConfigRepository).save(Mockito.eq(config));
}
@Test
public void generateReportTest() throws SpException {
ReportGenerationConfig reportCfg = new ReportGenerationConfig();
String reportName = "REPORT_NAME";
reportCfg.setReportName(reportName);
String printFormat = "print_format";
reportCfg.setPrintFormat(printFormat );
Long statusId = 23L;
reportCfg.setStatusId(statusId);
Integer validDayFromOffset = -3;
reportCfg.setValidFromDayOffset(validDayFromOffset);
Integer validDayFromHour = 2;
reportCfg.setValidFromHour(validDayFromHour);
Integer validDayFromMinute = 5;
reportCfg.setValidFromMinute(validDayFromMinute);
Integer validDayToOffset = 3;
reportCfg.setValidToDayOffset(validDayToOffset);
Integer validDayToHour = 3;
reportCfg.setValidToHour(validDayToHour);
Integer validDayToMinute = 10;
reportCfg.setValidToMinute(validDayToMinute);
LocalDateTime triggerDate = LocalDateTime.of(2020, 1, 10, 3, 50);
Date fromDate = Date.from(LocalDateTime.of(2020, 1, 7, 2, 5).atZone(ZoneId.of("UTC")).toInstant());
Date toDate = Date.from(LocalDateTime.of(2020, 1, 13, 3, 10).atZone(ZoneId.of("UTC")).toInstant());
File file = Mockito.mock(File.class);
Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
File resp = automaticReportsController.generateReport(reportCfg, triggerDate);
assertTrue(file == resp);
ArgumentCaptor<ReportDto> reportDtoCaptor = ArgumentCaptor.forClass(ReportDto.class);
Mockito.verify(reportController).generateReport(reportDtoCaptor.capture());
ReportDto reportDto = reportDtoCaptor.getValue();
assertEquals(reportName, reportDto.getReportName());
assertEquals(printFormat, reportDto.getPrintFormat());
assertEquals(statusId, reportDto.getStatusId());
assertEquals(fromDate, reportDto.getValidFromDate());
assertEquals(toDate, reportDto.getValidToDate());
}
@Test
public void getReportGenerationConfigsTest() {
LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);
automaticReportsController.getReportGenerationConfigs(triggerTimeGreaterEqual, triggerTimeLowerEqual);
Mockito.verify(automaticReportGenerationConfigRepository).findConfigs(3, 1, 5, 9);
}
@Test
public void generateAndDistributeReportsTest() throws SpException, MessagingException, IOException {
LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);
List<ReportGenerationConfig> configs = new ArrayList<>();
ReportGenerationConfig config = sampleReportGenerationConfig();
configs.add(config);
Mockito.when(automaticReportGenerationConfigRepository.findConfigs(3, 1, 5, 9)).thenReturn(configs);
File file = Mockito.mock(File.class);
Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
MimeMessage msg = Mockito.mock(MimeMessage.class);
Mockito.when(msg.getContent()).thenReturn(new MimeMultipart());
Mockito.when(mailHelper.newMultipartMail()).thenReturn(msg);
automaticReportsController.generateAndDistributeReports(triggerTimeGreaterEqual, triggerTimeLowerEqual);
Mockito.verify(reportController).generateReport(Mockito.any(ReportDto.class));
Mockito.verify(mailHelper).send(Mockito.any(MimeMessage.class));
Mockito.verify(archiveHelper).copyFile(Mockito.any(String.class), Mockito.eq("/opt/openk/reports/" + config.getFileNamePattern() + "." + config.getPrintFormat()));
}
@Test
public void generateAndDistributeReportsTestIOException() throws SpException, MessagingException, IOException {
LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);
List<ReportGenerationConfig> configs = new ArrayList<>();
ReportGenerationConfig config = sampleReportGenerationConfig();
configs.add(config);
Mockito.when(automaticReportGenerationConfigRepository.findConfigs(3, 1, 5, 9)).thenReturn(configs);
File file = Mockito.mock(File.class);
Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
Mockito.doThrow(new IOException()).when(archiveHelper).copyFile(Mockito.any(), Mockito.any());
automaticReportsController.generateAndDistributeReports(triggerTimeGreaterEqual, triggerTimeLowerEqual);
}
@Test
public void generateAndDistributeReportsTestSpException() throws SpException, MessagingException, IOException {
LocalDateTime triggerTimeGreaterEqual = LocalDateTime.of(2020, 1, 1, 1, 5);
LocalDateTime triggerTimeLowerEqual = LocalDateTime.of(2020, 1, 1, 1, 9);
List<ReportGenerationConfig> configs = new ArrayList<>();
ReportGenerationConfig config = sampleReportGenerationConfig();
configs.add(config);
Mockito.when(automaticReportGenerationConfigRepository.findConfigs(3, 1, 5, 9)).thenReturn(configs);
File file = Mockito.mock(File.class);
Mockito.when(reportController.generateReport(Mockito.any(ReportDto.class))).thenReturn(file);
Mockito.doThrow(new SpException()).when(reportController).generateReport(Mockito.any());
automaticReportsController.generateAndDistributeReports(triggerTimeGreaterEqual, triggerTimeLowerEqual);
}
@Test
public void sendReportTest() throws MessagingException, IOException {
File reportFile = Mockito.mock(File.class);
String fileName = "fileName";
ReportGenerationConfig cfg = new ReportGenerationConfig();
String subject = "subject";
cfg.setSubject(subject);
String emailText = "mailText";
cfg.setEmailText(emailText);
List<String> toList = new ArrayList<>();
String email = "mail@test.tld";
toList.add(email);
cfg.setTo(toList);
ArgumentCaptor<MimeMessage> msgCaptor = ArgumentCaptor.forClass(MimeMessage.class);
MimeMessage msg = Mockito.mock(MimeMessage.class);
Mockito.when(msg.getContent()).thenReturn(new MimeMultipart());
Mockito.when(mailHelper.newMultipartMail()).thenReturn(msg);
LocalDateTime triggerTime = LocalDateTime.now();
automaticReportsController.sendReport(reportFile, fileName, cfg, triggerTime);
Mockito.verify(mailHelper).send(msgCaptor.capture());
MimeMessage sendMail = msgCaptor.getValue();
assertTrue(sendMail == msg);
}
@Test
public void sendReportTestMessagingException() throws MessagingException, IOException {
File reportFile = Mockito.mock(File.class);
String fileName = "fileName";
ReportGenerationConfig cfg = new ReportGenerationConfig();
String subject = "subject";
cfg.setSubject(subject);
List<String> toList = new ArrayList<>();
String email = "mail@test.tld";
toList.add(email);
cfg.setTo(toList);
MimeMessage msg = Mockito.mock(MimeMessage.class);
Mockito.when(msg.getContent()).thenReturn(new MimeMultipart());
Mockito.when(mailHelper.newMultipartMail()).thenReturn(msg);
Mockito.doThrow(new MessagingException()).when(mailHelper).newMultipartMail();
LocalDateTime triggerTime = LocalDateTime.now();
automaticReportsController.sendReport(reportFile, fileName, cfg, triggerTime);
}
@Test
public void fileNameOfCfgTest() {
ReportGenerationConfig cfg = new ReportGenerationConfig();
String printFormat = "pdf";
String fileNamePattern = "DDD-{Date}-{Time}-{Week}-filename";
cfg.setPrintFormat(printFormat);
cfg.setFileNamePattern(fileNamePattern);
LocalDateTime triggerDateTime = LocalDateTime.of(2020, 1, 1, 1, 5);
String expected = "DDD-2020-01-01-01-05-KW01-filename.pdf";
String fileName = automaticReportsController.fileNameOfCfg(triggerDateTime, cfg);
assertEquals(expected, fileName);
}
@Test
public void testCheckCyclicGenerationSlot() {
LocalDateTime now = LocalDateTime.now(ZoneId.of("Europe/Berlin"));
int weekDay = now.getDayOfWeek().getValue();
int hour = now.getHour();
int minute = now.getMinute();
int minuteGE = ( minute / 5) * 5;
int minuteLE = minuteGE + 5 - 1;
automaticReportsController.checkCyclicGenerationSlot();
Mockito.verify(automaticReportGenerationConfigRepository).findConfigs(weekDay, hour, minuteGE, minuteLE);
}
private ReportGenerationConfig sampleReportGenerationConfig() {
ReportGenerationConfig config = new ReportGenerationConfig();
Integer triggerHour = 1;
Integer triggerMinute = 1;
Integer triggerWeekDay = 1;
Integer validFromDayOffset = -1;
Integer validFromHour = 2;
Integer validFromMinute = 30;
Integer validToDayOffset = 1;
Integer validToHour = 3;
Integer validToMinute = 35;
Long standByListId = 23L;
Long statusId = 4L;
String fileNamePattern = "pattern";
String name = "name";
String printFormat = "pdf";
String reportName = "REPORT_NAME";
String subject = "subject";
config.setFileNamePattern(fileNamePattern);
config.setName(name);
config.setPrintFormat(printFormat);
config.setReportName(reportName);
config.setStandByListId(standByListId);
config.setStatusId(statusId);
config.setSubject(subject);
config.setTriggerHour(triggerHour);
config.setTriggerMinute(triggerMinute);
config.setTriggerWeekDay(triggerWeekDay);
config.setValidFromDayOffset(validFromDayOffset);
config.setValidFromHour(validFromHour);
config.setValidFromMinute(validFromMinute);
config.setValidToDayOffset(validToDayOffset);
config.setValidToHour(validToHour);
config.setValidToMinute(validToMinute);
List<String> to = new ArrayList<>();
to.add("email@test.tld");
config.setTo(to);
config.setEmailText("emailText");
return config;
}
}