package gov.samhsa.consent2share.web.controller.report;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
import gov.samhsa.consent2share.infrastructure.report.AbstractReportConfig;
import gov.samhsa.consent2share.infrastructure.report.ReportDataProvider;
import gov.samhsa.consent2share.infrastructure.report.ReportFormat;
import gov.samhsa.consent2share.infrastructure.report.ReportUtils;
import gov.samhsa.consent2share.infrastructure.report.RequestScopedParameters;
import gov.samhsa.consent2share.infrastructure.report.RequestScopedParametersProvider;
import gov.samhsa.consent2share.service.dto.ManagerReportEntryDto;
import gov.samhsa.consent2share.web.config.report.ManagerReportConfig;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@RunWith(MockitoJUnitRunner.class)
public class ManagerReportControllerTest {
@Rule
public ExpectedException thrownException = ExpectedException.none();
@Mock
private ReportDataProvider reportDataProvider;
@Mock
private AbstractReportConfig abstractReportConfig;
@Mock
private RequestScopedParametersProvider requestScopedParametersProvider;
@Mock
private ReportUtils reportUtils;
@InjectMocks
private ManagerReportController sut;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
final InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/view/");
viewResolver.setSuffix(".jsp");
mockMvc = MockMvcBuilders.standaloneSetup(this.sut)
.setViewResolvers(viewResolver).build();
}
@SuppressWarnings("unchecked")
@Test
public void testHandleReportRequest() throws Exception {
final ReportFormat format = ReportFormat.HTML;
DateTimeFormatter df = DateTimeFormatter.ofPattern("MM/dd/yyyy");
final LocalDate startDate = LocalDate.parse("03/01/2015",df);
final LocalDate endDate = LocalDate.parse("06/01/2015",df);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
final LocalDateTime startDateTime = LocalDateTime.parse("03/01/2015 00:00:00", dtf);
final LocalDateTime endDateTime = LocalDateTime.parse("06/01/2015 23:59:59", dtf);
when(reportUtils.getStartDateTime(startDate)).thenReturn(startDateTime);
when(reportUtils.getEndDateTime(endDate)).thenReturn(endDateTime);
final Boolean noInformation = false;
final Boolean noDescription = false;
final ManagerReportEntryDto entry = new ManagerReportEntryDto();
final long startSqlTimeStamp = 1425186000000l;
when(reportUtils.convertLocalDateTimeToEpoch(startDateTime)).thenReturn(startSqlTimeStamp);
final long endSqlTimeStamp = 1433217599000l;
when(reportUtils.convertLocalDateTimeToEpoch(endDateTime)).thenReturn(endSqlTimeStamp);
Object[] args = new Object[] { startSqlTimeStamp, endSqlTimeStamp };
@SuppressWarnings("rawtypes")
final Collection managerReport = Arrays.asList(entry);
when(reportDataProvider.getReportData(args)).thenReturn(managerReport);
final RequestScopedParameters requestScopedParameters = new RequestScopedParameters();
requestScopedParameters.add("startDateTime", startDateTime);
requestScopedParameters.add("endDateTime", endDateTime);
requestScopedParameters.add("noInformation", noInformation);
requestScopedParameters.add("noDescription", noDescription);
when(requestScopedParametersProvider.getRequestScopedParameters()).thenReturn(requestScopedParameters);
final Map<String, Object> parameters = new HashMap<>();
final String key = "key";
final Object value = "value";
parameters.put(key, value);
when(
abstractReportConfig.configure(eq(format),
any(JRDataSource.class))).thenReturn(parameters);
when(abstractReportConfig.getReportName()).thenReturn(
ManagerReportConfig.REPORT_NAME);
// Act
mockMvc.perform(get("/Administrator/reports/managerReport?startDate="+startDate.format(df)+"&endDate="+endDate.format(df)))
.andExpect(status().isOk())
.andExpect(model().attribute("key", "value"))
.andExpect(model().size(parameters.size()))
.andExpect(view().name(ManagerReportConfig.REPORT_NAME));
// Assert
verify(reportDataProvider, times(1)).getReportData(args);
verify(abstractReportConfig, times(1)).configure(eq(format),
any(JRDataSource.class));
}
@SuppressWarnings("unchecked")
@Test
public void testHandleReportRequest_CSV() throws Exception {
final ReportFormat format = ReportFormat.CSV;
DateTimeFormatter df = DateTimeFormatter.ofPattern("MM/dd/yyyy");
final LocalDate startDate = LocalDate.parse("03/01/2015",df);
final LocalDate endDate = LocalDate.parse("06/01/2015",df);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
final LocalDateTime startDateTime = LocalDateTime.parse("03/01/2015 00:00:00", dtf);
final LocalDateTime endDateTime = LocalDateTime.parse("06/01/2015 23:59:59", dtf);
when(reportUtils.getStartDateTime(startDate)).thenReturn(startDateTime);
when(reportUtils.getEndDateTime(endDate)).thenReturn(endDateTime);
final Boolean noInformation = false;
final Boolean noDescription = false;
final ManagerReportEntryDto entry = new ManagerReportEntryDto();
final long startSqlTimeStamp = 1425186000000l;
when(reportUtils.convertLocalDateTimeToEpoch(startDateTime)).thenReturn(startSqlTimeStamp);
final long endSqlTimeStamp = 1433217599000l;
when(reportUtils.convertLocalDateTimeToEpoch(endDateTime)).thenReturn(endSqlTimeStamp);
Object[] args = new Object[] { startSqlTimeStamp, endSqlTimeStamp };
@SuppressWarnings("rawtypes")
final Collection managerReport = Arrays.asList(entry);
when(reportDataProvider.getReportData(args)).thenReturn(managerReport);
final RequestScopedParameters requestScopedParameters = new RequestScopedParameters();
requestScopedParameters.add("startDateTime", startDateTime);
requestScopedParameters.add("endDateTime", endDateTime);
requestScopedParameters.add("noInformation", noInformation);
requestScopedParameters.add("noDescription", noDescription);
when(requestScopedParametersProvider.getRequestScopedParameters()).thenReturn(requestScopedParameters);
final Map<String, Object> parameters = new HashMap<>();
final String key = "key";
final Object value = "value";
parameters.put(key, value);
when(
abstractReportConfig.configure(eq(format),
any(JRDataSource.class))).thenReturn(parameters);
when(abstractReportConfig.getReportName()).thenReturn(
ManagerReportConfig.REPORT_NAME);
// Act
mockMvc.perform(get("/Administrator/reports/managerReport?format="
+ format.getFormat().toUpperCase()+"&startDate="+startDate.format(df)+"&endDate="+endDate.format(df)))
.andExpect(status().isOk())
.andExpect(model().attribute("key", "value"))
.andExpect(model().size(parameters.size()))
.andExpect(view().name(ManagerReportConfig.REPORT_NAME));
// Assert
verify(reportDataProvider, times(1)).getReportData(args);
verify(abstractReportConfig, times(1)).configure(eq(format),
any(JRDataSource.class));
}
@SuppressWarnings("unchecked")
@Test
public void testHandleReportRequest_HTML() throws Exception {
final ReportFormat format = ReportFormat.HTML;
DateTimeFormatter df = DateTimeFormatter.ofPattern("MM/dd/yyyy");
final LocalDate startDate = LocalDate.parse("03/01/2015",df);
final LocalDate endDate = LocalDate.parse("06/01/2015",df);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
final LocalDateTime startDateTime = LocalDateTime.parse("03/01/2015 00:00:00", dtf);
final LocalDateTime endDateTime = LocalDateTime.parse("06/01/2015 23:59:59", dtf);
when(reportUtils.getStartDateTime(startDate)).thenReturn(startDateTime);
when(reportUtils.getEndDateTime(endDate)).thenReturn(endDateTime);
final Boolean noInformation = false;
final Boolean noDescription = false;
final ManagerReportEntryDto entry = new ManagerReportEntryDto();
final long startSqlTimeStamp = 1425186000000l;
when(reportUtils.convertLocalDateTimeToEpoch(startDateTime)).thenReturn(startSqlTimeStamp);
final long endSqlTimeStamp = 1433217599000l;
when(reportUtils.convertLocalDateTimeToEpoch(endDateTime)).thenReturn(endSqlTimeStamp);
Object[] args = new Object[] { startSqlTimeStamp, endSqlTimeStamp };
@SuppressWarnings("rawtypes")
final Collection managerReport = Arrays.asList(entry);
when(reportDataProvider.getReportData(args)).thenReturn(managerReport);
final RequestScopedParameters requestScopedParameters = new RequestScopedParameters();
requestScopedParameters.add("startDateTime", startDateTime);
requestScopedParameters.add("endDateTime", endDateTime);
requestScopedParameters.add("noInformation", noInformation);
requestScopedParameters.add("noDescription", noDescription);
when(requestScopedParametersProvider.getRequestScopedParameters()).thenReturn(requestScopedParameters);
final Map<String, Object> parameters = new HashMap<>();
final String key = "key";
final Object value = "value";
parameters.put(key, value);
when(
abstractReportConfig.configure(eq(format),
any(JRDataSource.class))).thenReturn(parameters);
when(abstractReportConfig.getReportName()).thenReturn(
ManagerReportConfig.REPORT_NAME);
// Act
mockMvc.perform(get("/Administrator/reports/managerReport?format="
+ format.getFormat().toUpperCase()+"&startDate="+startDate.format(df)+"&endDate="+endDate.format(df)))
.andExpect(status().isOk())
.andExpect(model().attribute("key", "value"))
.andExpect(model().size(parameters.size()))
.andExpect(view().name(ManagerReportConfig.REPORT_NAME));
// Assert
verify(reportDataProvider, times(1)).getReportData(args);
verify(abstractReportConfig, times(1)).configure(eq(format),
any(JRDataSource.class));
}
@SuppressWarnings("unchecked")
@Test
public void testHandleReportRequest_PDF() throws Exception {
final ReportFormat format = ReportFormat.PDF;
DateTimeFormatter df = DateTimeFormatter.ofPattern("MM/dd/yyyy");
final LocalDate startDate = LocalDate.parse("03/01/2015",df);
final LocalDate endDate = LocalDate.parse("06/01/2015",df);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
final LocalDateTime startDateTime = LocalDateTime.parse("03/01/2015 00:00:00", dtf);
final LocalDateTime endDateTime = LocalDateTime.parse("06/01/2015 23:59:59", dtf);
when(reportUtils.getStartDateTime(startDate)).thenReturn(startDateTime);
when(reportUtils.getEndDateTime(endDate)).thenReturn(endDateTime);
final Boolean noInformation = false;
final Boolean noDescription = false;
final ManagerReportEntryDto entry = new ManagerReportEntryDto();
final long startSqlTimeStamp = 1425186000000l;
when(reportUtils.convertLocalDateTimeToEpoch(startDateTime)).thenReturn(startSqlTimeStamp);
final long endSqlTimeStamp = 1433217599000l;
when(reportUtils.convertLocalDateTimeToEpoch(endDateTime)).thenReturn(endSqlTimeStamp);
Object[] args = new Object[] { startSqlTimeStamp, endSqlTimeStamp };
@SuppressWarnings("rawtypes")
final Collection managerReport = Arrays.asList(entry);
when(reportDataProvider.getReportData(args)).thenReturn(managerReport);
final RequestScopedParameters requestScopedParameters = new RequestScopedParameters();
requestScopedParameters.add("startDateTime", startDateTime);
requestScopedParameters.add("endDateTime", endDateTime);
requestScopedParameters.add("noInformation", noInformation);
requestScopedParameters.add("noDescription", noDescription);
when(requestScopedParametersProvider.getRequestScopedParameters()).thenReturn(requestScopedParameters);
final Map<String, Object> parameters = new HashMap<>();
final String key = "key";
final Object value = "value";
parameters.put(key, value);
when(
abstractReportConfig.configure(eq(format),
any(JRDataSource.class))).thenReturn(parameters);
when(abstractReportConfig.getReportName()).thenReturn(
ManagerReportConfig.REPORT_NAME);
// Act
mockMvc.perform(get("/Administrator/reports/managerReport?format="
+ format.getFormat().toUpperCase()+"&startDate="+startDate.format(df)+"&endDate="+endDate.format(df)))
.andExpect(status().isOk())
.andExpect(model().attribute("key", "value"))
.andExpect(model().size(parameters.size()))
.andExpect(view().name(ManagerReportConfig.REPORT_NAME));
// Assert
verify(reportDataProvider, times(1)).getReportData(args);
verify(abstractReportConfig, times(1)).configure(eq(format),
any(JRDataSource.class));
}
@SuppressWarnings("unchecked")
@Test
public void testHandleReportRequest_XLS() throws Exception {
final ReportFormat format = ReportFormat.XLS;
DateTimeFormatter df = DateTimeFormatter.ofPattern("MM/dd/yyyy");
final LocalDate startDate = LocalDate.parse("03/01/2015",df);
final LocalDate endDate = LocalDate.parse("06/01/2015",df);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
final LocalDateTime startDateTime = LocalDateTime.parse("03/01/2015 00:00:00", dtf);
final LocalDateTime endDateTime = LocalDateTime.parse("06/01/2015 23:59:59", dtf);
when(reportUtils.getStartDateTime(startDate)).thenReturn(startDateTime);
when(reportUtils.getEndDateTime(endDate)).thenReturn(endDateTime);
final Boolean noInformation = false;
final Boolean noDescription = false;
final ManagerReportEntryDto entry = new ManagerReportEntryDto();
final long startSqlTimeStamp = 1425186000000l;
when(reportUtils.convertLocalDateTimeToEpoch(startDateTime)).thenReturn(startSqlTimeStamp);
final long endSqlTimeStamp = 1433217599000l;
when(reportUtils.convertLocalDateTimeToEpoch(endDateTime)).thenReturn(endSqlTimeStamp);
Object[] args = new Object[] { startSqlTimeStamp, endSqlTimeStamp };
@SuppressWarnings("rawtypes")
final Collection managerReport = Arrays.asList(entry);
when(reportDataProvider.getReportData(args)).thenReturn(managerReport);
final RequestScopedParameters requestScopedParameters = new RequestScopedParameters();
requestScopedParameters.add("startDateTime", startDateTime);
requestScopedParameters.add("endDateTime", endDateTime);
requestScopedParameters.add("noInformation", noInformation);
requestScopedParameters.add("noDescription", noDescription);
when(requestScopedParametersProvider.getRequestScopedParameters()).thenReturn(requestScopedParameters);
final Map<String, Object> parameters = new HashMap<>();
final String key = "key";
final Object value = "value";
parameters.put(key, value);
when(
abstractReportConfig.configure(eq(format),
any(JRDataSource.class))).thenReturn(parameters);
when(abstractReportConfig.getReportName()).thenReturn(
ManagerReportConfig.REPORT_NAME);
// Act
mockMvc.perform(get("/Administrator/reports/managerReport?format="
+ format.getFormat().toUpperCase()+"&startDate="+startDate.format(df)+"&endDate="+endDate.format(df)))
.andExpect(status().isOk())
.andExpect(model().attribute("key", "value"))
.andExpect(model().size(parameters.size()))
.andExpect(view().name(ManagerReportConfig.REPORT_NAME));
// Assert
verify(reportDataProvider, times(1)).getReportData(args);
verify(abstractReportConfig, times(1)).configure(eq(format),
any(JRDataSource.class));
}
}