HKHealthStoreMock.swift 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. private var saveHandler: ((_ objects: [HKObject], _ success: Bool, _ error: Error?) -> Void)?
  17. private var deleteObjectsHandler: ((_ objectType: HKObjectType, _ predicate: NSPredicate, _ success: Bool, _ count: Int, _ error: Error?) -> Void)?
  18. let queue = DispatchQueue(label: "HKHealthStoreMock")
  19. override func save(_ object: HKObject, withCompletion completion: @escaping (Bool, Error?) -> Void) {
  20. queue.async {
  21. self.saveHandler?([object], self.saveError == nil, self.saveError)
  22. completion(self.saveError == nil, self.saveError)
  23. }
  24. }
  25. override func save(_ objects: [HKObject], withCompletion completion: @escaping (Bool, Error?) -> Void) {
  26. queue.async {
  27. self.saveHandler?(objects, self.saveError == nil, self.saveError)
  28. completion(self.saveError == nil, self.saveError)
  29. }
  30. }
  31. override func delete(_ objects: [HKObject], withCompletion completion: @escaping (Bool, Error?) -> Void) {
  32. queue.async {
  33. completion(self.deleteError == nil, self.deleteError)
  34. }
  35. }
  36. override func deleteObjects(of objectType: HKObjectType, predicate: NSPredicate, withCompletion completion: @escaping (Bool, Int, Error?) -> Void) {
  37. queue.async {
  38. self.deleteObjectsHandler?(objectType, predicate, self.deleteError == nil, 0, self.deleteError)
  39. completion(self.deleteError == nil, 0, self.deleteError)
  40. }
  41. }
  42. func setSaveHandler(_ saveHandler: ((_ objects: [HKObject], _ success: Bool, _ error: Error?) -> Void)?) {
  43. queue.sync {
  44. self.saveHandler = saveHandler
  45. }
  46. }
  47. override func requestAuthorization(toShare typesToShare: Set<HKSampleType>?, read typesToRead: Set<HKObjectType>?, completion: @escaping (Bool, Error?) -> Void) {
  48. DispatchQueue.main.async {
  49. completion(true, nil)
  50. }
  51. }
  52. override func authorizationStatus(for type: HKObjectType) -> HKAuthorizationStatus {
  53. return authorizationStatus ?? .notDetermined
  54. }
  55. func setDeletedObjectsHandler(_ deleteObjectsHandler: ((_ objectType: HKObjectType, _ predicate: NSPredicate, _ success: Bool, _ count: Int, _ error: Error?) -> Void)?) {
  56. queue.sync {
  57. self.deleteObjectsHandler = deleteObjectsHandler
  58. }
  59. }
  60. }
  61. extension HKHealthStoreMock {
  62. override func execute(_ query: HKQuery) {
  63. self.lastQuery = query
  64. }
  65. }
  66. extension HKHealthStoreMock: HKSampleQueryTestable {
  67. func executeSampleQuery(
  68. for type: HKSampleType,
  69. matching predicate: NSPredicate,
  70. limit: Int,
  71. sortDescriptors: [NSSortDescriptor]?,
  72. resultsHandler: @escaping (_ query: HKSampleQuery, _ results: [HKSample]?, _ error: Error?) -> Void
  73. ) {
  74. let query = HKSampleQuery(sampleType: type, predicate: predicate, limit: limit, sortDescriptors: sortDescriptors, resultsHandler: resultsHandler)
  75. guard let results = queryResults else {
  76. execute(query)
  77. return
  78. }
  79. queue.async {
  80. resultsHandler(query, results.samples, results.error)
  81. }
  82. }
  83. }