diff --git a/lib/taskana-core/src/main/java/pro/taskana/report/structure/Report.java b/lib/taskana-core/src/main/java/pro/taskana/report/structure/Report.java index 2fa2ee48c..2e3b849a0 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/report/structure/Report.java +++ b/lib/taskana-core/src/main/java/pro/taskana/report/structure/Report.java @@ -21,15 +21,15 @@ import pro.taskana.impl.report.row.SingleRow; */ public abstract class Report> { - protected List columnHeaders = new ArrayList<>(); + protected List columnHeaders; private Map> reportRows = new LinkedHashMap<>(); private Row sumRow; private String rowDesc; protected Report(List columnHeaders, String rowDesc) { this.rowDesc = rowDesc; - sumRow = new SingleRow<>(columnHeaders.size()); - this.columnHeaders.addAll(columnHeaders); + sumRow = createRow(columnHeaders.size()); + this.columnHeaders = new ArrayList<>(columnHeaders); } public final Map> getRows() { diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportAssembler.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportAssembler.java index 61a58c1b6..b8de8bcc9 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportAssembler.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/resource/ReportAssembler.java @@ -66,15 +66,19 @@ public class ReportAssembler { return resource; } - private > ReportResource toReportResource( - Report report) { + > ReportResource toReportResource(Report report) { + return toReportResource(report, Instant.now()); + } + + > ReportResource toReportResource( + Report report, Instant time) { String[] header = report.getColumnHeaders() .stream() .map(ColumnHeader::getDisplayName) .toArray(String[]::new); ReportResource.MetaInformation meta = new ReportResource.MetaInformation( report.getClass().getSimpleName(), - Instant.now().toString(), + time.toString(), header, report.getRowDesc()); diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ReportResourceTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ReportResourceTest.java new file mode 100644 index 000000000..0b3131728 --- /dev/null +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/rest/resource/ReportResourceTest.java @@ -0,0 +1,421 @@ +package pro.taskana.rest.resource; + +import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +import pro.taskana.impl.report.header.TimeIntervalColumnHeader; +import pro.taskana.impl.report.item.DetailedMonitorQueryItem; +import pro.taskana.impl.report.item.MonitorQueryItem; +import pro.taskana.report.ClassificationReport; +import pro.taskana.report.WorkbasketReport; +import pro.taskana.rest.TestConfiguration; + +/** + * Test for {@link ReportAssembler}. + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {TestConfiguration.class}) +@WebAppConfiguration +public class ReportResourceTest { + + @Autowired + private ReportAssembler reportAssembler; + + private int daysDiff; + private LocalDateTime now; + private List headers; + + @Before + public void before() { + now = LocalDate.parse("2019-01-02").atStartOfDay(); + daysDiff = (int) LocalDateTime.now().until(now, ChronoUnit.DAYS); + headers = IntStream.range(daysDiff - 5, daysDiff) + .mapToObj(TimeIntervalColumnHeader.Date::new) + .collect(Collectors.toList()); + + } + + @Test + public void testEmptyReport() { + // given + WorkbasketReport report = new WorkbasketReport(headers); + // when + ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC)); + // then + + // meta + ReportResource.MetaInformation meta = resource.getMeta(); + assertEquals("WorkbasketReport", meta.getName()); + assertEquals("2019-01-02T00:00:00Z", meta.getDate()); + assertEquals("WORKBASKET KEYS", meta.getRowDesc()); + assertArrayEquals(headers.stream().map(TimeIntervalColumnHeader::getDisplayName).toArray(), meta.getHeader()); + assertEquals("Total", meta.getTotalDesc()); + + // rows + assertTrue(resource.getRows().isEmpty()); + + // sumRow + assertEquals(ReportResource.SingleRowResource.class, resource.getSumRow().getClass()); + assertEquals(0, resource.getSumRow().getTotal()); + Map cells = resource.getSumRow().getCells(); + assertEquals(5, cells.size()); + assertEquals(0, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + } + + @Test + public void testOneSingleRow() { + // given + ClassificationReport report = new ClassificationReport(headers); + MonitorQueryItem item = new MonitorQueryItem(); + item.setAgeInDays(daysDiff - 1); + item.setNumberOfTasks(2); + item.setKey("key"); + report.addItem(item); + // when + ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC)); + // then + + // meta + ReportResource.MetaInformation meta = resource.getMeta(); + assertEquals("ClassificationReport", meta.getName()); + assertEquals("2019-01-02T00:00:00Z", meta.getDate()); + assertEquals("CLASSIFICATION KEYS", meta.getRowDesc()); + assertArrayEquals(headers.stream().map(TimeIntervalColumnHeader::getDisplayName).toArray(), meta.getHeader()); + assertEquals("Total", meta.getTotalDesc()); + + // rows + Map rows = resource.getRows(); + assertEquals(1, rows.size()); + ReportResource.RowResource row = rows.get("key"); + assertEquals(ReportResource.SingleRowResource.class, row.getClass()); + assertEquals(2, row.getTotal()); + Map cells = row.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + // sumRow + ReportResource.RowResource sumRow = resource.getSumRow(); + assertEquals(ReportResource.SingleRowResource.class, sumRow.getClass()); + assertEquals(2, sumRow.getTotal()); + cells = sumRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + } + + @Test + public void testMultipleSingleRows() { + // given + ClassificationReport report = new ClassificationReport(headers); + MonitorQueryItem item = new MonitorQueryItem(); + item.setAgeInDays(daysDiff - 1); + item.setNumberOfTasks(2); + item.setKey("key"); + report.addItem(item); + item.setKey("key2"); + report.addItem(item); + // when + ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC)); + // then + + // meta + ReportResource.MetaInformation meta = resource.getMeta(); + assertEquals("ClassificationReport", meta.getName()); + assertEquals("2019-01-02T00:00:00Z", meta.getDate()); + assertEquals("CLASSIFICATION KEYS", meta.getRowDesc()); + assertArrayEquals(headers.stream().map(TimeIntervalColumnHeader::getDisplayName).toArray(), meta.getHeader()); + assertEquals("Total", meta.getTotalDesc()); + + // rows + Map rows = resource.getRows(); + assertEquals(2, rows.size()); + + ReportResource.RowResource row = rows.get("key"); + assertEquals(ReportResource.SingleRowResource.class, row.getClass()); + assertEquals(2, row.getTotal()); + Map cells = row.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + row = rows.get("key2"); + assertEquals(ReportResource.SingleRowResource.class, row.getClass()); + assertEquals(2, row.getTotal()); + cells = row.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + // sumRow + ReportResource.RowResource sumRow = resource.getSumRow(); + assertEquals(ReportResource.SingleRowResource.class, sumRow.getClass()); + assertEquals(4, sumRow.getTotal()); + cells = sumRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(4, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + } + + @Test + public void testOneFoldableRow() { + // given + ClassificationReport.DetailedClassificationReport report = new ClassificationReport.DetailedClassificationReport( + headers); + DetailedMonitorQueryItem item = new DetailedMonitorQueryItem(); + item.setAgeInDays(daysDiff - 1); + item.setNumberOfTasks(2); + item.setKey("key"); + item.setAttachmentKey("attachement"); + report.addItem(item); + item.setAttachmentKey(null); + report.addItem(item); + // when + ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC)); + // then + + // meta + ReportResource.MetaInformation meta = resource.getMeta(); + assertEquals("DetailedClassificationReport", meta.getName()); + assertEquals("2019-01-02T00:00:00Z", meta.getDate()); + assertEquals("TASK CLASSIFICATION KEYS", meta.getRowDesc()); + assertArrayEquals(headers.stream().map(TimeIntervalColumnHeader::getDisplayName).toArray(), meta.getHeader()); + assertEquals("Total", meta.getTotalDesc()); + + // rows + Map rows = resource.getRows(); + assertEquals(1, rows.size()); + assertEquals(ReportResource.FoldableRowResource.class, rows.get("key").getClass()); + ReportResource.FoldableRowResource row = (ReportResource.FoldableRowResource) rows.get("key"); + assertEquals(4, row.getTotal()); + Map cells = row.getCells(); + assertEquals(5, cells.size()); + assertEquals(4, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + assertEquals(2, row.getFoldableRows().size()); + ReportResource.RowResource foldedRow = row.getFoldableRows().get("attachement"); + assertEquals(ReportResource.SingleRowResource.class, foldedRow.getClass()); + assertEquals(2, foldedRow.getTotal()); + cells = foldedRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + foldedRow = row.getFoldableRows().get("N/A"); + assertEquals(ReportResource.SingleRowResource.class, foldedRow.getClass()); + assertEquals(2, foldedRow.getTotal()); + cells = foldedRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + // sumRow + ReportResource.RowResource sumRow = resource.getSumRow(); + assertEquals(ReportResource.FoldableRowResource.class, sumRow.getClass()); + assertEquals(4, row.getTotal()); + cells = row.getCells(); + assertEquals(5, cells.size()); + assertEquals(4, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + assertEquals(2, row.getFoldableRows().size()); + foldedRow = row.getFoldableRows().get("attachement"); + assertEquals(ReportResource.SingleRowResource.class, foldedRow.getClass()); + assertEquals(2, foldedRow.getTotal()); + cells = foldedRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + foldedRow = row.getFoldableRows().get("N/A"); + assertEquals(ReportResource.SingleRowResource.class, foldedRow.getClass()); + assertEquals(2, foldedRow.getTotal()); + cells = foldedRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + } + + @Test + public void testMultipleFoldableRows() { + // given + ClassificationReport.DetailedClassificationReport report = new ClassificationReport.DetailedClassificationReport( + headers); + DetailedMonitorQueryItem item = new DetailedMonitorQueryItem(); + item.setAgeInDays(daysDiff - 1); + item.setNumberOfTasks(2); + item.setKey("key"); + item.setAttachmentKey("attachement"); + report.addItem(item); + item.setAttachmentKey(null); + report.addItem(item); + item.setKey("key2"); + report.addItem(item); + // when + ReportResource resource = reportAssembler.toReportResource(report, now.toInstant(ZoneOffset.UTC)); + // then + + // meta + ReportResource.MetaInformation meta = resource.getMeta(); + assertEquals("DetailedClassificationReport", meta.getName()); + assertEquals("2019-01-02T00:00:00Z", meta.getDate()); + assertEquals("TASK CLASSIFICATION KEYS", meta.getRowDesc()); + assertArrayEquals(headers.stream().map(TimeIntervalColumnHeader::getDisplayName).toArray(), meta.getHeader()); + assertEquals("Total", meta.getTotalDesc()); + + // rows + Map rows = resource.getRows(); + assertEquals(2, rows.size()); + + assertEquals(ReportResource.FoldableRowResource.class, rows.get("key").getClass()); + ReportResource.FoldableRowResource row = (ReportResource.FoldableRowResource) rows.get("key"); + assertEquals(4, row.getTotal()); + Map cells = row.getCells(); + assertEquals(5, cells.size()); + assertEquals(4, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + assertEquals(2, row.getFoldableRows().size()); + ReportResource.RowResource foldedRow = row.getFoldableRows().get("attachement"); + assertEquals(ReportResource.SingleRowResource.class, foldedRow.getClass()); + assertEquals(2, foldedRow.getTotal()); + cells = foldedRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + foldedRow = row.getFoldableRows().get("N/A"); + assertEquals(ReportResource.SingleRowResource.class, foldedRow.getClass()); + assertEquals(2, foldedRow.getTotal()); + cells = foldedRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + assertEquals(ReportResource.FoldableRowResource.class, rows.get("key2").getClass()); + row = (ReportResource.FoldableRowResource) rows.get("key2"); + assertEquals(2, row.getTotal()); + cells = row.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + assertEquals(1, row.getFoldableRows().size()); + foldedRow = row.getFoldableRows().get("N/A"); + assertEquals(ReportResource.SingleRowResource.class, foldedRow.getClass()); + assertEquals(2, foldedRow.getTotal()); + cells = foldedRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + // sumRow + assertEquals(ReportResource.FoldableRowResource.class, resource.getSumRow().getClass()); + ReportResource.FoldableRowResource sumRow = (ReportResource.FoldableRowResource) resource.getSumRow(); + assertEquals(6, sumRow.getTotal()); + cells = sumRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(6, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + assertEquals(2, sumRow.getFoldableRows().size()); + foldedRow = sumRow.getFoldableRows().get("attachement"); + assertEquals(ReportResource.SingleRowResource.class, foldedRow.getClass()); + assertEquals(2, foldedRow.getTotal()); + cells = foldedRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(2, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + + foldedRow = sumRow.getFoldableRows().get("N/A"); + assertEquals(ReportResource.SingleRowResource.class, foldedRow.getClass()); + assertEquals(4, foldedRow.getTotal()); + cells = foldedRow.getCells(); + assertEquals(5, cells.size()); + assertEquals(4, cells.get("2019-01-01").intValue()); + assertEquals(0, cells.get("2018-12-31").intValue()); + assertEquals(0, cells.get("2018-12-30").intValue()); + assertEquals(0, cells.get("2018-12-29").intValue()); + assertEquals(0, cells.get("2018-12-28").intValue()); + } + +}