HKHealthStoreMock.swift 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. private var saveHandler: ((_ objects: [HKObject], _ success: Bool, _ error: Error?) -> Void)?
  15. let queue = DispatchQueue(label: "HKHealthStoreMock")
  16. override func save(_ objects: [HKObject], withCompletion completion: @escaping (Bool, Error?) -> Void) {
  17. queue.async {
  18. completion(self.saveError == nil, self.saveError)
  19. self.saveHandler?(objects, self.saveError == nil, self.saveError)
  20. }
  21. }
  22. override func delete(_ objects: [HKObject], withCompletion completion: @escaping (Bool, Error?) -> Void) {
  23. queue.async {
  24. completion(self.deleteError == nil, self.deleteError)
  25. }
  26. }
  27. func setSaveHandler(_ saveHandler: ((_ objects: [HKObject], _ success: Bool, _ error: Error?) -> Void)?) {
  28. queue.sync {
  29. self.saveHandler = saveHandler
  30. }
  31. }
  32. }
  33. extension HKHealthStoreMock: HKSampleQueryTestable {
  34. func executeSampleQuery(
  35. for type: HKSampleType,
  36. matching predicate: NSPredicate,
  37. limit: Int,
  38. sortDescriptors: [NSSortDescriptor]?,
  39. resultsHandler: @escaping (_ query: HKSampleQuery, _ results: [HKSample]?, _ error: Error?) -> Void
  40. ) {
  41. let query = HKSampleQuery(sampleType: type, predicate: predicate, limit: limit, sortDescriptors: sortDescriptors, resultsHandler: resultsHandler)
  42. guard let results = queryResults else {
  43. execute(query)
  44. return
  45. }
  46. queue.async {
  47. resultsHandler(query, results.samples, results.error)
  48. }
  49. }
  50. }