/* * PatientView * * Copyright (c) Worth Solutions Limited 2004-2013 * * This file is part of PatientView. * * PatientView is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * PatientView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with PatientView in a file * titled COPYING. If not, see <http://www.gnu.org/licenses/>. * * @package PatientView * @link http://www.patientview.org * @author PatientView <info@patientview.org> * @copyright Copyright (c) 2004-2013, Worth Solutions Limited * @license http://www.gnu.org/licenses/gpl-3.0.html The GNU General Public License V3.0 */ package org.patientview.test.quartz; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.junit.Test; import org.junit.runner.RunWith; import org.patientview.common.test.BaseTestPvDbSchema; import org.patientview.ibd.model.Allergy; import org.patientview.ibd.model.MyIbd; import org.patientview.ibd.model.Procedure; import org.patientview.model.Patient; import org.patientview.model.Specialty; import org.patientview.model.Unit; import org.patientview.patientview.FindXmlFiles; import org.patientview.patientview.model.Centre; import org.patientview.patientview.model.Diagnostic; import org.patientview.patientview.model.Letter; import org.patientview.patientview.model.Medicine; import org.patientview.patientview.model.TestResult; import org.patientview.quartz.XmlImportTask; import org.patientview.quartz.exception.ProcessException; import org.patientview.repository.PatientDao; import org.patientview.repository.UnitDao; import org.patientview.service.CentreManager; import org.patientview.service.DiagnosticManager; import org.patientview.service.ImportManager; import org.patientview.service.LetterManager; import org.patientview.service.MedicineManager; import org.patientview.service.TestResultManager; import org.patientview.service.ibd.IbdManager; import org.patientview.test.helpers.ServiceHelpers; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ResourceUtils; import javax.inject.Inject; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring-context.xml", "classpath*:test-context.xml"}) @Transactional public class XmlImportTaskTest extends BaseTestPvDbSchema { @Inject private XmlImportTask xmlImport; private String xmlDirectory; private String[] fileEndings = {".xml", }; @Inject private PatientDao patientDao; @Inject private CentreManager centreManager; @Inject private MedicineManager medicineManager; @Inject private LetterManager letterManager; @Inject private TestResultManager testResultManager; @Inject private IbdManager ibdManager; @Inject private DiagnosticManager diagnosticManager; @Inject private ImportManager importManager; @Inject private ServiceHelpers serviceHelpers; @Inject private UnitDao unitDao; private Specialty specialty; @Test public void testRead() throws Exception { int xmlFilesSize = 0; String parentDir = ResourceUtils.getFile("classpath:schedule/rm301_1244_9876543210.xml").getParent(); setXmlDirectory(parentDir); File[] xmlFiles = FindXmlFiles.findXmlFiles(xmlDirectory, fileEndings); if (xmlFiles != null) { xmlFilesSize = xmlFiles.length; } assertTrue("Can not read XML files", xmlFilesSize != 0); xmlImport.setXmlDirectory(parentDir); xmlImport.execute(); List<Centre> centres = centreManager.getAll(); assertEquals("Incorrect number of centres", 1, centres.size()); assertEquals("Incorrect centre", "RM301", centres.get(0).getCentreCode()); List<Patient> patients = patientDao.get("RM301"); assertEquals("Incorrect number of patients", 1, patients.size()); assertEquals("Incorrect patient", "9876543210", patients.get(0).getNhsno()); List<Letter> letters = letterManager.getAll(); assertEquals("Incorrect number of letters", 2, letters.size()); MyIbd myIbd = ibdManager.getMyIbd("9876543210"); assertNotNull("No MyIbd information was parsed", myIbd); Diagnostic diagnostic = diagnosticManager.get("9876543210"); assertNotNull("No diagnostic information was parsed", diagnostic); Procedure procedure = ibdManager.getProcedure("9876543210"); assertNotNull("No procedure information was parsed", procedure); Allergy allergy = ibdManager.getAllergy("9876543210"); assertNotNull("No allergy information was parsed", allergy); List<TestResult> results = testResultManager.get("9876543210", "RM301"); assertEquals("Incorrect number of results", 3, results.size()); List<Medicine> medicines = medicineManager.getAll(); assertEquals("Incorrect number of medicines", 0, medicines.size()); } @Test public void testImportSetsUnitLastUpdated() throws Exception { setup("schedule/TestUnitA_1244_9876543210/TestUnitA_1244_9876543210.xml"); xmlImport.execute(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); Unit checkUnit = unitDao.get("TestUnitA", specialty); assertNotNull("Unit last import date is null", checkUnit.getLastImportDate()); assertEquals("Unit last import date updated not correct", simpleDateFormat.format(date), simpleDateFormat.format(checkUnit.getLastImportDate())); } /** * Import a new patient with test results and show the mostRecentTestResultDateRangeStopDate is taken from * the last stop date in the xml file. * * Then run a second import with test results previous to the first import. Show that this does not affect the * mostRecentTestResultDateRangeStopDate set on the patient. * * Then run a third import with test results after the first import. Show that this does update the * mostRecentTestResultDateRangeStopDate. * @throws Exception */ @Test public void testImportSetsPatientMostRecentTestResultDateRangeStopDate() throws Exception { setup("schedule/testrun1/first-results-for-patient.xml"); xmlImport.execute(); Patient patient = patientDao.get("9876543210", "TestUnitA"); assertEquals("Date not set correctly on patient from first import", getDateRangeDate("2012-08-17").toString(), patient.getMostRecentTestResultDateRangeStopDate().toString()); xmlImport.setXmlDirectory( ResourceUtils.getFile("classpath:schedule/testrun2/second-results-for-patient.xml").getParent()); xmlImport.execute(); patient = patientDao.get("9876543210", "TestUnitA"); assertEquals("Date should not have changed, stop date was before current value", getDateRangeDate("2012-08-17").toString(), patient.getMostRecentTestResultDateRangeStopDate().toString()); xmlImport.setXmlDirectory( ResourceUtils.getFile("classpath:schedule/testrun3/third-results-for-patient.xml").getParent()); xmlImport.execute(); patient = patientDao.get("9876543210", "TestUnitA"); assertEquals("Date should have updated", getDateRangeDate("2013-01-17").toString(), patient.getMostRecentTestResultDateRangeStopDate().toString()); } /** * Get a date object that to the spec of that which ends up in the database. * If Fri Aug 17 00:00:00 BST 2012 is used as a stop date it will end up as Fri Aug 17 23:59:59 BST 2012 * @param dateStr in the format of that found in the xml file * @return the date */ private Date getDateRangeDate(String dateStr) { DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd"); DateTime dt = formatter.parseDateTime(dateStr); return dt.plusDays(1).minusSeconds(1).toDate(); } private void setup(String directoryAndFilename) throws FileNotFoundException { int xmlFilesSize = 0; String parentDir = ResourceUtils.getFile("classpath:" + directoryAndFilename).getParent(); setXmlDirectory(parentDir); File[] xmlFiles = FindXmlFiles.findXmlFiles(xmlDirectory, fileEndings); if (xmlFiles != null) { xmlFilesSize = xmlFiles.length; } assertTrue("Can not read XML files", xmlFilesSize != 0); specialty = serviceHelpers.createSpecialty("Specialty 1", "Specialty1", "Test description"); Unit unit = new Unit(); unit.setUnitcode("TestUnitA"); unit.setName("Test Data For Unit"); unit.setShortname("Test Data"); unit.setSpecialty(specialty); unitDao.save(unit); assertNull("Unit last import date is not null", unit.getLastImportDate()); xmlImport.setXmlDirectory(parentDir); } /** * This test is to create a data exception on the patient record. The exception is the lack of a * nhs no. * * @throws Exception */ @Test (expected = ProcessException.class) public void testLoadXmlFileContainingNoNhsNumber() throws ProcessException, IOException { File file = ResourceUtils.getFile("classpath:RENALB_nhsnomissing_TEST111111.gpg.xml"); importManager.process(file); } public void setXmlDirectory(String xmlDirectory) { this.xmlDirectory = xmlDirectory; } }