CoreDataMigrationTests.swift 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. //
  2. // CoreDataMigrationTests.swift
  3. // LoopKitHostedTests
  4. //
  5. // Created by Rick Pasetto on 8/9/21.
  6. // Copyright © 2021 LoopKit Authors. All rights reserved.
  7. //
  8. import CoreData
  9. import HealthKit
  10. import XCTest
  11. @testable import LoopKit
  12. class CoreDataV1MigrationTests: XCTestCase {
  13. var cacheStore: PersistenceController!
  14. let fileManager = FileManager()
  15. static let bundleURL = Bundle(for: CoreDataV1MigrationTests.self).bundleURL
  16. override func setUpWithError() throws {
  17. try? fileManager.removeItem(at: Self.bundleURL.appendingPathComponent("Model.sqlite"))
  18. try fileManager.copyItem(at: Self.bundleURL.appendingPathComponent("Model.sqlite.v1.original"),
  19. to: Self.bundleURL.appendingPathComponent("Model.sqlite"))
  20. }
  21. override func tearDownWithError() throws {
  22. // remove all stores
  23. try cacheStore.managedObjectContext.persistentStoreCoordinator?.persistentStores.forEach { store in
  24. try cacheStore.managedObjectContext.persistentStoreCoordinator?.remove(store)
  25. }
  26. try fileManager.removeItem(at: Self.bundleURL.appendingPathComponent("Model.sqlite"))
  27. cacheStore = nil
  28. }
  29. func testV1Migration() throws {
  30. let e = expectation(description: "\(#function): init")
  31. cacheStore = PersistenceController.init(directoryURL: Self.bundleURL)
  32. var error: Error?
  33. cacheStore.onReady {
  34. if let err = $0 {
  35. error = err
  36. XCTFail("Error opening \(Self.bundleURL): \(err)")
  37. }
  38. e.fulfill()
  39. }
  40. wait(for: [e], timeout: 10.0)
  41. if let error = error { throw error }
  42. var entries: [CachedCarbObject]!
  43. let e0 = expectation(description: "\(#function): fetch")
  44. cacheStore.managedObjectContext.performAndWait {
  45. do {
  46. entries = try cacheStore.managedObjectContext.fetch(CachedCarbObject.fetchRequest())
  47. } catch let err {
  48. error = err
  49. }
  50. e0.fulfill()
  51. }
  52. wait(for: [e0], timeout: 1.0)
  53. if let error = error { throw error }
  54. XCTAssertEqual(1, entries.count)
  55. // Do some spot checks.
  56. XCTAssertTrue(entityHasAttribute(entityName: "CachedGlucoseObject", attributeName: "device"))
  57. XCTAssertTrue(entityHasAttribute(entityName: "CachedGlucoseObject", attributeName: "trend"))
  58. }
  59. func entityHasAttribute(entityName: String, attributeName: String) -> Bool {
  60. XCTAssertNotNil(cacheStore.managedObjectContext.persistentStoreCoordinator?.managedObjectModel.entities)
  61. if let entities = cacheStore.managedObjectContext.persistentStoreCoordinator?.managedObjectModel.entities {
  62. for entity in entities {
  63. if entity.name == entityName, entity.attributesByName.contains(where: { (key: String, value: NSAttributeDescription) in
  64. key == attributeName
  65. }) {
  66. return true
  67. }
  68. }
  69. }
  70. return false
  71. }
  72. }