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, TextJson, UuidId} import xyz.driver.pdsuidomain.entities.MedicalRecord class MedicalRecordFormatSuite extends FlatSpec with Matchers { import xyz.driver.pdsuidomain.formats.json.record._ import MedicalRecord._ "Json format for MedicalRecord.Meta" should "read and write correct JSON" in { val duplicate1 = Meta.Duplicate( startPage = 1.0d, endPage = 2.0d, startOriginalPage = 1.0d, endOriginalPage = Some(2.0d) ) val duplicate2 = Meta.Duplicate( startPage = 1.0d, endPage = 2.0d, startOriginalPage = 1.0d, endOriginalPage = None ) val reorder = Meta.Reorder( Seq(1, 2) ) val rotation = Meta.Rotation( Map("item1" -> 1, "item2" -> 2) ) val writtenDuplicateJson1 = duplicateMetaFormat.write(duplicate1) val writtenDuplicateJson2 = duplicateMetaFormat.write(duplicate2) val writtenReorderJson = reorderMetaFormat.write(reorder) val writtenRotationJson = rotateMetaFormat.write(rotation) writtenDuplicateJson1 should be( """{"startOriginalPage":1.0,"endPage":2.0,"startPage":1.0,"type":"duplicate","endOriginalPage":2.0}""".parseJson) writtenDuplicateJson2 should be( """{"startOriginalPage":1.0,"endPage":2.0,"startPage":1.0,"type":"duplicate","endOriginalPage":null}""".parseJson) writtenReorderJson should be( """{"type":"reorder","items":[1,2]}""".parseJson) writtenRotationJson should be( """{"type":"rotation","items":{"item1":1,"item2":2}}""".parseJson) val parsedDuplicateJson1 = duplicateMetaFormat.read(writtenDuplicateJson1) val parsedDuplicateJson2 = duplicateMetaFormat.read(writtenDuplicateJson2) val parsedReorderJson = reorderMetaFormat.read(writtenReorderJson) val parsedRotationJson = rotateMetaFormat.read(writtenRotationJson) duplicate1 should be(parsedDuplicateJson1) duplicate2 should be(parsedDuplicateJson2) reorder should be(parsedReorderJson) rotation should be(parsedRotationJson) duplicate1 should be(recordMetaTypeFormat.read(recordMetaTypeFormat.write(duplicate1))) duplicate2 should be(recordMetaTypeFormat.read(recordMetaTypeFormat.write(duplicate2))) reorder should be(recordMetaTypeFormat.read(recordMetaTypeFormat.write(reorder))) rotation should be(recordMetaTypeFormat.read(recordMetaTypeFormat.write(rotation))) } "Json format for MedicalRecord" should "read and 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 writtenJson = recordFormat.write(orig) writtenJson should be( """{"id":1,"status":"New","assignee":null,"previousStatus":null,"previousAssignee":null,"lastActiveUser":null, "lastUpdate":"2017-08-10T18:00Z","meta":[],"patientId":"748b5884-3528-4cb9-904b-7a8151d6e343","caseId":null, "requestId":"7b54a75d-4197-4b27-9045-b9b6cb131be9","disease":"Breast","physician":"physician","totalPages":10}""".parseJson) val createRecordJson = """{"disease":"Breast","patientId":"748b5884-3528-4cb9-904b-7a8151d6e343","requestId":"7b54a75d-4197-4b27-9045-b9b6cb131be9"}""".parseJson val expectedCreatedRecord = MedicalRecord( id = LongId(0), status = MedicalRecord.Status.New, previousStatus = None, assignee = None, previousAssignee = None, lastActiveUserId = None, patientId = UuidId("748b5884-3528-4cb9-904b-7a8151d6e343"), requestId = Id[ClinicalRecord]("7b54a75d-4197-4b27-9045-b9b6cb131be9"), disease = "Breast", caseId = None, physician = None, meta = None, lastUpdate = LocalDateTime.now(), totalPages = 0 ) val parsedCreatedRecord = recordFormat.read(createRecordJson).copy(lastUpdate = expectedCreatedRecord.lastUpdate) parsedCreatedRecord should be(expectedCreatedRecord) val updateRecordJson = """{"meta":[{"type":"duplicate","startPage":1.0,"endPage":2.0,"startOriginalPage":1.0}, {"type":"reorder","items":[1,2]}, {"type":"rotation","items":{"item1":1,"item2":2}}]}""".parseJson val expectedUpdatedRecord = orig.copy( meta = Some( TextJson( List( Meta.Duplicate(startPage = 1.0, endPage = 2.0, startOriginalPage = 1.0, endOriginalPage = None), Meta.Reorder(Seq(1, 2)), Meta.Rotation(Map("item1" -> 1, "item2" -> 2)) ))) ) val parsedUpdatedRecord = applyUpdateToMedicalRecord(updateRecordJson, orig) parsedUpdatedRecord should be(expectedUpdatedRecord) } }