/** * The contents of this file are subject to the OpenMRS Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.module.reporting.report.renderer; import org.junit.Assert; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellUtil; import org.junit.Test; import org.openmrs.module.reporting.common.ExcelUtil; import org.openmrs.module.reporting.dataset.definition.SqlDataSetDefinition; import org.openmrs.module.reporting.evaluation.EvaluationContext; import org.openmrs.module.reporting.evaluation.parameter.Mapped; import org.openmrs.module.reporting.evaluation.parameter.Parameter; import org.openmrs.module.reporting.report.ReportData; import org.openmrs.module.reporting.report.ReportDesign; import org.openmrs.module.reporting.report.definition.ReportDefinition; import org.openmrs.module.reporting.report.definition.service.ReportDefinitionService; import org.openmrs.test.BaseModuleContextSensitiveTest; import org.springframework.beans.factory.annotation.Autowired; import java.io.File; import java.io.FileOutputStream; import java.util.Properties; /** * Verify that XlsReportRenderer outputs as expected */ public class XlsReportRendererTest extends BaseModuleContextSensitiveTest { @Autowired ReportDefinitionService reportDefinitionService; @Test public void testXlsReportRenderingWithoutHeaders() throws Exception { Workbook wb = renderToXls(false); Assert.assertEquals(3, wb.getNumberOfSheets()); Assert.assertNotNull(wb.getSheet("males")); Assert.assertNotNull(wb.getSheet("females")); Assert.assertNotNull(wb.getSheet("encounters")); testValue(wb, "males", 1, 1, "patient_id"); testValue(wb, "males", 1, 2, "gender"); testValue(wb, "males", 1, 3, "birthdate"); } @Test public void testXlsReportRenderingWithHeaders() throws Exception { Workbook wb = renderToXls(true); Assert.assertEquals(3, wb.getNumberOfSheets()); testValue(wb, "males", 1, 1, "Gender Data Set"); testValue(wb, "females", 1, 1, "Gender Data Set"); testValue(wb, "encounters", 1, 1, "encounters"); testValue(wb, "males", 2, 1, "Gender:"); testValue(wb, "males", 2, 2, "M"); testValue(wb, "females", 2, 1, "Gender:"); testValue(wb, "females", 2, 2, "F"); testValue(wb, "encounters", 2, 1, ""); testValue(wb, "encounters", 2, 1, ""); } public void testValue(Workbook wb, String sheetName, int rowNum, int colNum, String value) { Sheet sheet = wb.getSheet(sheetName); Row row = CellUtil.getRow(rowNum-1, sheet); Cell cell = CellUtil.getCell(row, colNum-1); Assert.assertEquals(value.toLowerCase(), cell.getStringCellValue().toLowerCase()); } protected ReportDefinition getReportDefinition() { ReportDefinition rd = new ReportDefinition(); rd.setName("Testing"); SqlDataSetDefinition namedDataSet = new SqlDataSetDefinition(); namedDataSet.setName("Gender Data Set"); namedDataSet.addParameter(new Parameter("gender", "Gender", String.class)); namedDataSet.setSqlQuery("select p.patient_id, n.gender, n.birthdate from patient p, person n where p.patient_id = n.person_id and n.gender = :gender"); rd.addDataSetDefinition("males", Mapped.map(namedDataSet, "gender=M")); rd.addDataSetDefinition("females", Mapped.map(namedDataSet, "gender=F")); SqlDataSetDefinition unnamedDataSet = new SqlDataSetDefinition(); unnamedDataSet.setSqlQuery("select encounter_id, patient_id, encounter_datetime from encounter"); rd.addDataSetDefinition("encounters", unnamedDataSet, null); return rd; } protected Workbook renderToXls(boolean includeHeaders) throws Exception { ReportDefinition rd = getReportDefinition(); ReportData data = reportDefinitionService.evaluate(rd, new EvaluationContext()); final ReportDesign design = new ReportDesign(); design.setName("TestDesign"); design.setReportDefinition(rd); design.setRendererType(XlsReportRenderer.class); Properties props = new Properties(); props.setProperty(XlsReportRenderer.INCLUDE_DATASET_NAME_AND_PARAMETERS_PROPERTY, Boolean.toString(includeHeaders)); design.setProperties(props); XlsReportRenderer renderer = new XlsReportRenderer() { public ReportDesign getDesign(String argument) { return design; } }; String outFile = System.getProperty("java.io.tmpdir") + File.separator + "xlsReportRendererTest"+includeHeaders+".xls"; FileOutputStream fos = new FileOutputStream(outFile); renderer.render(data, "xxx:xls", fos); fos.close(); return ExcelUtil.loadWorkbookFromFile(outFile); } @Test public void renderToXlsWithPassword() throws Exception { ReportDefinition rd = getReportDefinition(); ReportData data = reportDefinitionService.evaluate(rd, new EvaluationContext()); final ReportDesign design = new ReportDesign(); design.setName("TestDesign"); design.setReportDefinition(rd); design.setRendererType(XlsReportRenderer.class); Properties props = new Properties(); props.setProperty(XlsReportRenderer.PASSWORD_PROPERTY, "foobar"); design.setProperties(props); XlsReportRenderer renderer = new XlsReportRenderer() { public ReportDesign getDesign(String argument) { return design; } }; String outFile = System.getProperty("java.io.tmpdir") + File.separator + "renderToXlsWithPassword"+".xls"; FileOutputStream fos = new FileOutputStream(outFile); renderer.render(data, "xxx:xls", fos); fos.close(); } }