From e8e4bf62b73086a771f34dbcfb15242238d723ff Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Sun, 14 Sep 2025 18:17:30 -0500 Subject: [PATCH 1/8] Fix floating point comparison bug. --- .../CloudKit/CloudKit+StructuredQueries.swift | 26 ++++++++-- .../FetchRecordZoneChangesTests.swift | 14 ++++-- .../CloudKitTests/MergeConflictTests.swift | 47 ++++++++++++------- 3 files changed, 61 insertions(+), 26 deletions(-) diff --git a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift index ceaba56f..cfd0737b 100644 --- a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift +++ b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift @@ -163,9 +163,11 @@ at userModificationDate: Date ) -> Bool { guard - encryptedValues[at: key] < userModificationDate, + date(encryptedValues[at: key], comesBefore: userModificationDate), encryptedValues[key] != newValue - else { return false } + else { + return false + } encryptedValues[key] = newValue encryptedValues[at: key] = userModificationDate self.userModificationDate = userModificationDate @@ -180,7 +182,10 @@ ) -> Bool { @Dependency(\.dataManager) var dataManager - guard encryptedValues[at: key] < userModificationDate else { return false } + guard date(encryptedValues[at: key], comesBefore: userModificationDate) + else { + return false + } let asset = CKAsset(fileURL: URL(hash: newValue)) guard let fileURL = asset.fileURL, (self[key] as? CKAsset)?.fileURL != fileURL @@ -199,8 +204,10 @@ forKey key: CKRecord.FieldKey, at userModificationDate: Date ) -> Bool { - guard encryptedValues[at: key] < userModificationDate - else { return false } + guard date(encryptedValues[at: key], comesBefore: userModificationDate) + else { + return false + } if encryptedValues[key] != nil { encryptedValues[key] = nil encryptedValues[at: key] = userModificationDate @@ -348,4 +355,13 @@ set { self[#function] = newValue } } } + + // NB: We add a small amount of leeway when comparing dates due to floating point inaccuracies. + private func date(_ date: Date, comesBefore otherDate: Date) -> Bool { + date + .addingTimeInterval(-0.001) + < otherDate + .addingTimeInterval(0.001) + } + #endif diff --git a/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift b/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift index 7bd6a539..12057189 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift @@ -124,7 +124,7 @@ } operation: { let reminderRecord = try syncEngine.private.database .record(for: Reminder.recordID(for: 1)) - reminderRecord.setValue("2", forKey: "remindersListID", at: now) + reminderRecord.setValue(2, forKey: "remindersListID", at: now) reminderRecord.parent = CKRecord.Reference( recordID: RemindersList.recordID(for: 2), action: .none @@ -133,8 +133,12 @@ try await syncEngine.modifyRecords(scope: .private, saving: [reminderRecord]).notify() } - try await userDatabase.userWrite { db in - try Reminder.find(1).update { $0.isCompleted.toggle() }.execute(db) + try await withDependencies { + $0.datetime.now.addTimeInterval(2) + } operation: { + try await userDatabase.userWrite { db in + try Reminder.find(1).update { $0.isCompleted.toggle() }.execute(db) + } } try await syncEngine.processPendingRecordZoneChanges(scope: .private) @@ -177,8 +181,8 @@ parent: CKReference(recordID: CKRecord.ID(2:remindersLists/zone/__defaultOwner__)), share: nil, id: 1, - isCompleted: 0, - remindersListID: "2", + isCompleted: 1, + remindersListID: 2, title: "Get milk" ), [1]: CKRecord( diff --git a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift index 37cb7c3d..e5a7dd06 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift @@ -5,6 +5,7 @@ import InlineSnapshotTesting import OrderedCollections import SQLiteData + import SQLiteDataTestSupport import SnapshotTestingCustomDump import Testing @@ -402,30 +403,40 @@ } try await syncEngine.processPendingRecordZoneChanges(scope: .private) - let record = try syncEngine.private.database.record(for: Reminder.recordID(for: 1)) - let userModificationDate = now.addingTimeInterval(60) - record.setValue("Buy milk", forKey: "title", at: userModificationDate) - let modificationCallback = try { - try syncEngine.modifyRecords(scope: .private, saving: [record]) - }() - try await withDependencies { $0.datetime.now = now.addingTimeInterval(30) } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Get milk" }.execute(db) } + try await withDependencies { + $0.datetime.now = now.addingTimeInterval(30) + } operation: { + let record = try syncEngine.private.database.record(for: Reminder.recordID(for: 1)) + record.setValue("Buy milk", forKey: "title", at: now) + let modificationCallback = try { + try syncEngine.modifyRecords(scope: .private, saving: [record]) + }() + + await modificationCallback.notify() + try await syncEngine.processPendingRecordZoneChanges(scope: .private) + } } - await modificationCallback.notify() - try await syncEngine.processPendingRecordZoneChanges(scope: .private) - try await userDatabase.userWrite { db in - try #expect( - Reminder.find(1).fetchOne(db) - == Reminder(id: 1, title: "Get milk", remindersListID: 1) - ) + assertQuery(Reminder.all, database: userDatabase.database) { + """ + ┌───────────────────────┐ + │ Reminder( │ + │ id: 1, │ + │ dueDate: nil, │ + │ isCompleted: false, │ + │ priority: nil, │ + │ title: "Get milk", │ + │ remindersListID: 1 │ + │ ) │ + └───────────────────────┘ + """ } - assertInlineSnapshot(of: container, as: .customDump) { """ MockCloudContainer( @@ -443,7 +454,7 @@ isCompleted🗓️: 0, remindersListID: 1, remindersListID🗓️: 0, - title: "Buy milk", + title: "Get milk", title🗓️: 60, 🗓️: 60 ), @@ -703,6 +714,10 @@ ) } } + + @Test func doubleResolution() { + + } } } #endif From 3f0331e2890d9a045e4b17900bab38874c9877fe Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Sun, 14 Sep 2025 18:38:44 -0500 Subject: [PATCH 2/8] wip --- Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift | 5 +---- Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift | 4 ---- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift index cfd0737b..ec468729 100644 --- a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift +++ b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift @@ -358,10 +358,7 @@ // NB: We add a small amount of leeway when comparing dates due to floating point inaccuracies. private func date(_ date: Date, comesBefore otherDate: Date) -> Bool { - date - .addingTimeInterval(-0.001) - < otherDate - .addingTimeInterval(0.001) + date.addingTimeInterval(-0.001) < otherDate.addingTimeInterval(0.001) } #endif diff --git a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift index e5a7dd06..5cefda1c 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift @@ -714,10 +714,6 @@ ) } } - - @Test func doubleResolution() { - - } } } #endif From 7482c8d8b8abb7a3357495308895ec6bade435b3 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Sun, 14 Sep 2025 19:25:27 -0500 Subject: [PATCH 3/8] wip --- .../CloudKit/CloudKit+StructuredQueries.swift | 66 ++++----- .../CloudKit/Internal/CloudKitFunctions.swift | 6 +- .../CloudKit/Internal/DatetimeGenerator.swift | 22 +-- .../CloudKit/Internal/Metadatabase.swift | 2 +- .../CloudKit/Internal/Triggers.swift | 2 +- Sources/SQLiteData/CloudKit/SyncEngine.swift | 14 +- .../SQLiteData/CloudKit/SyncMetadata.swift | 8 +- .../CloudKitTests/AccountLifecycleTests.swift | 16 +- .../CloudKitTests/AssetsTests.swift | 2 +- .../CloudKitTests/CloudKitTests.swift | 24 +-- .../FetchRecordZoneChangesTests.swift | 18 +-- .../ForeignKeyConstraintTests.swift | 14 +- .../CloudKitTests/MergeConflictTests.swift | 39 +++-- .../CloudKitTests/MetadataTests.swift | 26 ++-- .../NextRecordZoneChangeBatchTests.swift | 4 +- .../ReferenceViolationTests.swift | 18 +-- .../CloudKitTests/SchemaChangeTests.swift | 8 +- .../SharingPermissionsTests.swift | 4 +- .../CloudKitTests/SharingTests.swift | 8 +- .../SyncEngineLifecycleTests.swift | 140 +++++++++--------- .../CloudKitTests/TriggerTests.swift | 48 +++--- .../CloudKitTests/UserlandTests.swift | 2 +- .../Internal/BaseCloudKitTests.swift | 4 +- .../Internal/CloudKit+CustomDump.swift | 21 ++- 24 files changed, 255 insertions(+), 261 deletions(-) diff --git a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift index ec468729..ed27d10d 100644 --- a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift +++ b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift @@ -135,12 +135,12 @@ @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) extension CKRecordKeyValueSetting { - subscript(at key: String) -> Date { + subscript(at key: String) -> Int64 { get { - self["\(CKRecord.userModificationDateKey)_\(key)"] as? Date ?? .distantPast + self["\(CKRecord.userModificationTimeKey)_\(key)"] as? Int64 ?? -1 } set { - self["\(CKRecord.userModificationDateKey)_\(key)"] = max(self[at: key], newValue) + self["\(CKRecord.userModificationTimeKey)_\(key)"] = max(self[at: key], newValue) } } } @@ -160,17 +160,17 @@ package func setValue( _ newValue: some CKRecordValueProtocol & Equatable, forKey key: CKRecord.FieldKey, - at userModificationDate: Date + at userModificationTime: Int64 ) -> Bool { guard - date(encryptedValues[at: key], comesBefore: userModificationDate), + encryptedValues[at: key] < userModificationTime, encryptedValues[key] != newValue else { return false } encryptedValues[key] = newValue - encryptedValues[at: key] = userModificationDate - self.userModificationDate = userModificationDate + encryptedValues[at: key] = userModificationTime + self.userModificationTime = userModificationTime return true } @@ -178,11 +178,11 @@ package func setValue( _ newValue: [UInt8], forKey key: CKRecord.FieldKey, - at userModificationDate: Date + at userModificationTime: Int64 ) -> Bool { @Dependency(\.dataManager) var dataManager - guard date(encryptedValues[at: key], comesBefore: userModificationDate) + guard encryptedValues[at: key] < userModificationTime else { return false } @@ -194,61 +194,61 @@ try dataManager.save(Data(newValue), to: fileURL) } self[key] = asset - encryptedValues[at: key] = userModificationDate - self.userModificationDate = userModificationDate + encryptedValues[at: key] = userModificationTime + self.userModificationTime = userModificationTime return true } @discardableResult package func removeValue( forKey key: CKRecord.FieldKey, - at userModificationDate: Date + at userModificationTime: Int64 ) -> Bool { - guard date(encryptedValues[at: key], comesBefore: userModificationDate) + guard encryptedValues[at: key] < userModificationTime else { return false } if encryptedValues[key] != nil { encryptedValues[key] = nil - encryptedValues[at: key] = userModificationDate - self.userModificationDate = userModificationDate + encryptedValues[at: key] = userModificationTime + self.userModificationTime = userModificationTime return true } else if self[key] != nil { self[key] = nil - encryptedValues[at: key] = userModificationDate - self.userModificationDate = userModificationDate + encryptedValues[at: key] = userModificationTime + self.userModificationTime = userModificationTime return true } return false } - func update(with row: T, userModificationDate: Date) { + func update(with row: T, userModificationTime: Int64) { for column in T.TableColumns.writableColumns { func open(_ column: some WritableTableColumnExpression) { let column = column as! any WritableTableColumnExpression let value = Value(queryOutput: row[keyPath: column.keyPath]) switch value.queryBinding { case .blob(let value): - setValue(value, forKey: column.name, at: userModificationDate) + setValue(value, forKey: column.name, at: userModificationTime) case .bool(let value): - setValue(value, forKey: column.name, at: userModificationDate) + setValue(value, forKey: column.name, at: userModificationTime) case .double(let value): - setValue(value, forKey: column.name, at: userModificationDate) + setValue(value, forKey: column.name, at: userModificationTime) case .date(let value): - setValue(value, forKey: column.name, at: userModificationDate) + setValue(value, forKey: column.name, at: userModificationTime) case .int(let value): - setValue(value, forKey: column.name, at: userModificationDate) + setValue(value, forKey: column.name, at: userModificationTime) case .null: - removeValue(forKey: column.name, at: userModificationDate) + removeValue(forKey: column.name, at: userModificationTime) case .text(let value): - setValue(value, forKey: column.name, at: userModificationDate) + setValue(value, forKey: column.name, at: userModificationTime) case .uint(let value): - setValue(value, forKey: column.name, at: userModificationDate) + setValue(value, forKey: column.name, at: userModificationTime) case .uuid(let value): setValue( value.uuidString.lowercased(), forKey: column.name, - at: userModificationDate + at: userModificationTime ) case .invalid(let error): reportIssue(error) @@ -266,7 +266,7 @@ ) { typealias EquatableCKRecordValueProtocol = CKRecordValueProtocol & Equatable - self.userModificationDate = other.userModificationDate + self.userModificationTime = other.userModificationTime for column in T.TableColumns.writableColumns { func open(_ column: some WritableTableColumnExpression) { let key = column.name @@ -318,15 +318,15 @@ } } - package var userModificationDate: Date { - get { encryptedValues[Self.userModificationDateKey] as? Date ?? .distantPast } + package var userModificationTime: Int64 { + get { encryptedValues[Self.userModificationTimeKey] as? Int64 ?? -1 } set { - encryptedValues[Self.userModificationDateKey] = Swift.max(userModificationDate, newValue) + encryptedValues[Self.userModificationTimeKey] = Swift.max(userModificationTime, newValue) } } - package static let userModificationDateKey = - "\(String.sqliteDataCloudKitSchemaName)_userModificationDate" + package static let userModificationTimeKey = + "\(String.sqliteDataCloudKitSchemaName)_userModificationTime" } extension __CKRecordObjCValue { diff --git a/Sources/SQLiteData/CloudKit/Internal/CloudKitFunctions.swift b/Sources/SQLiteData/CloudKit/Internal/CloudKitFunctions.swift index fb1fa47f..be6962e9 100644 --- a/Sources/SQLiteData/CloudKit/Internal/CloudKitFunctions.swift +++ b/Sources/SQLiteData/CloudKit/Internal/CloudKitFunctions.swift @@ -2,9 +2,9 @@ import CloudKit import Foundation - @DatabaseFunction("sqlitedata_icloud_datetime") - func datetime() -> Date { - @Dependency(\.datetime.now) var now + @DatabaseFunction("sqlitedata_icloud_currentTime") + func currentTime() -> Int64 { + @Dependency(\.currentTime.now) var now return now } diff --git a/Sources/SQLiteData/CloudKit/Internal/DatetimeGenerator.swift b/Sources/SQLiteData/CloudKit/Internal/DatetimeGenerator.swift index 94c36a11..038f7976 100644 --- a/Sources/SQLiteData/CloudKit/Internal/DatetimeGenerator.swift +++ b/Sources/SQLiteData/CloudKit/Internal/DatetimeGenerator.swift @@ -1,26 +1,26 @@ import Dependencies import Foundation -package struct DatetimeGenerator: DependencyKey, Sendable { - private var generate: @Sendable () -> Date - package var now: Date { +package struct CurrentTimeGenerator: DependencyKey, Sendable { + private var generate: @Sendable () -> Int64 + package var now: Int64 { get { self.generate() } set { self.generate = { newValue } } } - package func callAsFunction() -> Date { + package func callAsFunction() -> Int64 { self.generate() } - package static var liveValue: DatetimeGenerator { - Self { Date() } + package static var liveValue: CurrentTimeGenerator { + Self { Int64(clock_gettime_nsec_np(CLOCK_REALTIME)) } } - package static var testValue: DatetimeGenerator { - Self { Date() } + package static var testValue: CurrentTimeGenerator { + Self { Int64(clock_gettime_nsec_np(CLOCK_REALTIME)) } } } extension DependencyValues { - package var datetime: DatetimeGenerator { - get { self[DatetimeGenerator.self] } - set { self[DatetimeGenerator.self] = newValue } + package var currentTime: CurrentTimeGenerator { + get { self[CurrentTimeGenerator.self] } + set { self[CurrentTimeGenerator.self] = newValue } } } diff --git a/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift b/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift index 16bdb32c..36ed7aa1 100644 --- a/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift +++ b/Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift @@ -64,7 +64,7 @@ "share" BLOB, "hasLastKnownServerRecord" INTEGER NOT NULL AS ("lastKnownServerRecord" IS NOT NULL), "isShared" INTEGER NOT NULL AS ("share" IS NOT NULL), - "userModificationDate" TEXT NOT NULL DEFAULT (\($datetime())), + "userModificationTime" INTEGER NOT NULL DEFAULT (\($currentTime())), "_isDeleted" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("recordPrimaryKey", "recordType"), diff --git a/Sources/SQLiteData/CloudKit/Internal/Triggers.swift b/Sources/SQLiteData/CloudKit/Internal/Triggers.swift index c2fbe727..9f1da0db 100644 --- a/Sources/SQLiteData/CloudKit/Internal/Triggers.swift +++ b/Sources/SQLiteData/CloudKit/Internal/Triggers.swift @@ -118,7 +118,7 @@ } doUpdate: { $0.parentRecordPrimaryKey = $1.parentRecordPrimaryKey $0.parentRecordType = $1.parentRecordType - $0.userModificationDate = $1.userModificationDate + $0.userModificationTime = $1.userModificationTime } } } diff --git a/Sources/SQLiteData/CloudKit/SyncEngine.swift b/Sources/SQLiteData/CloudKit/SyncEngine.swift index 71245e50..344d0806 100644 --- a/Sources/SQLiteData/CloudKit/SyncEngine.swift +++ b/Sources/SQLiteData/CloudKit/SyncEngine.swift @@ -322,7 +322,7 @@ ) .execute(db) } - db.add(function: $datetime) + db.add(function: $currentTime) db.add(function: $syncEngineIsSynchronizingChanges) db.add(function: $didUpdate) db.add(function: $didDelete) @@ -571,7 +571,7 @@ db.remove(function: $didDelete) db.remove(function: $didUpdate) db.remove(function: $syncEngineIsSynchronizingChanges) - db.remove(function: $datetime) + db.remove(function: $currentTime) } try metadatabase.erase() try migrate(metadatabase: metadatabase) @@ -932,7 +932,7 @@ record.update( with: T(queryOutput: row), - userModificationDate: metadata.userModificationDate + userModificationTime: metadata.userModificationTime ) await refreshLastKnownServerRecord(record) sentRecord = recordID @@ -1509,7 +1509,7 @@ lastKnownServerRecord: serverRecord, _lastKnownServerRecordAllFields: serverRecord, share: nil, - userModificationDate: serverRecord.userModificationDate + userModificationTime: serverRecord.userModificationTime ) } onConflict: { ($0.recordPrimaryKey, $0.recordType) @@ -1526,8 +1526,8 @@ .where { $0.recordName.eq(serverRecord.recordID.recordName) } .fetchOne(db) } - serverRecord.userModificationDate = - metadata?.userModificationDate ?? serverRecord.userModificationDate + serverRecord.userModificationTime = + metadata?.userModificationTime ?? serverRecord.userModificationTime func open(_: T.Type) async throws { let columnNames: [String] @@ -2009,7 +2009,7 @@ self.lastKnownServerRecord = lastKnownServerRecord self._lastKnownServerRecordAllFields = lastKnownServerRecord if let lastKnownServerRecord { - self.userModificationDate = lastKnownServerRecord.userModificationDate + self.userModificationTime = lastKnownServerRecord.userModificationTime } } } diff --git a/Sources/SQLiteData/CloudKit/SyncMetadata.swift b/Sources/SQLiteData/CloudKit/SyncMetadata.swift index 8fca929d..5b8cf9cb 100644 --- a/Sources/SQLiteData/CloudKit/SyncMetadata.swift +++ b/Sources/SQLiteData/CloudKit/SyncMetadata.swift @@ -75,8 +75,8 @@ @Column(generated: .virtual) public let isShared: Bool - /// The date the user last modified the record. - public var userModificationDate: Date + /// The time the user last modified the record. + public var userModificationTime: Int64 } @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) @@ -118,7 +118,7 @@ lastKnownServerRecord: CKRecord? = nil, _lastKnownServerRecordAllFields: CKRecord? = nil, share: CKShare? = nil, - userModificationDate: Date + userModificationTime: Int64 ) { self.recordPrimaryKey = recordPrimaryKey self.recordType = recordType @@ -135,7 +135,7 @@ self.share = share self.hasLastKnownServerRecord = lastKnownServerRecord != nil self.isShared = share != nil - self.userModificationDate = userModificationDate + self.userModificationTime = userModificationTime } } diff --git a/Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift b/Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift index 1420b436..e9586ca9 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift @@ -171,7 +171,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -187,7 +187,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: false, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────────────┘ """ @@ -248,7 +248,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -278,7 +278,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────┘ """ @@ -402,7 +402,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: true, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -418,7 +418,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: false, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────────────────┘ """ @@ -490,7 +490,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: true, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -520,7 +520,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────────────────┘ """ diff --git a/Tests/SQLiteDataTests/CloudKitTests/AssetsTests.swift b/Tests/SQLiteDataTests/CloudKitTests/AssetsTests.swift index bd3c1680..fa88425f 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/AssetsTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/AssetsTests.swift @@ -71,7 +71,7 @@ } try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try RemindersListAsset diff --git a/Tests/SQLiteDataTests/CloudKitTests/CloudKitTests.swift b/Tests/SQLiteDataTests/CloudKitTests/CloudKitTests.swift index 8fec608f..1260f327 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/CloudKitTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/CloudKitTests.swift @@ -447,7 +447,7 @@ ) { """ [ - [0]: "sqlitedata_icloud_datetime", + [0]: "sqlitedata_icloud_currenttime", [1]: "sqlitedata_icloud_diddelete", [2]: "sqlitedata_icloud_didupdate", [3]: "sqlitedata_icloud_haspermission", @@ -502,7 +502,7 @@ } try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { try await userDatabase.userWrite { db in try RemindersList @@ -569,7 +569,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { let record = try syncEngine.private.database.record(for: RemindersList.recordID(for: 1)) record.setValue("Work", forKey: "title", at: now) @@ -587,13 +587,13 @@ """ } assertQuery( - SyncMetadata.select(\.userModificationDate), + SyncMetadata.select(\.userModificationTime), database: syncEngine.metadatabase ) { """ - ┌────────────────────────────────┐ - │ Date(1970-01-01T00:01:00.000Z) │ - └────────────────────────────────┘ + ┌────┐ + │ 60 │ + └────┘ """ } assertInlineSnapshot(of: container, as: .customDump) { @@ -631,7 +631,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).update { $0.title = "My stuff" }.execute(db) @@ -683,13 +683,13 @@ assertQuery(Reminder.all, database: userDatabase.database) assertQuery( - SyncMetadata.select(\.userModificationDate), + SyncMetadata.select(\.userModificationTime), database: syncEngine.metadatabase ) { """ - ┌────────────────────────────────┐ - │ Date(1970-01-01T00:00:00.000Z) │ - └────────────────────────────────┘ + ┌───┐ + │ 0 │ + └───┘ """ } assertInlineSnapshot(of: container, as: .customDump) { diff --git a/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift b/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift index 12057189..55acfc79 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift @@ -64,7 +64,7 @@ } try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.isCompleted.toggle() }.execute(db) @@ -120,7 +120,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { let reminderRecord = try syncEngine.private.database .record(for: Reminder.recordID(for: 1)) @@ -134,7 +134,7 @@ } try await withDependencies { - $0.datetime.now.addTimeInterval(2) + $0.currentTime.now += (2) } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.isCompleted.toggle() }.execute(db) @@ -224,7 +224,7 @@ try await syncEngine.modifyRecords(scope: .private, saving: [remindersListRecord]).notify() try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).update { $0.title = "My stuff" }.execute(db) @@ -306,7 +306,7 @@ await remindersListModification.notify() try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Buy milk" }.execute(db) @@ -426,7 +426,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try Tag.find("weekend").update { $0.title = "optional" }.execute(db) @@ -545,7 +545,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────┘ """ @@ -625,7 +625,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────┘ """ @@ -692,7 +692,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └────────────────────────────────────────────────────────────────┘ """ diff --git a/Tests/SQLiteDataTests/CloudKitTests/ForeignKeyConstraintTests.swift b/Tests/SQLiteDataTests/CloudKitTests/ForeignKeyConstraintTests.swift index c0ecaf7e..8be7eba7 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/ForeignKeyConstraintTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/ForeignKeyConstraintTests.swift @@ -43,7 +43,7 @@ await remindersListModification.notify() try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Buy milk" }.execute(db) @@ -388,7 +388,7 @@ } try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Buy milk" }.execute(db) @@ -485,7 +485,7 @@ ).notify() let modifications = try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { let reminderRecord = try syncEngine.private.database.record( for: Reminder.recordID(for: 1) @@ -606,7 +606,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) let modifications = try withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { let reminderRecord = try syncEngine.private.database .record(for: Reminder.recordID(for: 1)) @@ -619,7 +619,7 @@ } try await withDependencies { - $0.datetime.now.addTimeInterval(2) + $0.currentTime.now += (2) } operation: { try await userDatabase.userWrite { db in try Reminder.find(1) @@ -705,7 +705,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) let modifications = try withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { let reminderRecord = try syncEngine.private.database .record(for: Reminder.recordID(for: 1)) @@ -718,7 +718,7 @@ } try await withDependencies { - $0.datetime.now.addTimeInterval(2) + $0.currentTime.now += (2) } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.remindersListID = 3 }.execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift index 5cefda1c..2c7645f6 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift @@ -65,14 +65,13 @@ } let record = try syncEngine.private.database.record(for: Reminder.recordID(for: 1)) - let userModificationDate = now.addingTimeInterval(60) - record.setValue("Buy milk", forKey: "title", at: userModificationDate) + record.setValue("Buy milk", forKey: "title", at: 60) let modificationCallback = try { try syncEngine.modifyRecords(scope: .private, saving: [record]) }() try await withDependencies { - $0.datetime.now = now.addingTimeInterval(30) + $0.currentTime.now += 30 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.isCompleted = true }.execute(db) @@ -220,14 +219,13 @@ } let record = try syncEngine.private.database.record(for: Reminder.recordID(for: 1)) - let userModificationDate = now.addingTimeInterval(30) - record.setValue("Buy milk", forKey: "title", at: userModificationDate) + record.setValue("Buy milk", forKey: "title", at: 30) let modificationCallback = try { try syncEngine.modifyRecords(scope: .private, saving: [record]) }() try await withDependencies { - $0.datetime.now = now.addingTimeInterval(60) + $0.currentTime.now += 60 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.isCompleted = true }.execute(db) @@ -334,14 +332,13 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) let record = try syncEngine.private.database.record(for: Reminder.recordID(for: 1)) - let userModificationDate = now.addingTimeInterval(30) - record.setValue("Buy milk", forKey: "title", at: userModificationDate) + record.setValue("Buy milk", forKey: "title", at: 30) let modificationCallback = try { try syncEngine.modifyRecords(scope: .private, saving: [record]) }() try await withDependencies { - $0.datetime.now = now.addingTimeInterval(60) + $0.currentTime.now += 60 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.isCompleted = true }.execute(db) @@ -404,13 +401,13 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now = now.addingTimeInterval(30) + $0.currentTime.now += 30 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Get milk" }.execute(db) } try await withDependencies { - $0.datetime.now = now.addingTimeInterval(30) + $0.currentTime.now += 30 } operation: { let record = try syncEngine.private.database.record(for: Reminder.recordID(for: 1)) record.setValue("Buy milk", forKey: "title", at: now) @@ -454,7 +451,7 @@ isCompleted🗓️: 0, remindersListID: 1, remindersListID🗓️: 0, - title: "Get milk", + title: "Buy milk", title🗓️: 60, 🗓️: 60 ), @@ -491,14 +488,13 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) let record = try syncEngine.private.database.record(for: Reminder.recordID(for: 1)) - let userModificationDate = now.addingTimeInterval(30) - record.setValue("Buy milk", forKey: "title", at: userModificationDate) + record.setValue("Buy milk", forKey: "title", at: 30) let modificationCallback = try { try syncEngine.modifyRecords(scope: .private, saving: [record]) }() try await withDependencies { - $0.datetime.now = now.addingTimeInterval(60) + $0.currentTime.now += 60 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Get milk" }.execute(db) @@ -561,14 +557,13 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) let record = try syncEngine.private.database.record(for: Reminder.recordID(for: 1)) - let userModificationDate = now.addingTimeInterval(30) - record.setValue("Buy milk", forKey: "title", at: userModificationDate) + record.setValue("Buy milk", forKey: "title", at: 30) let modificationCallback = try { try syncEngine.modifyRecords(scope: .private, saving: [record]) }() try await withDependencies { - $0.datetime.now = now.addingTimeInterval(60) + $0.currentTime.now += 60 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Get milk" }.execute(db) @@ -634,10 +629,10 @@ let reminderRecord = try syncEngine.private.database.record( for: Reminder.recordID(for: 1) ) - reminderRecord.setValue( - now.addingTimeInterval(30), + reminderRecord.setValue(Date( + timeIntervalSince1970: Double(now + 30)), forKey: "dueDate", - at: now.addingTimeInterval(1) + at: now + 1 ) let modificationsFinished = try syncEngine.modifyRecords( scope: .private, @@ -645,7 +640,7 @@ ) try withDependencies { - $0.datetime.now.addTimeInterval(2) + $0.currentTime.now += (2) } operation: { try userDatabase.userWrite { db in try Reminder.find(1).update { $0.priority = 3 }.execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift index 0a927d32..5f0f0f3a 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift @@ -25,7 +25,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { try userDatabase.userWrite { db in try Reminder.find(1) @@ -234,7 +234,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -264,7 +264,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -292,7 +292,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -321,7 +321,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -351,7 +351,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -379,7 +379,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -408,7 +408,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -438,7 +438,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -465,7 +465,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -492,7 +492,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────┘ """ @@ -542,7 +542,7 @@ │ │ _isDeleted: false, │ │ │ hasLastKnownServerRecord: true, │ │ │ isShared: false, │ - │ │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ │ userModificationTime: 0 │ │ │ ) │ ├─────────────────────┼────────────────────────────────────────────────────────────────────┤ │ RemindersList( │ SyncMetadata( │ @@ -570,7 +570,7 @@ │ │ _isDeleted: false, │ │ │ hasLastKnownServerRecord: true, │ │ │ isShared: false, │ - │ │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ │ userModificationTime: 0 │ │ │ ) │ └─────────────────────┴────────────────────────────────────────────────────────────────────┘ """ diff --git a/Tests/SQLiteDataTests/CloudKitTests/NextRecordZoneChangeBatchTests.swift b/Tests/SQLiteDataTests/CloudKitTests/NextRecordZoneChangeBatchTests.swift index 93650a97..f887d120 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/NextRecordZoneChangeBatchTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/NextRecordZoneChangeBatchTests.swift @@ -40,7 +40,7 @@ SyncMetadata( recordPrimaryKey: "1", recordType: UnrecognizedTable.tableName, - userModificationDate: .distantPast + userModificationTime: 0 ) } .execute(db) @@ -70,7 +70,7 @@ SyncMetadata( recordPrimaryKey: "1", recordType: RemindersList.tableName, - userModificationDate: .distantPast + userModificationTime: 0 ) } .execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/ReferenceViolationTests.swift b/Tests/SQLiteDataTests/CloudKitTests/ReferenceViolationTests.swift index 924b18a1..9401d74d 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/ReferenceViolationTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/ReferenceViolationTests.swift @@ -29,7 +29,7 @@ deleting: [RemindersList.recordID(for: 2)] ) try withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try userDatabase.userWrite { db in try Reminder.find(1).update { $0.remindersListID = 2 }.execute(db) @@ -92,14 +92,14 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).delete().execute(db) } } let modifications = try withDependencies { - $0.datetime.now.addTimeInterval(2) + $0.currentTime.now += (2) } operation: { let reminderRecord = CKRecord( recordType: Reminder.tableName, @@ -174,14 +174,14 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).delete().execute(db) } } let modifications = try withDependencies { - $0.datetime.now.addTimeInterval(2) + $0.currentTime.now += (2) } operation: { let reminderRecord = CKRecord( recordType: Reminder.tableName, @@ -262,14 +262,14 @@ deleting: [Parent.recordID(for: 2)] ) try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try ChildWithOnDeleteSetNull.find(1).update { $0.parentID = 2 }.execute(db) } } try await withDependencies { - $0.datetime.now.addTimeInterval(2) + $0.currentTime.now += (2) } operation: { try await syncEngine.processPendingRecordZoneChanges(scope: .private) await modifications.notify() @@ -340,14 +340,14 @@ deleting: [Parent.recordID(for: 2)] ) try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try ChildWithOnDeleteSetDefault.find(1).update { $0.parentID = 2 }.execute(db) } } try await withDependencies { - $0.datetime.now.addTimeInterval(2) + $0.currentTime.now += (2) } operation: { try await syncEngine.processPendingRecordZoneChanges(scope: .private) await modifications.notify() diff --git a/Tests/SQLiteDataTests/CloudKitTests/SchemaChangeTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SchemaChangeTests.swift index 9292a102..0cb977d5 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SchemaChangeTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SchemaChangeTests.swift @@ -31,7 +31,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { let personalListRecord = try syncEngine.private.database.record( for: RemindersList.recordID(for: 1) @@ -121,7 +121,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { let personalListRecord = try syncEngine.private.database.record( for: RemindersList.recordID(for: 1) @@ -180,7 +180,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { let personalListRecord = try syncEngine.private.database.record( for: RemindersList.recordID(for: 1) @@ -241,7 +241,7 @@ @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) @Test func newTable() async throws { try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { let imageRecord = CKRecord( recordType: "images", diff --git a/Tests/SQLiteDataTests/CloudKitTests/SharingPermissionsTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SharingPermissionsTests.swift index aa3e3957..bae5ba1f 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SharingPermissionsTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SharingPermissionsTests.swift @@ -336,7 +336,7 @@ freshShare.currentUserParticipant?.permission = .readOnly let _ = try syncEngine.modifyRecords(scope: .shared, saving: [freshShare]) try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await self.userDatabase.userWrite { db in try db.seed { @@ -424,7 +424,7 @@ let _ = try syncEngine.modifyRecords(scope: .shared, saving: [freshShare]) try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await self.userDatabase.userWrite { db in try RemindersList.find(1).update { $0.title = "Business" }.execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift index 12ce91a5..444e6e27 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift @@ -171,7 +171,7 @@ try await syncEngine.modifyRecords(scope: .shared, saving: [remindersListRecord]).notify() try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { try await userDatabase.userWrite { db in try db.seed { @@ -318,7 +318,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: true, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────────────────┘ """ @@ -344,7 +344,7 @@ try await syncEngine.modifyRecords(scope: .shared, saving: [modelARecord]).notify() try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { try await userDatabase.userWrite { db in try db.seed { @@ -430,7 +430,7 @@ ).notify() try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).delete().execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift index 8ed166d6..43937140 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift @@ -33,39 +33,39 @@ assertQuery(SyncMetadata.all, database: syncEngine.metadatabase) { """ - ┌────────────────────────────────────────────────────────┐ - │ SyncMetadata( │ - │ recordPrimaryKey: "1", │ - │ recordType: "remindersLists", │ - │ recordName: "1:remindersLists", │ - │ parentRecordPrimaryKey: nil, │ - │ parentRecordType: nil, │ - │ parentRecordName: nil, │ - │ lastKnownServerRecord: nil, │ - │ _lastKnownServerRecordAllFields: nil, │ - │ share: nil, │ - │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ - │ ) │ - ├────────────────────────────────────────────────────────┤ - │ SyncMetadata( │ - │ recordPrimaryKey: "1", │ - │ recordType: "reminders", │ - │ recordName: "1:reminders", │ - │ parentRecordPrimaryKey: "1", │ - │ parentRecordType: "remindersLists", │ - │ parentRecordName: "1:remindersLists", │ - │ lastKnownServerRecord: nil, │ - │ _lastKnownServerRecordAllFields: nil, │ - │ share: nil, │ - │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ - │ ) │ - └────────────────────────────────────────────────────────┘ + ┌─────────────────────────────────────────┐ + │ SyncMetadata( │ + │ recordPrimaryKey: "1", │ + │ recordType: "remindersLists", │ + │ recordName: "1:remindersLists", │ + │ parentRecordPrimaryKey: nil, │ + │ parentRecordType: nil, │ + │ parentRecordName: nil, │ + │ lastKnownServerRecord: nil, │ + │ _lastKnownServerRecordAllFields: nil, │ + │ share: nil, │ + │ _isDeleted: false, │ + │ hasLastKnownServerRecord: false, │ + │ isShared: false, │ + │ userModificationTime: 0 │ + │ ) │ + ├─────────────────────────────────────────┤ + │ SyncMetadata( │ + │ recordPrimaryKey: "1", │ + │ recordType: "reminders", │ + │ recordName: "1:reminders", │ + │ parentRecordPrimaryKey: "1", │ + │ parentRecordType: "remindersLists", │ + │ parentRecordName: "1:remindersLists", │ + │ lastKnownServerRecord: nil, │ + │ _lastKnownServerRecordAllFields: nil, │ + │ share: nil, │ + │ _isDeleted: false, │ + │ hasLastKnownServerRecord: false, │ + │ isShared: false, │ + │ userModificationTime: 0 │ + │ ) │ + └─────────────────────────────────────────┘ """ } assertInlineSnapshot(of: container, as: .customDump) { @@ -178,7 +178,7 @@ syncEngine.stop() try await withDependencies { - $0.datetime.now.addTimeInterval(1) + $0.currentTime.now += (1) } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).update { $0.title += "!" }.execute(db) @@ -257,7 +257,7 @@ syncEngine.stop() try await withDependencies { - $0.datetime.now.addTimeInterval(60) + $0.currentTime.now += (60) } operation: { try await userDatabase.userWrite { db in try db.seed { @@ -434,39 +434,39 @@ assertQuery(SyncMetadata.all, database: syncEngine.metadatabase) { """ - ┌────────────────────────────────────────────────────────┐ - │ SyncMetadata( │ - │ recordPrimaryKey: "1", │ - │ recordType: "remindersLists", │ - │ recordName: "1:remindersLists", │ - │ parentRecordPrimaryKey: nil, │ - │ parentRecordType: nil, │ - │ parentRecordName: nil, │ - │ lastKnownServerRecord: nil, │ - │ _lastKnownServerRecordAllFields: nil, │ - │ share: nil, │ - │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ - │ ) │ - ├────────────────────────────────────────────────────────┤ - │ SyncMetadata( │ - │ recordPrimaryKey: "1", │ - │ recordType: "reminders", │ - │ recordName: "1:reminders", │ - │ parentRecordPrimaryKey: "1", │ - │ parentRecordType: "remindersLists", │ - │ parentRecordName: "1:remindersLists", │ - │ lastKnownServerRecord: nil, │ - │ _lastKnownServerRecordAllFields: nil, │ - │ share: nil, │ - │ _isDeleted: false, │ - │ hasLastKnownServerRecord: false, │ - │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ - │ ) │ - └────────────────────────────────────────────────────────┘ + ┌─────────────────────────────────────────┐ + │ SyncMetadata( │ + │ recordPrimaryKey: "1", │ + │ recordType: "remindersLists", │ + │ recordName: "1:remindersLists", │ + │ parentRecordPrimaryKey: nil, │ + │ parentRecordType: nil, │ + │ parentRecordName: nil, │ + │ lastKnownServerRecord: nil, │ + │ _lastKnownServerRecordAllFields: nil, │ + │ share: nil, │ + │ _isDeleted: false, │ + │ hasLastKnownServerRecord: false, │ + │ isShared: false, │ + │ userModificationTime: 0 │ + │ ) │ + ├─────────────────────────────────────────┤ + │ SyncMetadata( │ + │ recordPrimaryKey: "1", │ + │ recordType: "reminders", │ + │ recordName: "1:reminders", │ + │ parentRecordPrimaryKey: "1", │ + │ parentRecordType: "remindersLists", │ + │ parentRecordName: "1:remindersLists", │ + │ lastKnownServerRecord: nil, │ + │ _lastKnownServerRecordAllFields: nil, │ + │ share: nil, │ + │ _isDeleted: false, │ + │ hasLastKnownServerRecord: false, │ + │ isShared: false, │ + │ userModificationTime: 0 │ + │ ) │ + └─────────────────────────────────────────┘ """ } assertInlineSnapshot(of: container, as: .customDump) { @@ -517,7 +517,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ ├─────────────────────────────────────────────────────────────────────────────────────────┤ │ SyncMetadata( │ @@ -547,7 +547,7 @@ │ _isDeleted: false, │ │ hasLastKnownServerRecord: true, │ │ isShared: false, │ - │ userModificationDate: Date(1970-01-01T00:00:00.000Z) │ + │ userModificationTime: 0 │ │ ) │ └─────────────────────────────────────────────────────────────────────────────────────────┘ """ diff --git a/Tests/SQLiteDataTests/CloudKitTests/TriggerTests.swift b/Tests/SQLiteDataTests/CloudKitTests/TriggerTests.swift index 5c407e2a..f71c6be3 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/TriggerTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/TriggerTests.swift @@ -450,7 +450,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'childWithOnDeleteSetDefaults', "new"."parentID", 'parents' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [28]: """ @@ -473,7 +473,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'childWithOnDeleteSetNulls', "new"."parentID", 'parents' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [29]: """ @@ -496,7 +496,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'modelAs', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [30]: """ @@ -519,7 +519,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'modelBs', "new"."modelAID", 'modelAs' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [31]: """ @@ -542,7 +542,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'modelCs', "new"."modelBID", 'modelBs' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [32]: """ @@ -565,7 +565,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'parents', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [33]: """ @@ -588,7 +588,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'reminderTags', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [34]: """ @@ -611,7 +611,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'reminders', "new"."remindersListID", 'remindersLists' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [35]: """ @@ -634,7 +634,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'remindersListAssets', "new"."remindersListID", 'remindersLists' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [36]: """ @@ -657,7 +657,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'remindersListPrivates', "new"."remindersListID", 'remindersLists' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [37]: """ @@ -680,7 +680,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'remindersLists', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [38]: """ @@ -703,7 +703,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."title", 'tags', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [39]: """ @@ -978,7 +978,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'childWithOnDeleteSetDefaults', "new"."parentID", 'parents' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [52]: """ @@ -1001,7 +1001,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'childWithOnDeleteSetNulls', "new"."parentID", 'parents' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [53]: """ @@ -1024,7 +1024,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'modelAs', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [54]: """ @@ -1047,7 +1047,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'modelBs', "new"."modelAID", 'modelAs' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [55]: """ @@ -1070,7 +1070,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'modelCs', "new"."modelBID", 'modelBs' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [56]: """ @@ -1093,7 +1093,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'parents', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [57]: """ @@ -1116,7 +1116,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'reminderTags', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [58]: """ @@ -1139,7 +1139,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'reminders', "new"."remindersListID", 'remindersLists' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [59]: """ @@ -1162,7 +1162,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'remindersListAssets', "new"."remindersListID", 'remindersLists' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [60]: """ @@ -1185,7 +1185,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'remindersListPrivates', "new"."remindersListID", 'remindersLists' ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [61]: """ @@ -1208,7 +1208,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."id", 'remindersLists', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """, [62]: """ @@ -1231,7 +1231,7 @@ ("recordPrimaryKey", "recordType", "parentRecordPrimaryKey", "parentRecordType") SELECT "new"."title", 'tags', NULL, NULL ON CONFLICT ("recordPrimaryKey", "recordType") - DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationDate" = "excluded"."userModificationDate"; + DO UPDATE SET "parentRecordPrimaryKey" = "excluded"."parentRecordPrimaryKey", "parentRecordType" = "excluded"."parentRecordType", "userModificationTime" = "excluded"."userModificationTime"; END """ ] diff --git a/Tests/SQLiteDataTests/CloudKitTests/UserlandTests.swift b/Tests/SQLiteDataTests/CloudKitTests/UserlandTests.swift index af67d365..e5ad0bcd 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/UserlandTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/UserlandTests.swift @@ -21,7 +21,7 @@ try await withDependencies { $0.defaultDatabase = database $0.defaultSyncEngine = syncEngine - $0.datetime.now = Date.init(timeIntervalSince1970: 1) + $0.currentTime.now = 1 } operation: { @FetchAll var modelAs: [ModelA] = [] try await database.write { db in diff --git a/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift b/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift index 97d8dc5f..c6cc339c 100644 --- a/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift +++ b/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift @@ -9,7 +9,7 @@ import os @Suite( .snapshots(record: .missing), .dependencies { - $0.datetime.now = Date(timeIntervalSince1970: 0) + $0.currentTime.now = 0 $0.dataManager = InMemoryDataManager() } ) @@ -18,7 +18,7 @@ class BaseCloudKitTests: @unchecked Sendable { private let _syncEngine: any Sendable private let _container: any Sendable - @Dependency(\.datetime.now) var now + @Dependency(\.currentTime.now) var now @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) var container: MockCloudContainer { diff --git a/Tests/SQLiteDataTests/Internal/CloudKit+CustomDump.swift b/Tests/SQLiteDataTests/Internal/CloudKit+CustomDump.swift index 1a20e4a7..e3cc3e39 100644 --- a/Tests/SQLiteDataTests/Internal/CloudKit+CustomDump.swift +++ b/Tests/SQLiteDataTests/Internal/CloudKit+CustomDump.swift @@ -28,22 +28,22 @@ let keys = encryptedValues.allKeys() .filter { key in CKRecord.printTimestamps - || !key.hasPrefix(CKRecord.userModificationDateKey) + || !key.hasPrefix(CKRecord.userModificationTimeKey) } .sorted { lhs, rhs in - guard lhs != CKRecord.userModificationDateKey + guard lhs != CKRecord.userModificationTimeKey else { return false } - guard rhs != CKRecord.userModificationDateKey + guard rhs != CKRecord.userModificationTimeKey else { return true } - let lhsHasPrefix = lhs.hasPrefix(CKRecord.userModificationDateKey) + let lhsHasPrefix = lhs.hasPrefix(CKRecord.userModificationTimeKey) let baseLHS = lhsHasPrefix - ? String(lhs.dropFirst(CKRecord.userModificationDateKey.count + 1)) + ? String(lhs.dropFirst(CKRecord.userModificationTimeKey.count + 1)) : lhs - let rhsHasPrefix = rhs.hasPrefix(CKRecord.userModificationDateKey) + let rhsHasPrefix = rhs.hasPrefix(CKRecord.userModificationTimeKey) let baseRHS = rhsHasPrefix - ? String(rhs.dropFirst(CKRecord.userModificationDateKey.count + 1)) + ? String(rhs.dropFirst(CKRecord.userModificationTimeKey.count + 1)) : rhs return (baseLHS, lhsHasPrefix ? 1 : 0) < (baseRHS, rhsHasPrefix ? 1 : 0) } @@ -60,11 +60,10 @@ ] + keys .map { - $0.hasPrefix(CKRecord.userModificationDateKey) + $0.hasPrefix(CKRecord.userModificationTimeKey) ? ( - String($0.dropFirst(CKRecord.userModificationDateKey.count + 1)) + "🗓️", - (self.encryptedValues[$0] as? Date).map(\.timeIntervalSince1970).map(Int.init) - as Any + String($0.dropFirst(CKRecord.userModificationTimeKey.count + 1)) + "🗓️", + (self.encryptedValues[$0] as? Int64) as Any ) : ( $0, From 56361b74e3eaa53a00456002a5fcfba9ce2f0cd6 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Sun, 14 Sep 2025 19:43:20 -0500 Subject: [PATCH 4/8] wip; --- .../CloudKit/CloudKit+StructuredQueries.swift | 85 ++++++++++++------- 1 file changed, 52 insertions(+), 33 deletions(-) diff --git a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift index ed27d10d..06535451 100644 --- a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift +++ b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift @@ -154,8 +154,13 @@ } } +import os + @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) extension CKRecord { + @TaskLocal static var fooo = false + + @discardableResult package func setValue( _ newValue: some CKRecordValueProtocol & Equatable, @@ -163,9 +168,20 @@ at userModificationTime: Int64 ) -> Bool { guard - encryptedValues[at: key] < userModificationTime, + encryptedValues[at: key] <= userModificationTime, encryptedValues[key] != newValue else { + if Self.fooo, encryptedValues[key] != newValue { + Logger().info(""" + ⚠️⚠️⚠️ A write to '\(key)' is being ignored + key \(key) + encryptedValues[at: key]: \(self.encryptedValues[at: key]) + userModificationDate: \(userModificationTime) + encryptedValues[key]: \(String(describing: self.encryptedValues[key])) + newValue: \(String(describing: newValue)) + """) + print("!!!") + } return false } encryptedValues[key] = newValue @@ -182,7 +198,7 @@ ) -> Bool { @Dependency(\.dataManager) var dataManager - guard encryptedValues[at: key] < userModificationTime + guard encryptedValues[at: key] <= userModificationTime else { return false } @@ -204,7 +220,7 @@ forKey key: CKRecord.FieldKey, at userModificationTime: Int64 ) -> Bool { - guard encryptedValues[at: key] < userModificationTime + guard encryptedValues[at: key] <= userModificationTime else { return false } @@ -223,38 +239,41 @@ } func update(with row: T, userModificationTime: Int64) { - for column in T.TableColumns.writableColumns { - func open(_ column: some WritableTableColumnExpression) { - let column = column as! any WritableTableColumnExpression - let value = Value(queryOutput: row[keyPath: column.keyPath]) - switch value.queryBinding { - case .blob(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .bool(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .double(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .date(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .int(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .null: - removeValue(forKey: column.name, at: userModificationTime) - case .text(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .uint(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .uuid(let value): - setValue( - value.uuidString.lowercased(), - forKey: column.name, - at: userModificationTime - ) - case .invalid(let error): - reportIssue(error) + Self.$fooo.withValue(true) { + + for column in T.TableColumns.writableColumns { + func open(_ column: some WritableTableColumnExpression) { + let column = column as! any WritableTableColumnExpression + let value = Value(queryOutput: row[keyPath: column.keyPath]) + switch value.queryBinding { + case .blob(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .bool(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .double(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .date(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .int(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .null: + removeValue(forKey: column.name, at: userModificationTime) + case .text(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .uint(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .uuid(let value): + setValue( + value.uuidString.lowercased(), + forKey: column.name, + at: userModificationTime + ) + case .invalid(let error): + reportIssue(error) + } } + open(column) } - open(column) } } From 596109df9c26a39094a3f27535580e454118a3dd Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Sun, 14 Sep 2025 19:52:35 -0500 Subject: [PATCH 5/8] wipa --- .../SQLiteData/CloudKit/CloudKit+StructuredQueries.swift | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift index 06535451..d359fda3 100644 --- a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift +++ b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift @@ -374,10 +374,4 @@ import os set { self[#function] = newValue } } } - - // NB: We add a small amount of leeway when comparing dates due to floating point inaccuracies. - private func date(_ date: Date, comesBefore otherDate: Date) -> Bool { - date.addingTimeInterval(-0.001) < otherDate.addingTimeInterval(0.001) - } - #endif From ed2d83d3399609d45db77cda8141bdd310834333 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Sun, 14 Sep 2025 19:55:53 -0500 Subject: [PATCH 6/8] wip --- .../CloudKit/CloudKit+StructuredQueries.swift | 81 +++++++------------ 1 file changed, 31 insertions(+), 50 deletions(-) diff --git a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift index d359fda3..6a34feb6 100644 --- a/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift +++ b/Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift @@ -154,13 +154,10 @@ } } -import os - @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) extension CKRecord { @TaskLocal static var fooo = false - @discardableResult package func setValue( _ newValue: some CKRecordValueProtocol & Equatable, @@ -170,20 +167,7 @@ import os guard encryptedValues[at: key] <= userModificationTime, encryptedValues[key] != newValue - else { - if Self.fooo, encryptedValues[key] != newValue { - Logger().info(""" - ⚠️⚠️⚠️ A write to '\(key)' is being ignored - key \(key) - encryptedValues[at: key]: \(self.encryptedValues[at: key]) - userModificationDate: \(userModificationTime) - encryptedValues[key]: \(String(describing: self.encryptedValues[key])) - newValue: \(String(describing: newValue)) - """) - print("!!!") - } - return false - } + else { return false } encryptedValues[key] = newValue encryptedValues[at: key] = userModificationTime self.userModificationTime = userModificationTime @@ -239,41 +223,38 @@ import os } func update(with row: T, userModificationTime: Int64) { - Self.$fooo.withValue(true) { - - for column in T.TableColumns.writableColumns { - func open(_ column: some WritableTableColumnExpression) { - let column = column as! any WritableTableColumnExpression - let value = Value(queryOutput: row[keyPath: column.keyPath]) - switch value.queryBinding { - case .blob(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .bool(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .double(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .date(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .int(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .null: - removeValue(forKey: column.name, at: userModificationTime) - case .text(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .uint(let value): - setValue(value, forKey: column.name, at: userModificationTime) - case .uuid(let value): - setValue( - value.uuidString.lowercased(), - forKey: column.name, - at: userModificationTime - ) - case .invalid(let error): - reportIssue(error) - } + for column in T.TableColumns.writableColumns { + func open(_ column: some WritableTableColumnExpression) { + let column = column as! any WritableTableColumnExpression + let value = Value(queryOutput: row[keyPath: column.keyPath]) + switch value.queryBinding { + case .blob(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .bool(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .double(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .date(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .int(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .null: + removeValue(forKey: column.name, at: userModificationTime) + case .text(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .uint(let value): + setValue(value, forKey: column.name, at: userModificationTime) + case .uuid(let value): + setValue( + value.uuidString.lowercased(), + forKey: column.name, + at: userModificationTime + ) + case .invalid(let error): + reportIssue(error) } - open(column) } + open(column) } } From 284fcc36f3731a83db2d2c423315c2e9c7433dd3 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Sun, 14 Sep 2025 19:58:47 -0500 Subject: [PATCH 7/8] wip --- .../CloudKitTests/AssetsTests.swift | 2 +- .../CloudKitTests/CloudKitTests.swift | 6 +++--- .../FetchRecordZoneChangesTests.swift | 12 ++++++------ .../ForeignKeyConstraintTests.swift | 14 +++++++------- .../CloudKitTests/MergeConflictTests.swift | 2 +- .../CloudKitTests/MetadataTests.swift | 2 +- .../ReferenceViolationTests.swift | 18 +++++++++--------- .../CloudKitTests/SchemaChangeTests.swift | 8 ++++---- .../SharingPermissionsTests.swift | 4 ++-- .../CloudKitTests/SharingTests.swift | 6 +++--- .../SyncEngineLifecycleTests.swift | 4 ++-- 11 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Tests/SQLiteDataTests/CloudKitTests/AssetsTests.swift b/Tests/SQLiteDataTests/CloudKitTests/AssetsTests.swift index fa88425f..2be6702b 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/AssetsTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/AssetsTests.swift @@ -71,7 +71,7 @@ } try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try RemindersListAsset diff --git a/Tests/SQLiteDataTests/CloudKitTests/CloudKitTests.swift b/Tests/SQLiteDataTests/CloudKitTests/CloudKitTests.swift index 1260f327..57eb9b3c 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/CloudKitTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/CloudKitTests.swift @@ -502,7 +502,7 @@ } try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { try await userDatabase.userWrite { db in try RemindersList @@ -569,7 +569,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { let record = try syncEngine.private.database.record(for: RemindersList.recordID(for: 1)) record.setValue("Work", forKey: "title", at: now) @@ -631,7 +631,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).update { $0.title = "My stuff" }.execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift b/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift index 55acfc79..51e73353 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift @@ -64,7 +64,7 @@ } try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.isCompleted.toggle() }.execute(db) @@ -120,7 +120,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { let reminderRecord = try syncEngine.private.database .record(for: Reminder.recordID(for: 1)) @@ -134,7 +134,7 @@ } try await withDependencies { - $0.currentTime.now += (2) + $0.currentTime.now += 2 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.isCompleted.toggle() }.execute(db) @@ -224,7 +224,7 @@ try await syncEngine.modifyRecords(scope: .private, saving: [remindersListRecord]).notify() try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).update { $0.title = "My stuff" }.execute(db) @@ -306,7 +306,7 @@ await remindersListModification.notify() try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Buy milk" }.execute(db) @@ -426,7 +426,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try Tag.find("weekend").update { $0.title = "optional" }.execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/ForeignKeyConstraintTests.swift b/Tests/SQLiteDataTests/CloudKitTests/ForeignKeyConstraintTests.swift index 8be7eba7..7f0e0b57 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/ForeignKeyConstraintTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/ForeignKeyConstraintTests.swift @@ -43,7 +43,7 @@ await remindersListModification.notify() try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Buy milk" }.execute(db) @@ -388,7 +388,7 @@ } try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.title = "Buy milk" }.execute(db) @@ -485,7 +485,7 @@ ).notify() let modifications = try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { let reminderRecord = try syncEngine.private.database.record( for: Reminder.recordID(for: 1) @@ -606,7 +606,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) let modifications = try withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { let reminderRecord = try syncEngine.private.database .record(for: Reminder.recordID(for: 1)) @@ -619,7 +619,7 @@ } try await withDependencies { - $0.currentTime.now += (2) + $0.currentTime.now += 2 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1) @@ -705,7 +705,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) let modifications = try withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { let reminderRecord = try syncEngine.private.database .record(for: Reminder.recordID(for: 1)) @@ -718,7 +718,7 @@ } try await withDependencies { - $0.currentTime.now += (2) + $0.currentTime.now += 2 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).update { $0.remindersListID = 3 }.execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift index 2c7645f6..fbe176aa 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift @@ -640,7 +640,7 @@ ) try withDependencies { - $0.currentTime.now += (2) + $0.currentTime.now += 2 } operation: { try userDatabase.userWrite { db in try Reminder.find(1).update { $0.priority = 3 }.execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift index 5f0f0f3a..7fb8a705 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift @@ -25,7 +25,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { try userDatabase.userWrite { db in try Reminder.find(1) diff --git a/Tests/SQLiteDataTests/CloudKitTests/ReferenceViolationTests.swift b/Tests/SQLiteDataTests/CloudKitTests/ReferenceViolationTests.swift index 9401d74d..33b8bd8e 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/ReferenceViolationTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/ReferenceViolationTests.swift @@ -29,7 +29,7 @@ deleting: [RemindersList.recordID(for: 2)] ) try withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try userDatabase.userWrite { db in try Reminder.find(1).update { $0.remindersListID = 2 }.execute(db) @@ -92,14 +92,14 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).delete().execute(db) } } let modifications = try withDependencies { - $0.currentTime.now += (2) + $0.currentTime.now += 2 } operation: { let reminderRecord = CKRecord( recordType: Reminder.tableName, @@ -174,14 +174,14 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).delete().execute(db) } } let modifications = try withDependencies { - $0.currentTime.now += (2) + $0.currentTime.now += 2 } operation: { let reminderRecord = CKRecord( recordType: Reminder.tableName, @@ -262,14 +262,14 @@ deleting: [Parent.recordID(for: 2)] ) try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try ChildWithOnDeleteSetNull.find(1).update { $0.parentID = 2 }.execute(db) } } try await withDependencies { - $0.currentTime.now += (2) + $0.currentTime.now += 2 } operation: { try await syncEngine.processPendingRecordZoneChanges(scope: .private) await modifications.notify() @@ -340,14 +340,14 @@ deleting: [Parent.recordID(for: 2)] ) try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try ChildWithOnDeleteSetDefault.find(1).update { $0.parentID = 2 }.execute(db) } } try await withDependencies { - $0.currentTime.now += (2) + $0.currentTime.now += 2 } operation: { try await syncEngine.processPendingRecordZoneChanges(scope: .private) await modifications.notify() diff --git a/Tests/SQLiteDataTests/CloudKitTests/SchemaChangeTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SchemaChangeTests.swift index 0cb977d5..2af2eb23 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SchemaChangeTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SchemaChangeTests.swift @@ -31,7 +31,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { let personalListRecord = try syncEngine.private.database.record( for: RemindersList.recordID(for: 1) @@ -121,7 +121,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { let personalListRecord = try syncEngine.private.database.record( for: RemindersList.recordID(for: 1) @@ -180,7 +180,7 @@ try await syncEngine.processPendingRecordZoneChanges(scope: .private) try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { let personalListRecord = try syncEngine.private.database.record( for: RemindersList.recordID(for: 1) @@ -241,7 +241,7 @@ @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) @Test func newTable() async throws { try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { let imageRecord = CKRecord( recordType: "images", diff --git a/Tests/SQLiteDataTests/CloudKitTests/SharingPermissionsTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SharingPermissionsTests.swift index bae5ba1f..2f867b2f 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SharingPermissionsTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SharingPermissionsTests.swift @@ -336,7 +336,7 @@ freshShare.currentUserParticipant?.permission = .readOnly let _ = try syncEngine.modifyRecords(scope: .shared, saving: [freshShare]) try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await self.userDatabase.userWrite { db in try db.seed { @@ -424,7 +424,7 @@ let _ = try syncEngine.modifyRecords(scope: .shared, saving: [freshShare]) try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await self.userDatabase.userWrite { db in try RemindersList.find(1).update { $0.title = "Business" }.execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift index 444e6e27..95228859 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift @@ -171,7 +171,7 @@ try await syncEngine.modifyRecords(scope: .shared, saving: [remindersListRecord]).notify() try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { try await userDatabase.userWrite { db in try db.seed { @@ -344,7 +344,7 @@ try await syncEngine.modifyRecords(scope: .shared, saving: [modelARecord]).notify() try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { try await userDatabase.userWrite { db in try db.seed { @@ -430,7 +430,7 @@ ).notify() try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { try await userDatabase.userWrite { db in try Reminder.find(1).delete().execute(db) diff --git a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift index 43937140..140678c1 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift @@ -178,7 +178,7 @@ syncEngine.stop() try await withDependencies { - $0.currentTime.now += (1) + $0.currentTime.now += 1 } operation: { try await userDatabase.userWrite { db in try RemindersList.find(1).update { $0.title += "!" }.execute(db) @@ -257,7 +257,7 @@ syncEngine.stop() try await withDependencies { - $0.currentTime.now += (60) + $0.currentTime.now += 60 } operation: { try await userDatabase.userWrite { db in try db.seed { From eca35f10d7c89fc05143d6551f34b6baf1a480d5 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Sun, 14 Sep 2025 20:02:17 -0500 Subject: [PATCH 8/8] wipa --- Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift index fbe176aa..645540a0 100644 --- a/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift +++ b/Tests/SQLiteDataTests/CloudKitTests/MergeConflictTests.swift @@ -451,7 +451,7 @@ isCompleted🗓️: 0, remindersListID: 1, remindersListID🗓️: 0, - title: "Buy milk", + title: "Get milk", title🗓️: 60, 🗓️: 60 ),