HKHealthStoreMock.swift 3.4 KB

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