/** * 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.reporting.export; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import java.io.File; import java.util.Calendar; import java.util.GregorianCalendar; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Test; import org.openmrs.Cohort; import org.openmrs.api.context.Context; import org.openmrs.test.BaseContextSensitiveTest; import org.openmrs.util.OpenmrsUtil; /** * Tests the {@link DataExportReportObject} class TODO clean up, finish, add methods to this test * class */ public class DataExportTest extends BaseContextSensitiveTest { private Log log = LogFactory.getLog(getClass()); /** * TODO finish and comment method * * @throws Exception */ @Test public void shouldCalcuateAge() throws Exception { executeDataSet("org/openmrs/reporting/export/include/DataExportTest-patients.xml"); DataExportReportObject export = new DataExportReportObject(); export.setName("TEST_EXPORT"); SimpleColumn patientId = new SimpleColumn(); patientId.setColumnName("PATIENT_ID"); patientId.setReturnValue("$!{fn.patientId}"); export.getColumns().add(patientId); SimpleColumn gender = new SimpleColumn(); gender.setColumnName("GENDER"); gender.setReturnValue("$!{fn.getPatientAttr('Person', 'gender')}"); export.getColumns().add(gender); SimpleColumn birthdate = new SimpleColumn(); birthdate.setColumnName("BIRTHDATE"); birthdate.setReturnValue("$!{fn.formatDate('short', $fn.getPatientAttr('Person', 'birthdate'))}"); export.getColumns().add(birthdate); SimpleColumn age = new SimpleColumn(); age.setColumnName("AGE"); age.setReturnValue("$!{fn.calculateAge($fn.getPatientAttr('Person', 'birthdate'))}"); export.getColumns().add(age); Cohort patients = new Cohort(); patients.addMember(2); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); String expectedOutput = "PATIENT_ID GENDER BIRTHDATE AGE\n2 M 01/01/2000 XXX\n"; // adjust expected output for every year Calendar cal = new GregorianCalendar(); int expectedAge = cal.get(Calendar.YEAR); expectedOutput = expectedOutput.replace("XXX", String.valueOf(expectedAge - 2000)); String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: " + output); assertEquals("The output is not right.", expectedOutput, output); } /** * Tests the getFirstNObsWithValues method in the DataExportFunctions class * * @throws Exception */ @Test public void shouldFirstNObs() throws Exception { log.debug("Testing execution time - start"); executeDataSet("org/openmrs/reporting/export/include/DataExportTest-patients.xml"); executeDataSet("org/openmrs/reporting/export/include/DataExportTest-obs.xml"); DataExportReportObject export = new DataExportReportObject(); export.setName("FIRST 2 WEIGHTS"); SimpleColumn patientId = new SimpleColumn(); patientId.setColumnName("PATIENT_ID"); patientId.setReturnValue("$!{fn.patientId}"); export.getColumns().add(patientId); ConceptColumn firstNObs = new ConceptColumn(); firstNObs.setColumnName("WEIGHT"); firstNObs.setColumnType("concept"); firstNObs.setConceptId(5089); firstNObs.setConceptName("Weight (KG)"); firstNObs.setExtras(new String[] { "location" }); firstNObs.setModifier(DataExportReportObject.MODIFIER_FIRST_NUM); firstNObs.setModifierNum(2); export.getColumns().add(firstNObs); Cohort patients = new Cohort(); patients.addMember(2); log.debug("Testing execution time - middle"); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); log.debug("Testing execution time - end"); //System.out.println("Template String: " + export.generateTemplate()); String expectedOutput = "PATIENT_ID \"WEIGHT\" \"WEIGHT_location\" \"WEIGHT_(1)\" \"WEIGHT_location_(1)\"\n2 1.0 Test Location 2.0 Test Location\n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: \n" + output); assertEquals("The output is not right.", expectedOutput, output); // test 1 as the number of obs to fetch export = new DataExportReportObject(); export.setName("FIRST 1 WEIGHTS"); export.addSimpleColumn("PATIENT_ID", "$!{fn.patientId}"); firstNObs = new ConceptColumn(); firstNObs.setColumnName("WEIGHT"); firstNObs.setColumnType("concept"); firstNObs.setConceptId(5089); firstNObs.setConceptName("Weight (KG)"); firstNObs.setExtras(new String[] { "location" }); firstNObs.setModifier(DataExportReportObject.MODIFIER_FIRST_NUM); firstNObs.setModifierNum(1); export.getColumns().add(firstNObs); DataExportUtil.generateExport(export, patients, "\t", null); exportFile = DataExportUtil.getGeneratedFile(export); //System.out.println("Template String: " + export.generateTemplate()); expectedOutput = "PATIENT_ID \"WEIGHT\" \"WEIGHT_location\"\n2 1.0 Test Location\n"; output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: " + output); assertEquals("The output is not what was expected", expectedOutput, output); // test -1 as the number of obs to fetch export = new DataExportReportObject(); export.setName("FIRST -1 WEIGHTS"); export.addSimpleColumn("PATIENT_ID", "$!{fn.patientId}"); firstNObs = new ConceptColumn(); firstNObs.setColumnName("WEIGHT"); firstNObs.setColumnType("concept"); firstNObs.setConceptId(5089); firstNObs.setConceptName("Weight (KG)"); firstNObs.setExtras(new String[] { "location" }); firstNObs.setModifier(DataExportReportObject.MODIFIER_FIRST_NUM); firstNObs.setModifierNum(-1); export.getColumns().add(firstNObs); DataExportUtil.generateExport(export, patients, "\t", null); exportFile = DataExportUtil.getGeneratedFile(export); //System.out.println("Template String: \n" + export.generateTemplate()); expectedOutput = "PATIENT_ID \"WEIGHT\" \"WEIGHT_location\"\n2 10.0 Test Location 9.0 Test Location 8.0 Test Location 7.0 Test Location 6.0 Test Location 5.0 Test Location 4.0 Test Location 3.0 Test Location 2.0 Test Location 1.0 Test Location\n"; output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: " + output); assertEquals("The output is not what was expected", expectedOutput, output); } /** * test first N function when there are no obs for it. Make sure that it returns blank cells * instead of null cells * * @throws Exception */ @Test public void shouldFirstNObsWithZeroObsReturned() throws Exception { executeDataSet("org/openmrs/reporting/export/include/DataExportTest-patients.xml"); executeDataSet("org/openmrs/reporting/export/include/DataExportTest-obs.xml"); DataExportReportObject export = new DataExportReportObject(); export.setName("NO CONCEPT, THEN GET WEIGHTS"); export.addSimpleColumn("PATIENT_ID", "$!{fn.patientId}"); // no obs should be returned for concept "5090" ConceptColumn firstNObs = new ConceptColumn(); firstNObs.setColumnName("Other"); firstNObs.setColumnType("concept"); firstNObs.setConceptId(5090); firstNObs.setConceptName("OTHER CONCEPT"); firstNObs.setExtras(new String[] { "obsDatetime" }); firstNObs.setModifier(DataExportReportObject.MODIFIER_FIRST_NUM); firstNObs.setModifierNum(2); export.getColumns().add(firstNObs); ConceptColumn lastNObs = new ConceptColumn(); lastNObs.setColumnName("W-last"); lastNObs.setColumnType("concept"); lastNObs.setConceptId(5089); lastNObs.setConceptName("Weight (KG)"); lastNObs.setExtras(new String[] { "obsDatetime" }); lastNObs.setModifier(DataExportReportObject.MODIFIER_LAST_NUM); lastNObs.setModifierNum(2); export.getColumns().add(lastNObs); Cohort patients = new Cohort(); patients.addMember(2); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); //System.out.println("Template String: \n" + export.generateTemplate()); String expectedOutput = "PATIENT_ID \"Other\" \"Other_obsDatetime\" \"Other_(1)\" \"Other_obsDatetime_(1)\" \"W-last\" \"W-last_obsDatetime\" \"W-last_(1)\" \"W-last_obsDatetime_(1)\"\n2 10.0 18/02/2006 9.0 17/02/2006\n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: \n" + output); assertEquals("The output is not right.", expectedOutput, output); } /** * Tests the getFirstObs and getFirstObsWithValues methods in the DataExportFunctions class * * @throws Exception */ @Test public void shouldFirstObs() throws Exception { executeDataSet("org/openmrs/reporting/export/include/DataExportTest-patients.xml"); executeDataSet("org/openmrs/reporting/export/include/DataExportTest-obs.xml"); DataExportReportObject export = new DataExportReportObject(); export.setName("FIRST WEIGHT"); SimpleColumn patientId = new SimpleColumn(); patientId.setColumnName("PATIENT_ID"); patientId.setReturnValue("$!{fn.patientId}"); export.getColumns().add(patientId); ConceptColumn firstObs = new ConceptColumn(); firstObs.setColumnName("WEIGHT"); firstObs.setColumnType("concept"); firstObs.setConceptId(5089); firstObs.setConceptName("Weight (KG)"); firstObs.setModifier(DataExportReportObject.MODIFIER_FIRST); export.getColumns().add(firstObs); Cohort patients = new Cohort(); patients.addMember(2); //System.out.println("Template String: \n" + export.generateTemplate()); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); String expectedOutput = "PATIENT_ID\t\"WEIGHT\"\n2\t1.0\n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: \n" + output); assertEquals("The output is not right.", expectedOutput, output); // first obs with location export = new DataExportReportObject(); export.setName("FIRST WEIGHT WITH LOCATION"); export.getColumns().add(patientId); firstObs = new ConceptColumn(); firstObs.setColumnName("WEIGHT"); firstObs.setColumnType("concept"); firstObs.setConceptId(5089); firstObs.setConceptName("Weight (KG)"); firstObs.setExtras(new String[] { "location" }); firstObs.setModifier(DataExportReportObject.MODIFIER_FIRST); export.getColumns().add(firstObs); //System.out.println("Template String: \n" + export.generateTemplate()); DataExportUtil.generateExport(export, patients, "\t", null); exportFile = DataExportUtil.getGeneratedFile(export); expectedOutput = "PATIENT_ID\t\"WEIGHT\"\t\"WEIGHT_location\"\n2\t1.0\tTest Location\n"; output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: \n" + output); assertEquals("The output is not right.", expectedOutput, output); } /** * Tests the getLastNObsWithValues method in the DataExportFunctions class * * @throws Exception */ @Test public void shouldLastNObs() throws Exception { executeDataSet("org/openmrs/reporting/export/include/DataExportTest-patients.xml"); executeDataSet("org/openmrs/reporting/export/include/DataExportTest-obs.xml"); DataExportReportObject export = new DataExportReportObject(); export.setName("Last 2 Weights"); SimpleColumn patientId = new SimpleColumn(); patientId.setColumnName("PATIENT_ID"); patientId.setReturnValue("$!{fn.patientId}"); export.getColumns().add(patientId); ConceptColumn lastNObs = new ConceptColumn(); lastNObs.setColumnName("WEIGHT"); lastNObs.setColumnType("concept"); lastNObs.setConceptId(5089); lastNObs.setConceptName("Weight (KG)"); lastNObs.setExtras(new String[] { "location" }); lastNObs.setModifier(DataExportReportObject.MODIFIER_LAST_NUM); lastNObs.setModifierNum(2); export.getColumns().add(lastNObs); Cohort patients = new Cohort(); patients.addMember(2); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); String expectedOutput = "PATIENT_ID \"WEIGHT\" \"WEIGHT_location\" \"WEIGHT_(1)\" \"WEIGHT_location_(1)\"\n2 10.0 Test Location 9.0 Test Location\n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: " + output); assertEquals("The output is not right.", expectedOutput, output); export = new DataExportReportObject(); export.setName("Last 1 weights"); patientId = new SimpleColumn(); patientId.setColumnName("PATIENT_ID"); patientId.setReturnValue("$!{fn.patientId}"); export.getColumns().add(patientId); lastNObs = new ConceptColumn(); lastNObs.setColumnName("WEIGHT"); lastNObs.setColumnType("concept"); lastNObs.setConceptId(5089); lastNObs.setConceptName("Weight (KG)"); lastNObs.setExtras(new String[] { "location" }); lastNObs.setModifier(DataExportReportObject.MODIFIER_LAST_NUM); lastNObs.setModifierNum(1); export.getColumns().add(lastNObs); DataExportUtil.generateExport(export, patients, "\t", null); exportFile = DataExportUtil.getGeneratedFile(export); //System.out.println("Template String: \n" + export.generateTemplate()); expectedOutput = "PATIENT_ID \"WEIGHT\" \"WEIGHT_location\"\n2 10.0 Test Location\n"; output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("xxxxxxxxxxxxxxxxxxexportFile: " + output); assertEquals("The output is not right.", expectedOutput, output); } /** * Tests the data export keys * * @throws Exception */ @Test public void shouldDataExportKeyAddition() throws Exception { executeDataSet("org/openmrs/reporting/export/include/DataExportTest-patients.xml"); DataExportReportObject export = new DataExportReportObject(); export.setName("Data Export Keys"); SimpleColumn patientId = new SimpleColumn(); patientId.setColumnName("PATIENT_ID"); patientId.setReturnValue("$!{fn.patientId}"); export.getColumns().add(patientId); // this is the column that will be using the key SimpleColumn dataExportKey = new SimpleColumn(); dataExportKey.setColumnName("bobkey"); dataExportKey.setReturnValue("$!{bob}"); export.getColumns().add(dataExportKey); Cohort patients = new Cohort(); patients.addMember(2); // add the key so that we can use it DataExportUtil.putDataExportKey("bob", "joe"); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); String expectedOutput = "PATIENT_ID bobkey\n2 joe\n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: " + output); assertEquals("The output is not right.", expectedOutput, output); } /** * Tests removing data export keys * * @throws Exception */ @Test public void shouldDataExportKeyRemoval() throws Exception { executeDataSet("org/openmrs/reporting/export/include/DataExportTest-patients.xml"); DataExportReportObject export = new DataExportReportObject(); export.setName("Data Export Keys"); SimpleColumn patientId = new SimpleColumn(); patientId.setColumnName("PATIENT_ID"); patientId.setReturnValue("$!{fn.patientId}"); export.getColumns().add(patientId); // this is the column that will be using the key SimpleColumn dataExportKey = new SimpleColumn(); dataExportKey.setColumnName("bobkey"); dataExportKey.setReturnValue("$!{bob}"); export.getColumns().add(dataExportKey); Cohort patients = new Cohort(); patients.addMember(2); // add the key so that we can use it DataExportUtil.putDataExportKey("bob", "joe"); // remove the key now and try the data export DataExportUtil.removeDataExportKey("bob"); // try to remove things that aren't there DataExportUtil.removeDataExportKey("bob"); DataExportUtil.removeDataExportKey("asdfasdf"); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); String expectedOutput = "PATIENT_ID bobkey\n2 \n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: " + output); assertEquals("The output is not right.", expectedOutput, output); } /** * Tests getting data export keys * * @throws Exception */ @Test public void shouldDataExportKeyGetting() throws Exception { // add the key so that we can use it DataExportUtil.putDataExportKey("bob", "joe"); assertEquals("joe", DataExportUtil.getDataExportKey("bob")); // get a bogus key. should return null (and not error out) assertNull(DataExportUtil.getDataExportKey("asdfasdf")); } /** * Test the name option for data exports * * @throws Exception */ @Test public void shouldGetNames() throws Exception { executeDataSet("org/openmrs/reporting/export/include/DataExportTest-patients.xml"); DataExportReportObject export = new DataExportReportObject(); export.setName("Given names export"); export.addSimpleColumn("PATIENT_ID", "$!{fn.patientId}"); export.addSimpleColumn("Name", "$!{fn.getPatientAttr('PersonName', 'givenName')}"); Cohort patients = new Cohort(); patients.addMember(2); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); //System.out.println("Template String: \n" + export.generateTemplate()); String expectedOutput = "PATIENT_ID Name\n2 John\n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: \n" + output); assertEquals("The output is not right.", expectedOutput, output); } /** * Makes sure that the getFirstObs method on the DataExportFunctions object never throws a null * pointer exception if the patient doesn't have any obs. Regression test for ticket #1028 * * @throws Exception */ @Test public void shouldNotFailOnFirstObsIfPatientDoesntHaveAnObs() throws Exception { DataExportReportObject export = new DataExportReportObject(); export.setName("FIRST WEIGHT"); SimpleColumn patientId = new SimpleColumn("PATIENT_ID", "$!{fn.patientId}"); export.getColumns().add(patientId); ConceptColumn firstObs = new ConceptColumn("WEIGHT", DataExportReportObject.MODIFIER_FIRST, 1, "5089", null); export.getColumns().add(firstObs); // set the cohort to a patient hat doesn't have a weight obs Cohort patients = new Cohort(); patients.addMember(6); //System.out.println("Template String: \n" + export.generateTemplate()); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); String expectedOutput = "PATIENT_ID\t\"WEIGHT\"\n6\t\n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: \n" + output); assertEquals("The output is not right.", expectedOutput, output); } /** * Tests the "Cohort" column on data exports to make sure that they are exporting the right data * * @throws Exception */ @Test public void shouldExportCohortColumns() throws Exception { // First create a cohort. TODO maybe move this to xml Cohort cohort = new Cohort(); cohort.setName("A Cohort"); cohort.setDescription("Just for testing"); cohort.addMember(2); cohort = Context.getCohortService().saveCohort(cohort); DataExportReportObject export = new DataExportReportObject(); export.setName("Cohort column"); SimpleColumn patientId = new SimpleColumn("PATIENT_ID", "$!{fn.patientId}"); export.getColumns().add(patientId); CohortColumn cohortCol = new CohortColumn("InCohort", cohort.getCohortId(), null, null, "Yes", "No"); export.getColumns().add(cohortCol); // set the cohort to two patients, one of which is in the specified cohort Cohort patients = new Cohort(); patients.addMember(2); patients.addMember(6); //System.out.println("Template String: \n" + export.generateTemplate()); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); String expectedOutput = "PATIENT_ID\tInCohort\n2\tYes\n6\tNo\n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); //System.out.println("exportFile: \n" + output); assertEquals("The output is not right.", expectedOutput, output); } /** * Makes sure that the getFirstObs method on the DataExportFunctions object never throws a null * pointer exception if the patient doesn't have any obs. Regression test for ticket #1028 * * @throws Exception */ @Test public void shouldGetContructColumns() throws Exception { DataExportReportObject export = new DataExportReportObject(); export.setName("CONSTRUCT EXPORT"); SimpleColumn patientId = new SimpleColumn("PATIENT_ID", "$!{fn.patientId}"); export.getColumns().add(patientId); ConceptColumn firstObs = new ConceptColumn("CONSTRUCT", DataExportReportObject.MODIFIER_FIRST, 1, "23", null); export.getColumns().add(firstObs); ConceptColumn secondObs = new ConceptColumn("WEIGHT", DataExportReportObject.MODIFIER_FIRST, 1, "5089", null); export.getColumns().add(secondObs); // set the cohort to a patient that doesn't have a weight obs Cohort patients = new Cohort(); patients.addMember(7); patients.addMember(8); DataExportUtil.generateExport(export, patients, "\t", null); File exportFile = DataExportUtil.getGeneratedFile(export); String expectedOutput = "PATIENT_ID \"FOOD ASSISTANCE\" \"DATE OF FOOD ASSISTANCE\" \"FAVORITE FOOD, NON-CODED\" \"WEIGHT\"\n7 1.0 14/08/2008 PB and J 50.0\n8 \n"; String output = OpenmrsUtil.getFileAsString(exportFile); exportFile.delete(); assertEquals("The output is not right.", expectedOutput, output); } }