package xyz.driver.pdsuidomain.formats.json
/*
import java.time.LocalDateTime
import xyz.driver.pdsuicommon.domain._
import org.davidbild.tristate.Tristate
import org.scalatest.FreeSpecLike
import play.api.libs.json.Json
class ApiPartialDocumentSuite extends FreeSpecLike {
"serialization" - {
"can be deserialized" in deserialize(defaultJson)
"endDate" - {
def jsonWithEndDate(rawValue: String) = json("endDate" -> rawValue)
def jsonWithoutEndDate = json()
"when specified" - {
"if non-empty object - should be parsed as date" in {
val rawEndDate = "2007-12-03T10:15:30.000"
val apiPartialEntity = deserialize(jsonWithEndDate(quoted(rawEndDate)))
assert(apiPartialEntity.endDate.exists(_ == LocalDateTime.parse(rawEndDate)))
}
"if null - should be parsed as Absent" in {
val apiPartialEntity = deserialize(jsonWithEndDate("null"))
assert(apiPartialEntity.endDate.isAbsent)
}
}
"when unspecified - should be parsed as Unspecified" in {
val apiPartialEntity = deserialize(jsonWithoutEndDate)
assert(apiPartialEntity.endDate.isUnspecified)
}
}
"assignee" - {
def jsonWithAssignee(rawValue: String) = json("assignee" -> rawValue)
def jsonWithoutAssignee = json()
"when specified" - {
"if non-empty object - should be parsed as UUID" in {
val rawAssignee = 123
val apiPartialEntity = deserialize(jsonWithAssignee(quoted(rawAssignee.toString)))
assert(apiPartialEntity.assignee.exists(_ == rawAssignee))
}
"if null - should be parsed as Absent" in {
val apiPartialEntity = deserialize(jsonWithAssignee("null"))
assert(apiPartialEntity.assignee.isAbsent)
}
}
"when unspecified - should be parsed as Unspecified" in {
val apiPartialEntity = deserialize(jsonWithoutAssignee)
assert(apiPartialEntity.assignee.isUnspecified)
}
}
"meta" - {
def jsonWithMeta(rawValue: String) = json("meta" -> rawValue)
def jsonWithoutMeta = json()
"when specified" - {
"if non-empty object - should be parsed as normalized JSON-string" in {
val apiPartialEntity = deserialize(jsonWithMeta(""" { "foo" : 1} """))
assert(apiPartialEntity.meta.exists(_ == """{"foo":1}"""))
}
"if null - should be parsed as Absent" in {
val apiPartialEntity = deserialize(jsonWithMeta("null"))
assert(apiPartialEntity.meta.isAbsent)
}
"if empty object ({}) - should be parsed as Absent (same as null case)" in {
val apiPartialEntity = deserialize(jsonWithMeta(" { } "))
assert(apiPartialEntity.meta.isAbsent)
}
}
"when unspecified - should be parsed as Unspecified" in {
val apiPartialEntity = deserialize(jsonWithoutMeta)
assert(apiPartialEntity.meta.isUnspecified)
}
}
def deserialize(json: String): ApiPartialDocument = {
Json.parse(json).as[ApiPartialDocument]
}
}
"applyTo" - {
"endDate" - {
"should choose a value of the api partial document" - {
"if it present" in test(Tristate.Present(LocalDateTime.now().plusDays(1)))
"if it absent" in test(Tristate.Absent)
def test(newEndDate: Tristate[LocalDateTime]): Unit = {
val origDocument = documentExample
val apiPartialDocument = apiPartialDocumentExample.copy(endDate = newEndDate)
val newDocument = apiPartialDocument.applyTo(origDocument)
assert(newDocument.endDate === newEndDate.toOption)
}
}
"should choose a value of the original document if it unspecified" in {
val newEndDate = Tristate.Unspecified
val origDocument = documentExample
val apiPartialDocument = apiPartialDocumentExample.copy(endDate = newEndDate)
val newDocument = apiPartialDocument.applyTo(origDocument)
assert(newDocument.endDate == origDocument.endDate)
}
}
"assignee" - {
"should choose a value of the api partial document" - {
"if it present" in test(Tristate.Present(123))
"if it absent" in test(Tristate.Absent)
def test(newAssignee: Tristate[Long]): Unit = {
val origDocument = documentExample
val apiPartialDocument = apiPartialDocumentExample.copy(assignee = newAssignee)
val newDocument = apiPartialDocument.applyTo(origDocument)
assert(newDocument.assignee === newAssignee.toOption.map(StringId[User]))
}
}
"should choose a value of the original document if it unspecified" in {
val newAssignee = Tristate.Unspecified
val origDocument = documentExample
val apiPartialDocument = apiPartialDocumentExample.copy(assignee = newAssignee)
val newDocument = apiPartialDocument.applyTo(origDocument)
assert(newDocument.assignee == origDocument.assignee)
}
}
/*"meta" - {
val documentId = Id[Document]()
def test(origMeta: Option[RawMeta], metaUpdate: Tristate[String], expectedNewMeta: Option[RawMeta]): Unit = {
val apiPartialDocument = apiPartialDocumentExample.copy(meta = metaUpdate)
val actualNewMeta = apiPartialDocument.applyTo(documentId, origMeta)
assert(actualNewMeta == expectedNewMeta)
}
"should choose a new meta's value" - {
"if it present" - {
"when original meta is present" in test(
origMeta = Some(RawMeta(documentId, """{"foo":42}""")),
metaUpdate = Tristate.Present("""{"bar":1}"""),
expectedNewMeta = Some(RawMeta(documentId, """{"bar":1}"""))
)
"when original meta is absent" in test(
origMeta = None,
metaUpdate = Tristate.Present("""{"bar":1}"""),
expectedNewMeta = Some(RawMeta(documentId, """{"bar":1}"""))
)
}
"if it absent" - {
"when original meta is present" in test(
origMeta = Some(RawMeta(documentId, """{"foo":42}""")),
metaUpdate = Tristate.Absent,
expectedNewMeta = None
)
"when original meta is absent" in test(
origMeta = None,
metaUpdate = Tristate.Absent,
expectedNewMeta = None
)
}
}
"should choose an original meta if a new one is unspecified" - {
"when original meta is present" in test(
origMeta = Some(RawMeta(documentId, """{"foo":42}""")),
metaUpdate = Tristate.Unspecified,
expectedNewMeta = Some(RawMeta(documentId, """{"foo":42}"""))
)
"when original meta is absent" in test(
origMeta = None,
metaUpdate = Tristate.Unspecified,
expectedNewMeta = None
)
}
}*/
}
private def documentExample = Document(
id = LongId(1),
status = Document.Status.Organized,
assignee = Some(LongId(1)),
previousAssignee = None,
recordId = LongId(1),
physician = None,
documentType = "type",
providerName = "provider name",
providerType = "provider type",
meta = None,
startDate = LocalDateTime.now,
endDate = None,
lastUpdate = LocalDateTime.now
)
private def apiPartialDocumentExample = ApiPartialDocument(
recordId = Some(12),
physician = Some("new physician"),
`type` = Some("new type"),
startDate = Some(LocalDateTime.now),
endDate = Tristate.Present(LocalDateTime.now),
provider = Some("new provider name"),
providerType = Some("new provider type"),
status = Some("Extracted"),
assignee = Tristate.Present(13),
meta = Tristate.Present("""{"foo":42}""")
)
private def quoted(v: String): String = s""""$v""""
private def defaultJson = json(
"endDate" -> quoted("2007-12-03T10:15:30.000"),
"assignee" -> quoted("c8b1b818-e1eb-4831-b0c8-26753b109deb"),
"meta" -> """{"foo": 1}"""
)
/**
* Without fields:
* - endDate
* - assignee
* - meta
*/
private def json(addFields: (String, String)*): String = {
val addJson = addFields
.collect {
case (k, v) if v.nonEmpty => s""" "$k": $v """
}
.mkString(",\n")
s"""{
|"recordId":"bc542d3d-a928-42b8-824d-ca1520b07500",
|"patientId":"foobar",
|"caseId":"bazquux",
|"physician":"zed",
|"lastUpdate":"2007-12-03T10:15:30.000",
|"type":"type1",
|"startDate":"2007-10-01T09:40:00.000",
|"provider":"some provider name",
|"providerType":"some provider type",
|"status":"New"${if (addJson.isEmpty) "" else ","}
|$addJson
|}""".stripMargin
}
}
*/