TempTargetStorageTests.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import CoreData
  2. import Foundation
  3. import Swinject
  4. import Testing
  5. @testable import Trio
  6. @Suite("TempTargetStorage Tests") struct TempTargetsStorageTests: Injectable {
  7. @Injected() var storage: TempTargetsStorage!
  8. let resolver: Resolver
  9. let coreDataStack = CoreDataStack.createForTests()
  10. let testContext: NSManagedObjectContext
  11. init() {
  12. // Create test context
  13. testContext = coreDataStack.newTaskContext()
  14. // Create assembler with test assembly
  15. let assembler = Assembler([
  16. StorageAssembly(),
  17. ServiceAssembly(),
  18. APSAssembly(),
  19. NetworkAssembly(),
  20. UIAssembly(),
  21. SecurityAssembly(),
  22. TestAssembly(testContext: testContext) // Add our test assembly last to override TempTargetStorage
  23. ])
  24. resolver = assembler.resolver
  25. injectServices(resolver)
  26. }
  27. @Test("Storage is correctly initialized") func testStorageInitialization() {
  28. // Verify storage exists
  29. #expect(storage != nil, "TempTargetsStorage should be injected")
  30. // Verify it's the correct type
  31. #expect(
  32. storage is BaseTempTargetsStorage, "Storage should be of type BaseTempTargetsStorage"
  33. )
  34. }
  35. @Test("Store and retrieve temp target") func testStoreAndRetrieveTempTarget() async throws {
  36. // Given
  37. let testTarget = TempTarget(
  38. name: "Test Target",
  39. createdAt: Date(),
  40. targetTop: 120,
  41. targetBottom: 120,
  42. duration: 60,
  43. enteredBy: "Test",
  44. reason: "Testing",
  45. isPreset: false,
  46. halfBasalTarget: 160
  47. )
  48. // When
  49. try await storage.storeTempTarget(tempTarget: testTarget)
  50. // Then verify stored entries
  51. let storedEntries = try await CoreDataStack.shared.fetchEntitiesAsync(
  52. ofType: TempTargetStored.self,
  53. onContext: testContext,
  54. predicate: NSPredicate(format: "name == %@", "Test Target"),
  55. key: "date",
  56. ascending: false
  57. ) as? [TempTargetStored]
  58. #expect(storedEntries?.isEmpty == false, "Should have stored entries")
  59. #expect(storedEntries?.count == 1, "Should have exactly one entry")
  60. let storedTarget = storedEntries?.first
  61. #expect(storedTarget?.name == "Test Target", "Name should match")
  62. #expect(storedTarget?.target == 120, "Target should match")
  63. #expect(storedTarget?.duration == 60, "Duration should match")
  64. }
  65. @Test("Delete temp target Preset") func testDeleteTempTarget() async throws {
  66. // Given
  67. let testTarget = TempTarget(
  68. name: "Delete Test",
  69. createdAt: Date(),
  70. targetTop: 120,
  71. targetBottom: 120,
  72. duration: 60,
  73. enteredBy: "Test",
  74. reason: "Testing deletion of a preset",
  75. isPreset: true,
  76. halfBasalTarget: 160
  77. )
  78. // Store the target
  79. try await storage.storeTempTarget(tempTarget: testTarget)
  80. // Get the stored target's ObjectID
  81. let storedEntries = try await CoreDataStack.shared.fetchEntitiesAsync(
  82. ofType: TempTargetStored.self,
  83. onContext: testContext,
  84. predicate: NSPredicate(format: "name == %@", "Delete Test"),
  85. key: "date",
  86. ascending: false
  87. ) as? [TempTargetStored]
  88. guard let objectID = storedEntries?.first?.objectID else {
  89. throw TestError("Failed to get stored target's ObjectID")
  90. }
  91. // When
  92. await storage.deleteTempTargetPreset(objectID)
  93. // Then verify deletion
  94. let remainingEntries = try await CoreDataStack.shared.fetchEntitiesAsync(
  95. ofType: TempTargetStored.self,
  96. onContext: testContext,
  97. predicate: NSPredicate(format: "name == %@", "Delete Test"),
  98. key: "date",
  99. ascending: false
  100. ) as? [TempTargetStored]
  101. #expect(remainingEntries?.isEmpty == true, "Should have no entries after deletion")
  102. }
  103. @Test("Get temp targets not yet uploaded to Nightscout") func testGetTempTargetsNotYetUploadedToNightscout() async throws {
  104. // Given
  105. let testTarget = TempTarget(
  106. name: "NS Test",
  107. createdAt: Date(),
  108. targetTop: 120,
  109. targetBottom: 120,
  110. duration: 45,
  111. enteredBy: "Test",
  112. reason: "Testing NS Upload",
  113. isPreset: true,
  114. enabled: true,
  115. halfBasalTarget: 160
  116. )
  117. // When
  118. try await storage.storeTempTarget(tempTarget: testTarget)
  119. let notUploadedTargets = try await storage.getTempTargetsNotYetUploadedToNightscout()
  120. // Then
  121. #expect(!notUploadedTargets.isEmpty, "Should have targets not uploaded to NS")
  122. let target = notUploadedTargets[0]
  123. #expect(target.eventType == .nsTempTarget, "Event type should be NS temp target")
  124. #expect(target.duration == 45, "Duration should match")
  125. #expect(target.targetTop == 120, "Target top should match target")
  126. #expect(target.targetBottom == 120, "Target bottom should match target")
  127. }
  128. }