package xyz.driver.pdsuidomain.formats.json
import java.time.LocalDateTime
import spray.json._
import org.scalatest.{FlatSpec, Matchers}
import xyz.driver.core.Id
import xyz.driver.entities.clinic.ClinicalRecord
import xyz.driver.pdsuicommon.domain.{LongId, UuidId}
import xyz.driver.pdsuidomain.ListResponse
import xyz.driver.pdsuidomain.entities.MedicalRecord.Status
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.formats.json.record.recordFormat
import xyz.driver.pdsuidomain.formats.json.listresponse._
class ListResponseFormatSuite extends FlatSpec with Matchers {
private val lastUpdate = LocalDateTime.parse("2017-08-10T18:00:00")
private val lastUpdateToLocal = "2017-08-10T18:00Z"
def metaJsonObjectAsString(meta: ListResponse.Meta): String = {
import meta._
val lastUpdate = meta.lastUpdate
.map(_ => s""","lastUpdate":"$lastUpdateToLocal"""")
.getOrElse("")
s"""{"itemsCount":$itemsCount,"pageNumber":$pageNumber,"pageSize":$pageSize$lastUpdate}"""
}
"Json format for ListResponse.Meta" should "read and write correct JSON" in {
val meta1 =
ListResponse.Meta(
itemsCount = 5,
pageNumber = 6,
pageSize = 7,
lastUpdate = None
)
val writtenJson1 = listResponseMetaFormat.write(meta1)
writtenJson1 should be(metaJsonObjectAsString(meta1).parseJson)
val parsedItem1: ListResponse.Meta = listResponseMetaFormat.read(writtenJson1)
meta1 shouldBe parsedItem1
val meta2 =
ListResponse.Meta(
itemsCount = 1,
pageNumber = 4,
pageSize = 3,
lastUpdate = Some(lastUpdate)
)
val writtenJson2 = listResponseMetaFormat.write(meta2)
writtenJson2 should be(metaJsonObjectAsString(meta2).parseJson)
val parsedItem2: ListResponse.Meta = listResponseMetaFormat.read(writtenJson2)
meta2 shouldBe parsedItem2
}
"Json format for ListResponse" should "write correct JSON" in {
val orig = MedicalRecord(
id = LongId(1),
status = Status.New,
assignee = None,
previousStatus = None,
previousAssignee = None,
lastActiveUserId = None,
lastUpdate = LocalDateTime.parse("2017-08-10T18:00:00"),
physician = Some("physician"),
meta = None,
disease = "Breast",
requestId = Id[ClinicalRecord]("7b54a75d-4197-4b27-9045-b9b6cb131be9"),
caseId = None,
patientId = UuidId("748b5884-3528-4cb9-904b-7a8151d6e343"),
totalPages = 10
)
val recordJsonAsString = recordFormat.write(orig)
val meta =
ListResponse.Meta(
itemsCount = 5,
pageNumber = 6,
pageSize = 7,
lastUpdate = None
)
val listResponse = ListResponse(Seq(orig), meta)
val writtenJson = listResponseWriter[MedicalRecord].write(listResponse)
val expectedJson = s"""{"items":[$recordJsonAsString],"meta":${listResponseMetaFormat.write(meta)}}"""
writtenJson should be(expectedJson.parseJson)
}
}