CachedGlucoseObjectTests.swift 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. //
  2. // CachedGlucoseObjectTests.swift
  3. // LoopKitHostedTests
  4. //
  5. // Created by Darin Krauss on 10/12/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import XCTest
  9. import HealthKit
  10. @testable import LoopKit
  11. class CachedGlucoseObjectOperationsTests: PersistenceControllerTestCase {
  12. func testCreateFromNewGlucoseSample() {
  13. cacheStore.managedObjectContext.performAndWait {
  14. let startDate = dateFormatter.date(from: "2020-01-02T03:04:05Z")!
  15. let quantity = HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 123.4)
  16. let device = HKDevice(name: "NAME", manufacturer: "MANUFACTURER", model: "MODEL", hardwareVersion: "HARDWAREVERSION", firmwareVersion: "FIRMWAREVERSION", softwareVersion: "SOFTWAREVERSION", localIdentifier: "LOCALIDENTIFIER", udiDeviceIdentifier: "UDIDEVICEIDENTIFIER")
  17. let newGlucoseSample = NewGlucoseSample(date: startDate,
  18. quantity: quantity,
  19. condition: .belowRange,
  20. trend: .flat,
  21. trendRate: HKQuantity(unit: .milligramsPerDeciliterPerMinute, doubleValue: 0.1),
  22. isDisplayOnly: true,
  23. wasUserEntered: false,
  24. syncIdentifier: "F4C094AA-9EBE-4804-8F02-90C7B613BDEC",
  25. syncVersion: 2,
  26. device: device)
  27. let object = CachedGlucoseObject(context: cacheStore.managedObjectContext)
  28. object.create(from: newGlucoseSample, provenanceIdentifier: "06173C6A-4945-4139-A77D-E3ABC3221EA9", healthKitStorageDelay: .minutes(1))
  29. XCTAssertNil(object.uuid)
  30. XCTAssertEqual(object.provenanceIdentifier, "06173C6A-4945-4139-A77D-E3ABC3221EA9")
  31. XCTAssertEqual(object.syncIdentifier, "F4C094AA-9EBE-4804-8F02-90C7B613BDEC")
  32. XCTAssertEqual(object.primitiveSyncVersion, 2)
  33. XCTAssertEqual(object.value, quantity.doubleValue(for: .milligramsPerDeciliter))
  34. XCTAssertEqual(object.unitString, HKUnit.milligramsPerDeciliter.unitString)
  35. XCTAssertEqual(object.startDate, startDate)
  36. XCTAssertEqual(object.isDisplayOnly, true)
  37. XCTAssertEqual(object.wasUserEntered, false)
  38. XCTAssertEqual(object.condition, .belowRange)
  39. XCTAssertEqual(object.trend, .flat)
  40. XCTAssertEqual(object.trendRateUnit, HKUnit.milligramsPerDeciliterPerMinute.unitString)
  41. XCTAssertEqual(object.trendRateValue, 0.1)
  42. XCTAssertEqual(object.modificationCounter, 1)
  43. XCTAssertEqual(object.device, device)
  44. XCTAssertEqual(object.healthKitEligibleDate, startDate.addingTimeInterval(.minutes(1)))
  45. }
  46. }
  47. func testCreateFromQuantitySample() {
  48. cacheStore.managedObjectContext.performAndWait {
  49. let type = HKQuantityType.quantityType(forIdentifier: .bloodGlucose)!
  50. let startDate = dateFormatter.date(from: "2020-02-03T04:05:06Z")!
  51. let quantity = HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 123.4)
  52. let device = HKDevice(name: "NAME", manufacturer: "MANUFACTURER", model: "MODEL", hardwareVersion: "HARDWAREVERSION", firmwareVersion: "FIRMWAREVERSION", softwareVersion: "SOFTWAREVERSION", localIdentifier: "LOCALIDENTIFIER", udiDeviceIdentifier: "UDIDEVICEIDENTIFIER")
  53. let metadata: [String: Any] = [
  54. HKMetadataKeySyncIdentifier: "0B2353CD-7F98-4297-81E2-8D6FCDD02655",
  55. HKMetadataKeySyncVersion: 2,
  56. MetadataKeyGlucoseIsDisplayOnly: false,
  57. HKMetadataKeyWasUserEntered: true,
  58. MetadataKeyGlucoseCondition: "belowRange",
  59. MetadataKeyGlucoseTrend: "→",
  60. MetadataKeyGlucoseTrendRateUnit: HKUnit.milligramsPerDeciliterPerMinute.unitString,
  61. MetadataKeyGlucoseTrendRateValue: 0.1
  62. ]
  63. let quantitySample = HKQuantitySample(type: type, quantity: quantity, start: startDate, end: startDate, device: device, metadata: metadata)
  64. let object = CachedGlucoseObject(context: cacheStore.managedObjectContext)
  65. object.create(from: quantitySample)
  66. XCTAssertNotNil(object.uuid)
  67. XCTAssertEqual(object.provenanceIdentifier, "")
  68. XCTAssertEqual(object.syncIdentifier, "0B2353CD-7F98-4297-81E2-8D6FCDD02655")
  69. XCTAssertEqual(object.primitiveSyncVersion, 2)
  70. XCTAssertEqual(object.value, quantity.doubleValue(for: .milligramsPerDeciliter))
  71. XCTAssertEqual(object.unitString, HKUnit.milligramsPerDeciliter.unitString)
  72. XCTAssertEqual(object.startDate, startDate)
  73. XCTAssertEqual(object.isDisplayOnly, false)
  74. XCTAssertEqual(object.wasUserEntered, true)
  75. XCTAssertEqual(object.condition, .belowRange)
  76. XCTAssertEqual(object.trend, .flat)
  77. XCTAssertEqual(object.trendRateUnit, HKUnit.milligramsPerDeciliterPerMinute.unitString)
  78. XCTAssertEqual(object.trendRateValue, 0.1)
  79. XCTAssertEqual(object.modificationCounter, 1)
  80. XCTAssertEqual(object.device, device)
  81. XCTAssertEqual(object.healthKitEligibleDate, nil)
  82. }
  83. }
  84. func testToHKQuantitySample() {
  85. cacheStore.managedObjectContext.performAndWait {
  86. let type = HKQuantityType.quantityType(forIdentifier: .bloodGlucose)!
  87. let startDate = dateFormatter.date(from: "2020-02-03T04:05:06Z")!
  88. let quantity = HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 123.4)
  89. let device = HKDevice(name: "NAME", manufacturer: "MANUFACTURER", model: "MODEL", hardwareVersion: "HARDWAREVERSION", firmwareVersion: "FIRMWAREVERSION", softwareVersion: "SOFTWAREVERSION", localIdentifier: "LOCALIDENTIFIER", udiDeviceIdentifier: "UDIDEVICEIDENTIFIER")
  90. let metadata: [String: Any] = [
  91. HKMetadataKeySyncIdentifier: "0B2353CD-7F98-4297-81E2-8D6FCDD02655",
  92. HKMetadataKeySyncVersion: 2,
  93. MetadataKeyGlucoseIsDisplayOnly: true,
  94. HKMetadataKeyWasUserEntered: true,
  95. MetadataKeyGlucoseCondition: "belowRange",
  96. MetadataKeyGlucoseTrend: "→",
  97. MetadataKeyGlucoseTrendRateUnit: HKUnit.milligramsPerDeciliterPerMinute.unitString,
  98. MetadataKeyGlucoseTrendRateValue: 0.1
  99. ]
  100. let quantitySample = HKQuantitySample(type: type, quantity: quantity, start: startDate, end: startDate, device: device, metadata: metadata)
  101. let object = CachedGlucoseObject(context: cacheStore.managedObjectContext)
  102. object.create(from: quantitySample)
  103. XCTAssertEqual(quantitySample.quantity, object.quantitySample.quantity)
  104. XCTAssertEqual(quantitySample.quantityType, object.quantitySample.quantityType)
  105. XCTAssertEqual(quantitySample.condition, object.quantitySample.condition)
  106. XCTAssertEqual(quantitySample.trend, object.quantitySample.trend)
  107. XCTAssertEqual(quantitySample.trendRate, object.quantitySample.trendRate)
  108. XCTAssertEqual(quantitySample.provenanceIdentifier, object.quantitySample.provenanceIdentifier)
  109. XCTAssertEqual(quantitySample.absorptionTime, object.quantitySample.absorptionTime)
  110. XCTAssertEqual(quantitySample.automaticallyIssued, object.quantitySample.automaticallyIssued)
  111. XCTAssertEqual(quantitySample.count, object.quantitySample.count)
  112. XCTAssertEqual(quantitySample.createdByCurrentApp, object.quantitySample.createdByCurrentApp)
  113. XCTAssertEqual(quantitySample.hasLoopKitOrigin, object.quantitySample.hasLoopKitOrigin)
  114. XCTAssertEqual(quantitySample.isDisplayOnly, object.quantitySample.isDisplayOnly)
  115. XCTAssertEqual(quantitySample.manuallyEntered, object.quantitySample.manuallyEntered)
  116. XCTAssertEqual(quantitySample.wasUserEntered, object.quantitySample.wasUserEntered)
  117. XCTAssertEqual(quantitySample.syncVersion, object.quantitySample.syncVersion)
  118. XCTAssertEqual(quantitySample.syncIdentifier, object.quantitySample.syncIdentifier)
  119. XCTAssertEqual(quantitySample.startDate, object.quantitySample.startDate)
  120. XCTAssertEqual(quantitySample.endDate, object.quantitySample.endDate)
  121. XCTAssertNotEqual(quantitySample.uuid, object.quantitySample.uuid) // the UUIDs won't be the same...
  122. XCTAssertEqual(quantitySample.dose, object.quantitySample.dose)
  123. XCTAssertEqual(quantitySample.foodType, object.quantitySample.foodType)
  124. XCTAssertEqual(quantitySample.insulinType, object.quantitySample.insulinType)
  125. XCTAssertEqual(quantitySample.insulinDeliveryReason, object.quantitySample.insulinDeliveryReason)
  126. XCTAssertEqual(quantitySample.device, object.quantitySample.device)
  127. }
  128. }
  129. private let dateFormatter = ISO8601DateFormatter()
  130. }