package net.shrine.protocol import net.shrine.problem.ProblemDigest import scala.xml.NodeSeq import org.junit.Test import net.shrine.protocol.query.QueryDefinition import net.shrine.protocol.query.Term import net.shrine.util.XmlDateHelper import net.shrine.util.XmlUtil /** * * * @author Justin Quan * @see http://chip.org * Date: 8/12/11 */ //noinspection EmptyParenMethodOverridenAsParameterless,EmptyParenMethodAccessedAsParameterless,UnitMethodIsParameterless final class RunQueryResponseTest extends ShrineResponseI2b2SerializableValidator { private val queryId = 1L private val queryName = "queryName" private val userId = "user" private val groupId = "group" private val createDate = XmlDateHelper.now private val requestQueryDef = QueryDefinition(queryName, Term("""\\i2b2\i2b2\Demographics\Age\0-9 years old\""")) private val queryInstanceId = 2L private val resultId = 3L private val setSize = 10L private val startDate = createDate private val endDate = createDate private val resultId2 = 4L private val resultType1 = ResultOutputType.PATIENT_COUNT_XML private val resultType2 = ResultOutputType.PATIENT_COUNT_XML private val statusType = QueryResult.StatusType.Finished override def messageBody: NodeSeq = { DONE { queryId } { queryName } { userId } { groupId } { createDate } { requestQueryDef.toI2b2 } { queryInstanceId } { queryId } { userId } { groupId } 6 COMPLETED COMPLETED { resultId } { queryInstanceId } 4 { resultType1 } CATNUM LA Number of patients { setSize } { startDate } { endDate } { statusType } 3 FINISHED } private val qr1 = QueryResult( resultId = resultId, instanceId = queryInstanceId, resultType = Option(resultType1), setSize = setSize, startDate = Option(createDate), endDate = Option(createDate), description = None, statusType = statusType, statusMessage = Some(statusType.name), problemDigest = None ) private val runQueryResponse = XmlUtil.stripWhitespace { { queryId } { queryInstanceId } { userId } { groupId } { requestQueryDef.toXml } { createDate } { qr1.toXml } } import DefaultBreakdownResultOutputTypes.{ values => breakdownTypes } @Test def testFromXml: Unit = { val actual = RunQueryResponse.fromXml(breakdownTypes.toSet)(runQueryResponse).get actual.queryId should equal(queryId) actual.createDate should equal(createDate) actual.userId should equal(userId) actual.groupId should equal(groupId) actual.requestXml should equal(requestQueryDef) actual.queryInstanceId should equal(queryInstanceId) actual.results should equal(Seq(qr1)) actual.queryName should equal(queryName) } @Test def testToXml: Unit = { RunQueryResponse(queryId, createDate, userId, groupId, requestQueryDef, queryInstanceId, qr1).toXmlString should equal(runQueryResponse.toString) } @Test def testFromI2b2: Unit = { val translatedResponse = RunQueryResponse.fromI2b2(breakdownTypes.toSet)(response).get translatedResponse.queryId should equal(queryId) translatedResponse.createDate should equal(createDate) translatedResponse.userId should equal(userId) translatedResponse.groupId should equal(groupId) translatedResponse.requestXml should equal(requestQueryDef) translatedResponse.queryInstanceId should equal(queryInstanceId) translatedResponse.results should equal(Seq(qr1)) translatedResponse.queryName should equal(queryName) } @Test def testFromI2b2StringRequestXml: Unit = { def hackToProduceXml(statusType: QueryResult.StatusType): HasResponse = new HasResponse { //Produces a message body where the tag contains escaped XML as a String, as is produced by the CRC override def messageBody: NodeSeq = { DONE { queryId } { queryName } { userId } { groupId } { createDate } { requestQueryDef.toI2b2String } { queryInstanceId } { queryId } { userId } { groupId } 6 COMPLETED COMPLETED { resultId } { queryInstanceId } { resultType1 } 1 LIST LA Timeline { setSize } { startDate } { endDate } { statusType } 3 FINISHED { resultId2 } { queryInstanceId } { resultType2 } 4 CATNUM LA Number of patients { setSize } { startDate } { endDate } { statusType } 3 FINISHED } } for { statusType <- QueryResult.StatusType.values } { doTestFromI2b2(hackToProduceXml(statusType).response, requestQueryDef, statusType) } } private def doTestFromI2b2(i2b2Response: NodeSeq, expectedQueryDef: AnyRef, expectedStatusType: QueryResult.StatusType, expectedProblemDigest:Option[ProblemDigest] = None) { val translatedResponse = RunQueryResponse.fromI2b2(breakdownTypes.toSet)(i2b2Response).get translatedResponse.queryId should equal(queryId) translatedResponse.createDate should equal(createDate) translatedResponse.userId should equal(userId) translatedResponse.groupId should equal(groupId) translatedResponse.requestXml should equal(expectedQueryDef) translatedResponse.queryInstanceId should equal(queryInstanceId) if(!expectedStatusType.isError) translatedResponse.results should equal(Seq(qr1.copy(statusType = expectedStatusType,problemDigest = expectedProblemDigest))) else { translatedResponse.results.size should equal(1) val result: QueryResult = translatedResponse.results.head result.copy(problemDigest = None) should equal(qr1.copy(statusType = expectedStatusType,resultType = None,setSize = 0,startDate = None,endDate = None)) result.problemDigest.get.codec should equal(classOf[ErrorStatusFromCrc].getName) } translatedResponse.queryName should equal(queryName) translatedResponse.singleNodeResult.statusType should be(expectedStatusType) } @Test def testToI2b2 { RunQueryResponse(queryId, createDate, userId, groupId, requestQueryDef, queryInstanceId, qr1).toI2b2String should equal(response.toString) } }