/** * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * 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. * * The Original Code is OpenELIS code. * * Copyright (C) ITECH, University of Washington, Seattle WA. All Rights Reserved. * */ package us.mn.state.health.lims.dataexchange.order; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import us.mn.state.health.lims.common.services.ITestIdentityService; import us.mn.state.health.lims.dataexchange.order.action.HL7OrderInterpreter; import us.mn.state.health.lims.dataexchange.order.action.IOrderInterpreter; import us.mn.state.health.lims.dataexchange.order.action.IOrderInterpreter.InterpreterResults; import us.mn.state.health.lims.dataexchange.order.action.IOrderInterpreter.OrderType; import us.mn.state.health.lims.dataexchange.order.action.MessagePatient; import ca.uhn.hl7v2.HL7Exception; import ca.uhn.hl7v2.model.v251.message.OML_O21; import ca.uhn.hl7v2.model.v251.segment.OBR; import ca.uhn.hl7v2.model.v251.segment.OBX; import ca.uhn.hl7v2.model.v251.segment.ORC; import ca.uhn.hl7v2.model.v251.segment.PID; import ca.uhn.hl7v2.parser.DefaultModelClassFactory; import ca.uhn.hl7v2.parser.ModelClassFactory; public class HL7OrderInterpreterTest{ private static final String incomingMSH = "MSH|^~\\&|ISANTE|JACMEL|OPENELIS|JACMEL|20130415173021||OML^O21^OML_O21|Q123456789T123456789X123456|P|2.5.1"; private static final String incomingPID = "PID|1||1234^^^^ST~1234-12^^^^GU~1234-123^^^^NA~1234-124^^^^OB~1234-125^^^^PC||BROS^MARIO||19850102000000|F|||123 FAKE STREET^MARIO \\T\\ LUIGI BROS PLACE^TOADSTOOL KINGDOM^NES^A1B2C3^JP^HOME^^1234||(555)555-0123^HOME^JP:1234567|||S|"; private static final String incomingRequestORC = "ORC|NW|12345-4321876|||||||20130415173021|||^Smith^John"; private static final String incomingCancelORC = "ORC|CA|12345-4321876|||||||20130415173021|||^Smith^John"; private static final String incomingOBR = "OBR|1|12345-4321876||P-Biochimie Reflotron^Biochimie Reflotron^11LAB"; private static final String incomingOBX = "OBX|1|ST|SPEC_TYPE^Specimen Type^11LAB||Plasma||||||F"; private OML_O21 message; private IOrderInterpreter interpreter = new HL7OrderInterpreter(); @BeforeClass public static void setUpBeforeClass() throws Exception{ } @Before public void setUp() throws Exception{ ModelClassFactory mcf = new DefaultModelClassFactory(); message = new OML_O21(mcf); message.parse(incomingMSH); ITestIdentityService mockTestIdentityService = mock( ITestIdentityService.class); when(mockTestIdentityService.doesPanelExist(anyString())).thenReturn( true ); when(mockTestIdentityService.doesTestExist(anyString())).thenReturn( true ); ((HL7OrderInterpreter)interpreter).setTestIdentityService(mockTestIdentityService); } private void populateValidMessage(boolean request) throws HL7Exception{ createValidPID(); createValidORC(request); createValidOBR(); createValidOBX(); } private void createValidOBR() throws HL7Exception{ OBR obr = message.getORDER().getOBSERVATION_REQUEST().getOBR(); obr.parse(incomingOBR); } private void createValidOBX() throws HL7Exception{ OBX obx = message.getORDER().getOBSERVATION_REQUEST().getOBSERVATION().getOBX(); obx.parse(incomingOBX); } private void createValidORC(boolean request) throws HL7Exception{ ORC orc = message.getORDER().getORC(); if(request){ orc.parse(incomingRequestORC); }else{ orc.parse(incomingCancelORC); } } private void createValidPID() throws HL7Exception{ PID pid = message.getPATIENT().getPID(); pid.parse(incomingPID); } @Test public void testGettersWithoutInterpreting(){ assertNull(interpreter.getReferringOrderNumber()); assertNull(interpreter.getMessage()); assertTrue(interpreter.getResultStatus().isEmpty()); assertNull(interpreter.getMessagePatient() ); assertNull(interpreter.getOrderType()); assertTrue(interpreter.getUnsupportedPanels().isEmpty()); assertTrue(interpreter.getUnsupportedTests().isEmpty()); } @Test public void testGetReferringOrderNumber() throws HL7Exception{ populateValidMessage(true); interpreter.interpret(message); assertEquals("12345-4321876", interpreter.getReferringOrderNumber()); } @Test public void testGetMessage() throws HL7Exception{ populateValidMessage(true); interpreter.interpret(message); assertTrue( interpreter.getMessage().startsWith(incomingMSH)); } @Test public void testGetResultPatient() throws HL7Exception{ populateValidMessage(true); interpreter.interpret(message); MessagePatient patient = interpreter.getMessagePatient(); assertNotNull( patient); assertEquals("1234-12", patient.getGuid()); assertEquals("1234", patient.getStNumber()); assertEquals("1234-124", patient.getObNumber()); assertEquals("1234-123", patient.getNationalId()); assertEquals("1234-125", patient.getPcNumber()); assertEquals("F", patient.getGender()); assertEquals( "02/01/1985", patient.getDisplayDOB()); assertEquals("MARIO", patient.getFirstName()); assertEquals("BROS", patient.getLastName()); assertEquals(null, patient.getMothersFirstName()); assertEquals("123 FAKE STREET", patient.getAddressStreet()); assertEquals("TOADSTOOL KINGDOM", patient.getAddressVillage()); assertEquals("NES", patient.getAddressDepartment()); } @Test public void testAmbigiousDOB() throws HL7Exception{ PID pid = message.getPATIENT().getPID(); pid.parse("PID|1||1234^^^^ST~1234-12^^^^GU~1234-123^^^^NA~1234-124^^^^OB~1234-125^^^^PC||BROS^MARIO||1985|F|||123 FAKE STREET^MARIO \\T\\ LUIGI BROS PLACE^TOADSTOOL KINGDOM^NES^A1B2C3^JP^HOME^^1234||(555)555-0123^HOME^JP:1234567|||S|"); createValidORC(true); createValidOBR(); createValidOBX(); interpreter.interpret(message); MessagePatient patient = interpreter.getMessagePatient(); assertNotNull( patient); assertEquals( "XX/XX/1985", patient.getDisplayDOB()); } @Test public void testRequestOrder() throws HL7Exception{ populateValidMessage(true); interpreter.interpret(message); assertEquals(OrderType.REQUEST, interpreter.getOrderType()); } @Test public void testCancelOrder() throws HL7Exception{ populateValidMessage(false); interpreter.interpret(message); assertEquals(OrderType.CANCEL, interpreter.getOrderType()); } @Test public void testOKRequestOrder() throws HL7Exception{ populateValidMessage(true); interpreter.interpret(message); assertEquals(InterpreterResults.OK, interpreter.getResultStatus().get(0)); } @Test public void testOKCancelOrder() throws HL7Exception{ populateValidMessage(false); interpreter.interpret(message); assertEquals(InterpreterResults.OK, interpreter.getResultStatus().get(0)); } @Test public void testUnknownRequest() throws HL7Exception{ createValidPID(); ORC orc = message.getORDER().getORC(); orc.parse("ORC|WW|12345-4321876|||||||20130415173021|||^Smith^John"); interpreter.interpret(message); assertEquals(InterpreterResults.UNKNOWN_REQUEST_TYPE, interpreter.getResultStatus().get(0)); } @Test public void testMIssingOrderNumber() throws HL7Exception{ createValidPID(); ORC orc = message.getORDER().getORC(); orc.parse("ORC|CA||"); interpreter.interpret(message); assertEquals(InterpreterResults.MISSING_ORDER_NUMBER, interpreter.getResultStatus().get(0)); } @Test public void testMIssingPatientGuid() throws HL7Exception{ PID pid = message.getPATIENT().getPID(); pid.parse("PID|1||1234^^^^ST~1234-123^^^^NA~1234-124^^^^OB~1234-125^^^^PC||BROS^MARIO||19850101000000|F|||123 FAKE STREET^MARIO \\T\\ LUIGI BROS PLACE^TOADSTOOL KINGDOM^NES^A1B2C3^JP^HOME^^1234||(555)555-0123^HOME^JP:1234567|||S|"); createValidORC(true); interpreter.interpret(message); assertEquals(InterpreterResults.MISSING_PATIENT_GUID, interpreter.getResultStatus().get(0)); } @Test public void testMissingPatientDOB() throws HL7Exception{ PID pid = message.getPATIENT().getPID(); pid.parse("PID|1||1234^^^^ST~1234-12^^^^GU~1234-123^^^^NA~1234-124^^^^OB~1234-125^^^^PC||BROS^MARIO|||F|||123 FAKE STREET^MARIO \\T\\ LUIGI BROS PLACE^TOADSTOOL KINGDOM^NES^A1B2C3^JP^HOME^^1234||(555)555-0123^HOME^JP:1234567|||S|"); createValidORC(true); interpreter.interpret(message); assertEquals(InterpreterResults.MISSING_PATIENT_DOB, interpreter.getResultStatus().get(0)); } @Test public void testMissingPatientGender() throws HL7Exception{ PID pid = message.getPATIENT().getPID(); pid.parse("PID|1||1234^^^^ST~1234-12^^^^GU~1234-123^^^^NA~1234-124^^^^OB~1234-125^^^^PC||BROS^MARIO||19850101000000||||123 FAKE STREET^MARIO \\T\\ LUIGI BROS PLACE^TOADSTOOL KINGDOM^NES^A1B2C3^JP^HOME^^1234||(555)555-0123^HOME^JP:1234567|||S|"); createValidORC(true); interpreter.interpret(message); assertEquals(InterpreterResults.MISSING_PATIENT_GENDER, interpreter.getResultStatus().get(0)); } @Test public void testUnknownPatientGender() throws HL7Exception{ PID pid = message.getPATIENT().getPID(); pid.parse("PID|1||1234^^^^ST~1234-12^^^^GU~1234-123^^^^NA~1234-124^^^^OB~1234-125^^^^PC||BROS^MARIO||19850101000000|O|||123 FAKE STREET^MARIO \\T\\ LUIGI BROS PLACE^TOADSTOOL KINGDOM^NES^A1B2C3^JP^HOME^^1234||(555)555-0123^HOME^JP:1234567|||S|"); createValidORC(true); interpreter.interpret(message); assertEquals(InterpreterResults.MISSING_PATIENT_GENDER, interpreter.getResultStatus().get(0)); } @Test public void testMissingPatientIdentifier() throws HL7Exception{ PID pid = message.getPATIENT().getPID(); pid.parse("PID|1||1234-12^^^^GU||BROS^MARIO||19850101000000|F|||123 FAKE STREET^MARIO \\T\\ LUIGI BROS PLACE^TOADSTOOL KINGDOM^NES^A1B2C3^JP^HOME^^1234||(555)555-0123^HOME^JP:1234567|||S|"); createValidORC(true); interpreter.interpret(message); assertEquals(InterpreterResults.MISSING_PATIENT_IDENTIFIER, interpreter.getResultStatus().get(0)); } @Test public void testMissingTests() throws HL7Exception{ createValidPID(); createValidORC(true); interpreter.interpret(message); assertEquals(InterpreterResults.MISSING_TESTS, interpreter.getResultStatus().get(0)); } @Test public void testUnsupportedTests() throws HL7Exception{ createValidPID(); createValidORC(true); OBR obr = message.getORDER().getOBSERVATION_REQUEST().getOBR(); obr.parse("OBR|1|12345-4321876||T-Biochimie Reflotron^Biochimie Reflotron^11LAB"); ITestIdentityService mockTestIdentityService = mock( ITestIdentityService.class); when(mockTestIdentityService.doesPanelExist(anyString())).thenReturn( true ); when(mockTestIdentityService.doesTestExist(anyString())).thenReturn( false ); ((HL7OrderInterpreter)interpreter).setTestIdentityService(mockTestIdentityService); interpreter.interpret(message); assertEquals(InterpreterResults.UNSUPPORTED_TESTS, interpreter.getResultStatus().get(0)); } @Test public void testUnsupportedPanels() throws HL7Exception{ populateValidMessage(true); ITestIdentityService mockTestIdentityService = mock( ITestIdentityService.class); when(mockTestIdentityService.doesPanelExist(anyString())).thenReturn( false ); when(mockTestIdentityService.doesTestExist(anyString())).thenReturn( true ); ((HL7OrderInterpreter)interpreter).setTestIdentityService(mockTestIdentityService); interpreter.interpret(message); assertEquals(InterpreterResults.UNSUPPORTED_PANELS, interpreter.getResultStatus().get(0)); } @Test public void testUnknowRequestIdentifier() throws HL7Exception{ createValidPID(); createValidORC(true); OBR obr = message.getORDER().getOBSERVATION_REQUEST().getOBR(); obr.parse("OBR|1|12345-4321876||W^Biochimie Reflotron^ITECH"); interpreter.interpret(message); assertEquals(InterpreterResults.OTHER_THAN_PANEL_OR_TEST_REQUESTED, interpreter.getResultStatus().get(0)); } @Test public void testUnSupportedPanelAndTest() throws HL7Exception{ populateValidMessage(true); ORC orc = message.getORDER().getOBSERVATION_REQUEST().getPRIOR_RESULT().getORDER_PRIOR().getORC(); orc.parse(incomingRequestORC); OBR obr = message.getORDER().getOBSERVATION_REQUEST().getPRIOR_RESULT().getORDER_PRIOR().getOBR(); obr.parse("OBR|1|12345-4321876||T-Biochimie Reflotron Test^Biochimie Reflotron Test^ITECH"); ITestIdentityService mockTestIdentityService = mock( ITestIdentityService.class); when(mockTestIdentityService.doesPanelExist(anyString())).thenReturn( false ); when(mockTestIdentityService.doesTestExist(anyString())).thenReturn( false ); ((HL7OrderInterpreter)interpreter).setTestIdentityService(mockTestIdentityService); interpreter.interpret(message); assertEquals(2, interpreter.getResultStatus().size()); assertEquals("Biochimie Reflotron Test", interpreter.getUnsupportedTests().get(0)); assertEquals("Biochimie Reflotron", interpreter.getUnsupportedPanels().get(0)); } @Test public void testTwoUnsupportedPanels() throws HL7Exception{ //The purpose of this is to make sure that UNSUPPORTED_* is only set once even if there is more than one //unknown panel or test populateValidMessage(true); ORC orc = message.getORDER().getOBSERVATION_REQUEST().getPRIOR_RESULT().getORDER_PRIOR().getORC(); orc.parse(incomingRequestORC); OBR obr = message.getORDER().getOBSERVATION_REQUEST().getPRIOR_RESULT().getORDER_PRIOR().getOBR(); obr.parse("OBR|1|12345-4321876||P-Biochimie Reflotron Test^Biochimie Reflotron Test^ITECH"); ITestIdentityService mockTestIdentityService = mock( ITestIdentityService.class); when(mockTestIdentityService.doesPanelExist(anyString())).thenReturn( false ); when(mockTestIdentityService.doesTestExist(anyString())).thenReturn( false ); ((HL7OrderInterpreter)interpreter).setTestIdentityService(mockTestIdentityService); interpreter.interpret(message); assertEquals(1, interpreter.getResultStatus().size()); assertEquals(InterpreterResults.UNSUPPORTED_PANELS, interpreter.getResultStatus().get(0)); assertEquals("Biochimie Reflotron", interpreter.getUnsupportedPanels().get(0)); assertEquals("Biochimie Reflotron Test", interpreter.getUnsupportedPanels().get(1)); } }