diff --git a/Examples/RemindersTests/Internal.swift b/Examples/RemindersTests/Internal.swift index 61c1dd30..03f45434 100644 --- a/Examples/RemindersTests/Internal.swift +++ b/Examples/RemindersTests/Internal.swift @@ -14,7 +14,7 @@ import Testing try $0.bootstrapDatabase() try await $0.defaultSyncEngine.sendChanges() }, - .snapshots(record: .failed) + .snapshots(record: .missing) ) struct BaseTestSuite {} diff --git a/Examples/SyncUps/App.swift b/Examples/SyncUps/App.swift index cf6da384..fe5426f7 100644 --- a/Examples/SyncUps/App.swift +++ b/Examples/SyncUps/App.swift @@ -66,7 +66,7 @@ struct AppView: View { switch path { case .detail(let model): SyncUpDetailView(model: model) - case .meeting(let meeting, attendees: let attendees): + case .meeting(let meeting, let attendees): MeetingView(meeting: meeting, attendees: attendees) case .record(let model): RecordMeetingView(model: model) diff --git a/Sources/SQLiteData/CloudKit/CloudKitSharing.swift b/Sources/SQLiteData/CloudKit/CloudKitSharing.swift index 09f4181b..284b0d6b 100644 --- a/Sources/SQLiteData/CloudKit/CloudKitSharing.swift +++ b/Sources/SQLiteData/CloudKit/CloudKitSharing.swift @@ -195,7 +195,7 @@ """ ) } - try await metadatabase.write { db in + try await userDatabase.write { db in try SyncMetadata .where { $0.recordName.eq(recordName) } .update { diff --git a/Sources/SQLiteData/CloudKit/SyncEngine.swift b/Sources/SQLiteData/CloudKit/SyncEngine.swift index 24891aa4..a6c77d35 100644 --- a/Sources/SQLiteData/CloudKit/SyncEngine.swift +++ b/Sources/SQLiteData/CloudKit/SyncEngine.swift @@ -1502,7 +1502,8 @@ } var unsyncedRecords: [CKRecord] = [] for start in stride(from: 0, to: orderedUnsyncedRecordIDs.count, by: batchSize) { - let recordIDsBatch = orderedUnsyncedRecordIDs + let recordIDsBatch = + orderedUnsyncedRecordIDs .dropFirst(start) .prefix(batchSize) let results = try await syncEngine.database.records(for: Array(recordIDsBatch)) @@ -1586,7 +1587,7 @@ return false case (_, nil): return true - case let (.some(lhs), .some(rhs)): + case (.some(let lhs), .some(let rhs)): let lhsIndex = tablesByOrder[lhs] ?? (rootFirst ? .max : .min) let rhsIndex = tablesByOrder[rhs] ?? (rootFirst ? .max : .min) guard lhsIndex != rhsIndex @@ -1937,7 +1938,7 @@ private func refreshLastKnownServerRecord(_ record: CKRecord) async { await withErrorReporting(.sqliteDataCloudKitFailure) { - try await metadatabase.write { db in + try await userDatabase.write { db in let metadata = try SyncMetadata.find(record.recordID).fetchOne(db) func updateLastKnownServerRecord() throws { try SyncMetadata @@ -2328,7 +2329,8 @@ tablesByName: [String: any SynchronizableTable] ) throws -> [String: Int] { let tableDependencies = try userDatabase.read { db in - var dependencies: OrderedDictionary = [:] + var dependencies: OrderedDictionary = + [:] for table in tables { func open(_: some SynchronizableTable) throws -> [String] { try PragmaForeignKeyList diff --git a/Sources/SQLiteData/CloudKit/SyncMetadata.swift b/Sources/SQLiteData/CloudKit/SyncMetadata.swift index 2d64e7a4..22990098 100644 --- a/Sources/SQLiteData/CloudKit/SyncMetadata.swift +++ b/Sources/SQLiteData/CloudKit/SyncMetadata.swift @@ -97,19 +97,27 @@ /// next batch of pending changes is processed. public let _isDeleted: Bool - @Column(generated: .virtual) - public let hasLastKnownServerRecord: Bool + @Column("hasLastKnownServerRecord", generated: .virtual) + public let _hasLastKnownServerRecord: Bool + + @Column("isShared", generated: .virtual) + fileprivate let _isShared: Bool + + /// The time the user last modified the record. + public let userModificationTime: Int64 + + public var hasLastKnownServerRecord: Bool { + lastKnownServerRecord != nil + } /// Determines if the record associated with this metadata is currently shared in CloudKit. /// /// This can only return `true` for root records. For example, the metadata associated with a /// `RemindersList` can have `isShared == true`, but a `Reminder` associated with the list /// will have `isShared == false`. - @Column(generated: .virtual) - public let isShared: Bool - - /// The time the user last modified the record. - public let userModificationTime: Int64 + public var isShared: Bool { + _isShared + } } @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) @@ -129,6 +137,24 @@ public var parentRecordType: TableColumn { parentRecordID.parentRecordType } + + // NB: Workaround for https://github.com/groue/GRDB.swift/discussions/1844 + public var hasLastKnownServerRecord: some QueryExpression { + #sql( + """ + ((\(self._hasLastKnownServerRecord) = 1) AND (\(self.lastKnownServerRecord) OR 1)) + """ + ) + } + + // NB: Workaround for https://github.com/groue/GRDB.swift/discussions/1844 + public var isShared: some QueryExpression { + #sql( + """ + ((\(self._isShared) = 1) AND (\(self.share) OR 1)) + """ + ) + } } @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) @@ -162,8 +188,8 @@ self.lastKnownServerRecord = lastKnownServerRecord self._lastKnownServerRecordAllFields = _lastKnownServerRecordAllFields self.share = share - self.hasLastKnownServerRecord = lastKnownServerRecord != nil - self.isShared = share != nil + self._hasLastKnownServerRecord = lastKnownServerRecord != nil + self._isShared = share != nil self.userModificationTime = userModificationTime self._isDeleted = false } diff --git a/Tests/SQLiteDataTests/AssertQueryTests.swift b/Tests/SQLiteDataTests/AssertQueryTests.swift index 08ca809e..ac82ec53 100644 --- a/Tests/SQLiteDataTests/AssertQueryTests.swift +++ b/Tests/SQLiteDataTests/AssertQueryTests.swift @@ -8,7 +8,7 @@ import Testing @MainActor @Suite( .dependency(\.defaultDatabase, try .database()), - .snapshots(record: .failed), + .snapshots(record: .missing), ) struct AssertQueryTests { @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) diff --git a/Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift b/Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift index c9e7c117..c90130db 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift @@ -171,8 +171,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├────────────────────────────────────────────────────────────────────┤ @@ -193,8 +193,8 @@ │ _lastKnownServerRecordAllFields: nil, │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: false, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────────────┘ @@ -257,8 +257,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -293,8 +293,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────┘ @@ -421,8 +421,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -443,8 +443,8 @@ │ _lastKnownServerRecordAllFields: nil, │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: false, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -518,8 +518,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -554,8 +554,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/Tests/SQLiteDataTests/CloudKitTests/AttachedMetadatabaseTests.swift b/Tests/SQLiteDataTests/CloudKitTests/AttachedMetadatabaseTests.swift index 6a199936..1d13ead2 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/AttachedMetadatabaseTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/AttachedMetadatabaseTests.swift @@ -56,8 +56,8 @@ │ │ ), │ │ │ share: nil, │ │ │ _isDeleted: false, │ - │ │ hasLastKnownServerRecord: true, │ - │ │ isShared: false, │ + │ │ _hasLastKnownServerRecord: true, │ + │ │ _isShared: false, │ │ │ userModificationTime: 0 │ │ │ ) │ └─────────────────────┴────────────────────────────────────────────────────────────────────┘ diff --git a/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift b/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift index 13e85616..207728c7 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift @@ -546,8 +546,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────┘ @@ -629,8 +629,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────┘ @@ -699,8 +699,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────────┘ diff --git a/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift index c3db0e3c..0f58f0d6 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift @@ -235,8 +235,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -271,8 +271,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -302,8 +302,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -334,8 +334,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -370,8 +370,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -401,8 +401,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -433,8 +433,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -469,8 +469,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -499,8 +499,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -529,8 +529,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────┘ @@ -582,8 +582,8 @@ │ │ ), │ │ │ share: nil, │ │ │ _isDeleted: false, │ - │ │ hasLastKnownServerRecord: true, │ - │ │ isShared: false, │ + │ │ _hasLastKnownServerRecord: true, │ + │ │ _isShared: false, │ │ │ userModificationTime: 0 │ │ │ ) │ ├─────────────────────┼────────────────────────────────────────────────────────────────────┤ @@ -613,14 +613,77 @@ │ │ ), │ │ │ share: nil, │ │ │ _isDeleted: false, │ - │ │ hasLastKnownServerRecord: true, │ - │ │ isShared: false, │ + │ │ _hasLastKnownServerRecord: true, │ + │ │ _isShared: false, │ │ │ userModificationTime: 0 │ │ │ ) │ └─────────────────────┴────────────────────────────────────────────────────────────────────┘ """ } } + + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + @Test(.attachMetadatabase(true)) + func observation() async throws { + let remindersList = RemindersList(id: 1, title: "Personal") + try await userDatabase.userWrite { db in + try db.seed { remindersList } + } + try await syncEngine.processPendingRecordZoneChanges(scope: .private) + + @FetchAll( + SyncMetadata + .select { + RecordNameAndIsShared.Columns( + recordName: $0.recordName, + isShared: $0.share.isNot(nil) + ) + }, + database: userDatabase.database + ) + var rows + try await $rows.load() + #expect(rows == [RecordNameAndIsShared(recordName: "1:remindersLists", isShared: false)]) + + _ = try await syncEngine.share(record: remindersList) { _ in } + + try await Task.sleep(for: .seconds(0.5)) + #expect(rows == [RecordNameAndIsShared(recordName: "1:remindersLists", isShared: true)]) + } + + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + @Test(.attachMetadatabase(true)) + func observation_GeneratedColumn() async throws { + let remindersList = RemindersList(id: 1, title: "Personal") + try await userDatabase.userWrite { db in + try db.seed { remindersList } + } + try await syncEngine.processPendingRecordZoneChanges(scope: .private) + + @FetchAll( + SyncMetadata + .select { + RecordNameAndIsShared.Columns( + recordName: $0.recordName, + isShared: $0.isShared + ) + }, + database: userDatabase.database + ) + var rows + try await $rows.load() + #expect(rows == [RecordNameAndIsShared(recordName: "1:remindersLists", isShared: false)]) + + _ = try await syncEngine.share(record: remindersList) { _ in } + + try await Task.sleep(for: .seconds(0.5)) + #expect(rows == [RecordNameAndIsShared(recordName: "1:remindersLists", isShared: true)]) + } } } + + @Selection struct RecordNameAndIsShared: Equatable { + let recordName: String + let isShared: Bool + } #endif diff --git a/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift index f74d730f..4f31673a 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift @@ -501,8 +501,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -584,8 +584,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -619,8 +619,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 60 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -654,8 +654,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 60 │ │ ) │ └──────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -1169,8 +1169,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -1205,8 +1205,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -1850,8 +1850,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -1886,8 +1886,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -1921,8 +1921,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 1 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -1956,8 +1956,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └──────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -2155,8 +2155,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -2191,8 +2191,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -2226,8 +2226,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -2261,8 +2261,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └──────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -2460,8 +2460,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -2496,8 +2496,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -2531,8 +2531,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -2566,8 +2566,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └──────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -2745,8 +2745,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -2781,8 +2781,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -2816,8 +2816,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 1 │ │ ) │ └──────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -2988,8 +2988,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -3024,8 +3024,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -3059,8 +3059,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 1 │ │ ) │ ├──────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -3094,8 +3094,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └──────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineDelegateTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineDelegateTests.swift index c97c95ee..40c55eaf 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineDelegateTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineDelegateTests.swift @@ -64,8 +64,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────────────┘ @@ -138,8 +138,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────────────┘ diff --git a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift index 83257f4d..7b720c2e 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift @@ -49,8 +49,8 @@ │ _lastKnownServerRecordAllFields: nil, │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: false, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────┤ @@ -71,8 +71,8 @@ │ _lastKnownServerRecordAllFields: nil, │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: false, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └──────────────────────────────────────────┘ @@ -329,8 +329,8 @@ │ share: nil │ │ ), │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: true, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: true, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────────────────┤ @@ -351,8 +351,8 @@ │ _lastKnownServerRecordAllFields: nil, │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: false, │ + │ _isShared: false, │ │ userModificationTime: 60 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -607,8 +607,8 @@ │ _lastKnownServerRecordAllFields: nil, │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: false, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├──────────────────────────────────────────┤ @@ -629,8 +629,8 @@ │ _lastKnownServerRecordAllFields: nil, │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: false, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └──────────────────────────────────────────┘ @@ -685,8 +685,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ @@ -721,8 +721,8 @@ │ ), │ │ share: nil, │ │ _isDeleted: false, │ - │ hasLastKnownServerRecord: true, │ - │ isShared: false, │ + │ _hasLastKnownServerRecord: true, │ + │ _isShared: false, │ │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────┘