org.openmrs.module.reporting.report.renderer.XlsReportRendererTest.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.module.reporting.report.renderer.XlsReportRendererTest.java

Source

/**
 * 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();
    }
}