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)
}
}