HKHealthStoreMock.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //
  2. // HKHealthStoreMock.swift
  3. // LoopKitTests
  4. //
  5. // Copyright © 2018 LoopKit Authors. All rights reserved.
  6. //
  7. import HealthKit
  8. import Foundation
  9. @testable import LoopKit
  10. class HKHealthStoreMock: HKHealthStore {
  11. var saveError: Error?
  12. var deleteError: Error?
  13. var queryResults: (samples: [HKSample]?, error: Error?)?
  14. var lastQuery: HKQuery?
  15. var authorizationStatus: HKAuthorizationStatus?
  16. let authorizationRequestUserResponse: Result<Bool, Error> = .success(true)
  17. private var saveHandler: ((_ objects: [HKObject], _ success: Bool, _ error: Error?) -> Void)?
  18. private var deleteObjectsHandler: ((_ objectType: HKObjectType, _ predicate: NSPredicate, _ success: Bool, _ count: Int, _ error: Error?) -> Void)?
  19. let queue = DispatchQueue(label: "HKHealthStoreMock")
  20. override func save(_ object: HKObject, withCompletion completion: @escaping (Bool, Error?) -> Void) {
  21. queue.async {
  22. self.saveHandler?([object], self.saveError == nil, self.saveError)
  23. completion(self.saveError == nil, self.saveError)
  24. }
  25. }
  26. override func save(_ objects: [HKObject], withCompletion completion: @escaping (Bool, Error?) -> Void) {
  27. queue.async {
  28. self.saveHandler?(objects, self.saveError == nil, self.saveError)
  29. completion(self.saveError == nil, self.saveError)
  30. }
  31. }
  32. override func delete(_ objects: [HKObject], withCompletion completion: @escaping (Bool, Error?) -> Void) {
  33. queue.async {
  34. completion(self.deleteError == nil, self.deleteError)
  35. }
  36. }
  37. override func deleteObjects(of objectType: HKObjectType, predicate: NSPredicate, withCompletion completion: @escaping (Bool, Int, Error?) -> Void) {
  38. queue.async {
  39. self.deleteObjectsHandler?(objectType, predicate, self.deleteError == nil, 0, self.deleteError)
  40. completion(self.deleteError == nil, 0, self.deleteError)
  41. }
  42. }
  43. func setSaveHandler(_ saveHandler: ((_ objects: [HKObject], _ success: Bool, _ error: Error?) -> Void)?) {
  44. queue.sync {
  45. self.saveHandler = saveHandler
  46. }
  47. }
  48. override func requestAuthorization(toShare typesToShare: Set<HKSampleType>?, read typesToRead: Set<HKObjectType>?, completion: @escaping (Bool, Error?) -> Void) {
  49. switch authorizationRequestUserResponse {
  50. case .success(let authorized):
  51. authorizationStatus = authorized ? .sharingAuthorized : .sharingDenied
  52. DispatchQueue.main.async {
  53. completion(true, nil)
  54. }
  55. case .failure(let error):
  56. DispatchQueue.main.async {
  57. completion(false, error)
  58. }
  59. }
  60. }
  61. override func authorizationStatus(for type: HKObjectType) -> HKAuthorizationStatus {
  62. return authorizationStatus ?? .notDetermined
  63. }
  64. func setDeletedObjectsHandler(_ deleteObjectsHandler: ((_ objectType: HKObjectType, _ predicate: NSPredicate, _ success: Bool, _ count: Int, _ error: Error?) -> Void)?) {
  65. queue.sync {
  66. self.deleteObjectsHandler = deleteObjectsHandler
  67. }
  68. }
  69. }
  70. extension HKHealthStoreMock {
  71. override func execute(_ query: HKQuery) {
  72. self.lastQuery = query
  73. }
  74. }
  75. extension HKHealthStoreMock: HKSampleQueryTestable {
  76. func executeSampleQuery(
  77. for type: HKSampleType,
  78. matching predicate: NSPredicate,
  79. limit: Int,
  80. sortDescriptors: [NSSortDescriptor]?,
  81. resultsHandler: @escaping (_ query: HKSampleQuery, _ results: [HKSample]?, _ error: Error?) -> Void
  82. ) {
  83. let query = HKSampleQuery(sampleType: type, predicate: predicate, limit: limit, sortDescriptors: sortDescriptors, resultsHandler: resultsHandler)
  84. guard let results = queryResults else {
  85. execute(query)
  86. return
  87. }
  88. queue.async {
  89. resultsHandler(query, results.samples, results.error)
  90. }
  91. }
  92. }