From 7aefa12a5e3fc197c5d3627535224b72aa878ece Mon Sep 17 00:00:00 2001 From: Andrew Roan Date: Mon, 13 Oct 2025 22:18:40 -0500 Subject: [PATCH 1/3] WIP bugfix/build-errors-with-swift-6-2 --- .../CoreDataRepository+Aggregate.swift | 2 +- .../CoreDataRepository+Fetch.swift | 2 +- .../CoreDataRepository+Read_Batch.swift | 8 +- .../Internal/AggregateSubscription.swift | 2 +- .../AggregateThrowingSubscription.swift | 2 +- .../Internal/CountSubscription.swift | 2 +- .../Internal/CountThrowingSubscription.swift | 2 +- .../Internal/FetchSubscription.swift | 2 +- .../Internal/FetchThrowingSubscription.swift | 2 +- .../AggregateTests.swift | 10 +- .../BatchRequestTests.swift | 28 ++--- .../CoreDataTestSuite.swift | 24 ++-- .../Create_BatchTests.swift | 84 ++++++-------- .../CoreDataRepositoryTests/FetchTests.swift | 22 ++-- Tests/CoreDataRepositoryTests/ReadTests.swift | 108 ++++++++++++------ 15 files changed, 159 insertions(+), 141 deletions(-) diff --git a/Sources/CoreDataRepository/CoreDataRepository+Aggregate.swift b/Sources/CoreDataRepository/CoreDataRepository+Aggregate.swift index 637429f..08307f7 100644 --- a/Sources/CoreDataRepository/CoreDataRepository+Aggregate.swift +++ b/Sources/CoreDataRepository/CoreDataRepository+Aggregate.swift @@ -4,7 +4,7 @@ // This source code is licensed under the MIT License (MIT) found in the // LICENSE file in the root directory of this source tree. -import CoreData +@preconcurrency import CoreData import Foundation // swiftlint:disable file_length diff --git a/Sources/CoreDataRepository/CoreDataRepository+Fetch.swift b/Sources/CoreDataRepository/CoreDataRepository+Fetch.swift index fa8b91b..c9a5b67 100644 --- a/Sources/CoreDataRepository/CoreDataRepository+Fetch.swift +++ b/Sources/CoreDataRepository/CoreDataRepository+Fetch.swift @@ -4,7 +4,7 @@ // This source code is licensed under the MIT License (MIT) found in the // LICENSE file in the root directory of this source tree. -import CoreData +@preconcurrency import CoreData import Foundation extension CoreDataRepository { diff --git a/Sources/CoreDataRepository/CoreDataRepository+Read_Batch.swift b/Sources/CoreDataRepository/CoreDataRepository+Read_Batch.swift index 24fb887..67af1ef 100644 --- a/Sources/CoreDataRepository/CoreDataRepository+Read_Batch.swift +++ b/Sources/CoreDataRepository/CoreDataRepository+Read_Batch.swift @@ -95,7 +95,7 @@ extension CoreDataRepository { /// This operation is non-atomic. Each instance may succeed or fail individually. @inlinable public func readAtomically( - _ ids: some Sequence, + _ ids: some Sequence & Sendable, as _: Model.Type ) async -> Result<[Model], CoreDataError> { let context = Transaction.current?.context ?? context @@ -115,7 +115,7 @@ extension CoreDataRepository { /// This operation is non-atomic. Each instance may succeed or fail individually. @inlinable public func readAtomically( - _ items: some Sequence + _ items: some Sequence & Sendable ) async -> Result<[Model], CoreDataError> { let context = Transaction.current?.context ?? context return await context.performInChild(schedule: .enqueued) { readContext in @@ -134,7 +134,7 @@ extension CoreDataRepository { /// This operation is non-atomic. Each instance may succeed or fail individually. @inlinable public func readAtomically( - _ managedIds: some Sequence, + _ managedIds: some Sequence & Sendable, as _: Model.Type ) async -> Result<[Model], CoreDataError> { let context = Transaction.current?.context ?? context @@ -154,7 +154,7 @@ extension CoreDataRepository { /// This operation is non-atomic. Each instance may succeed or fail individually. @inlinable public func readAtomically( - _ managedIdUrls: some Sequence, + _ managedIdUrls: some Sequence & Sendable, as _: Model.Type ) async -> Result<[Model], CoreDataError> { let context = Transaction.current?.context ?? context diff --git a/Sources/CoreDataRepository/Internal/AggregateSubscription.swift b/Sources/CoreDataRepository/Internal/AggregateSubscription.swift index c70e275..02aa2ee 100644 --- a/Sources/CoreDataRepository/Internal/AggregateSubscription.swift +++ b/Sources/CoreDataRepository/Internal/AggregateSubscription.swift @@ -4,7 +4,7 @@ // This source code is licensed under the MIT License (MIT) found in the // LICENSE file in the root directory of this source tree. -import CoreData +@preconcurrency import CoreData import Foundation /// Subscription provider that sends updates when an aggregate fetch request changes diff --git a/Sources/CoreDataRepository/Internal/AggregateThrowingSubscription.swift b/Sources/CoreDataRepository/Internal/AggregateThrowingSubscription.swift index b273f35..d8deb4e 100644 --- a/Sources/CoreDataRepository/Internal/AggregateThrowingSubscription.swift +++ b/Sources/CoreDataRepository/Internal/AggregateThrowingSubscription.swift @@ -4,7 +4,7 @@ // This source code is licensed under the MIT License (MIT) found in the // LICENSE file in the root directory of this source tree. -import CoreData +@preconcurrency import CoreData import Foundation /// Subscription provider that sends updates when an aggregate fetch request changes diff --git a/Sources/CoreDataRepository/Internal/CountSubscription.swift b/Sources/CoreDataRepository/Internal/CountSubscription.swift index b7ca1e8..8cb67ef 100644 --- a/Sources/CoreDataRepository/Internal/CountSubscription.swift +++ b/Sources/CoreDataRepository/Internal/CountSubscription.swift @@ -4,7 +4,7 @@ // This source code is licensed under the MIT License (MIT) found in the // LICENSE file in the root directory of this source tree. -import CoreData +@preconcurrency import CoreData import Foundation /// Subscription provider that sends updates when a count fetch request changes diff --git a/Sources/CoreDataRepository/Internal/CountThrowingSubscription.swift b/Sources/CoreDataRepository/Internal/CountThrowingSubscription.swift index 89fcbb2..f466eff 100644 --- a/Sources/CoreDataRepository/Internal/CountThrowingSubscription.swift +++ b/Sources/CoreDataRepository/Internal/CountThrowingSubscription.swift @@ -4,7 +4,7 @@ // This source code is licensed under the MIT License (MIT) found in the // LICENSE file in the root directory of this source tree. -import CoreData +@preconcurrency import CoreData import Foundation /// Subscription provider that sends updates when a count fetch request changes diff --git a/Sources/CoreDataRepository/Internal/FetchSubscription.swift b/Sources/CoreDataRepository/Internal/FetchSubscription.swift index 127f8c7..5378b78 100644 --- a/Sources/CoreDataRepository/Internal/FetchSubscription.swift +++ b/Sources/CoreDataRepository/Internal/FetchSubscription.swift @@ -4,7 +4,7 @@ // This source code is licensed under the MIT License (MIT) found in the // LICENSE file in the root directory of this source tree. -import CoreData +@preconcurrency import CoreData import Foundation /// Subscription provider that sends updates when a fetch request changes diff --git a/Sources/CoreDataRepository/Internal/FetchThrowingSubscription.swift b/Sources/CoreDataRepository/Internal/FetchThrowingSubscription.swift index 8fbea57..9862369 100644 --- a/Sources/CoreDataRepository/Internal/FetchThrowingSubscription.swift +++ b/Sources/CoreDataRepository/Internal/FetchThrowingSubscription.swift @@ -4,7 +4,7 @@ // This source code is licensed under the MIT License (MIT) found in the // LICENSE file in the root directory of this source tree. -import CoreData +@preconcurrency import CoreData import Foundation /// Subscription provider that sends updates when a fetch request changes diff --git a/Tests/CoreDataRepositoryTests/AggregateTests.swift b/Tests/CoreDataRepositoryTests/AggregateTests.swift index 4ff6c0a..5532f24 100644 --- a/Tests/CoreDataRepositoryTests/AggregateTests.swift +++ b/Tests/CoreDataRepositoryTests/AggregateTests.swift @@ -12,12 +12,12 @@ import Testing extension CoreDataRepositoryTests { @Suite - struct AggregateTests: CoreDataTestSuite, @unchecked Sendable { + struct AggregateTests: CoreDataTestSuite, Sendable { let container: NSPersistentContainer let repositoryContext: NSManagedObjectContext let repository: CoreDataRepository - let fetchRequest: NSFetchRequest = { + nonisolated(unsafe) let fetchRequest: NSFetchRequest = { let request = UnmanagedModel_UuidId.managedFetchRequest() request.sortDescriptors = [NSSortDescriptor(keyPath: \ManagedModel_UuidId.int, ascending: true)] return request @@ -34,7 +34,11 @@ extension CoreDataRepositoryTests { var objectIds = [NSManagedObjectID]() mutating func extraSetup() async throws { - let (_expectedValues, _objectIds) = try repositoryContext.performAndWait { + let (_expectedValues, _objectIds) = try repositoryContext.performAndWait { [ + self, + repositoryContext, + values + ] in let managedMovies = try values .map { try ManagedIdUrlModel_UuidId(fetchable: $0) diff --git a/Tests/CoreDataRepositoryTests/BatchRequestTests.swift b/Tests/CoreDataRepositoryTests/BatchRequestTests.swift index e5e7c6c..7da17ea 100644 --- a/Tests/CoreDataRepositoryTests/BatchRequestTests.swift +++ b/Tests/CoreDataRepositoryTests/BatchRequestTests.swift @@ -12,26 +12,26 @@ import Testing extension CoreDataRepositoryTests { @Suite - struct BatchRequestTests: CoreDataTestSuite { + struct BatchRequestTests: CoreDataTestSuite, Sendable { let container: NSPersistentContainer let repositoryContext: NSManagedObjectContext let repository: CoreDataRepository - let values: [[String: Any]] = [ + nonisolated(unsafe) let values: [[String: Any]] = [ ManagedIdUrlModel_UuidId.seeded(1).asDict, ManagedIdUrlModel_UuidId.seeded(2).asDict, ManagedIdUrlModel_UuidId.seeded(3).asDict, ManagedIdUrlModel_UuidId.seeded(4).asDict, ManagedIdUrlModel_UuidId.seeded(5).asDict, ] - let failureInsertMovies: [[String: Any]] = [ + nonisolated(unsafe) let failureInsertMovies: [[String: Any]] = [ ["id": "A", "title": 1, "releaseDate": "A"], ["id": "B", "title": 2, "releaseDate": "B"], ["id": "C", "title": 3, "releaseDate": "C"], ["id": "D", "title": 4, "releaseDate": "D"], ["id": "E", "title": 5, "releaseDate": "E"], ] - let failureCreateMovies: [[String: Any]] = [ + nonisolated(unsafe) let failureCreateMovies: [[String: Any]] = [ ["id": UUID(uniform: "A"), "title": "A", "releaseDate": Date()], ["id": UUID(uniform: "A"), "title": "B", "releaseDate": Date()], ["id": UUID(uniform: "A"), "title": "C", "releaseDate": Date()], @@ -70,9 +70,8 @@ extension CoreDataRepositoryTests { @Test(arguments: [false, true]) func insertSuccess(inTransaction: Bool) async throws { - let fetchRequest = ManagedIdUrlModel_UuidId.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: ManagedIdUrlModel_UuidId.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -101,7 +100,7 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(ManagedIdUrlModel_UuidId.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -121,9 +120,8 @@ extension CoreDataRepositoryTests { @Test(arguments: [false, true]) func insertFailure(inTransaction: Bool) async throws { - let fetchRequest = ManagedIdUrlModel_UuidId.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: ManagedIdUrlModel_UuidId.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -147,16 +145,15 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(ManagedIdUrlModel_UuidId.managedFetchRequest()) expectNoDifference(data.map(\.string).sorted(), [], "There should be no inserted values.") } } @Test(arguments: [false, true]) func updateSuccess(inTransaction: Bool) async throws { - let fetchRequest = ManagedIdUrlModel_UuidId.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: ManagedIdUrlModel_UuidId.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") _ = try values @@ -183,7 +180,7 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(ManagedIdUrlModel_UuidId.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["Updated!", "Updated!", "Updated!", "Updated!", "Updated!"], @@ -202,9 +199,8 @@ extension CoreDataRepositoryTests { @Test(arguments: [false, true]) func deleteSuccess(inTransaction: Bool) async throws { - let fetchRequest = ManagedIdUrlModel_UuidId.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: ManagedIdUrlModel_UuidId.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") _ = try values @@ -232,7 +228,7 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(ManagedIdUrlModel_UuidId.managedFetchRequest()) expectNoDifference(data.map(\.string).sorted(), [], "There should be no remaining values.") } // Transaction author refuses to be applied when going through a transaction. Need to investigate further. diff --git a/Tests/CoreDataRepositoryTests/CoreDataTestSuite.swift b/Tests/CoreDataRepositoryTests/CoreDataTestSuite.swift index 58795ad..f0e32fe 100644 --- a/Tests/CoreDataRepositoryTests/CoreDataTestSuite.swift +++ b/Tests/CoreDataRepositoryTests/CoreDataTestSuite.swift @@ -45,14 +45,8 @@ extension CoreDataTestSuite { // empty by default } - func mapInContext(_ input: I, transform: (I) throws -> O) throws -> O { - try repositoryContext.performAndWait { - try transform(input) - } - } - func verify(_ item: T) async throws where T: FetchableUnmanagedModel, T: Equatable { - repositoryContext.performAndWait { + repositoryContext.performAndWait { [repositoryContext] in var managed: T.ManagedModel? do { managed = try repositoryContext.fetch(T.managedFetchRequest()).first { try T(managed: $0) == item } @@ -71,7 +65,7 @@ extension CoreDataTestSuite { } func verify(_ item: T) async throws where T: ReadableUnmanagedModel, T: Equatable { - try repositoryContext.performAndWait { + try repositoryContext.performAndWait { [repositoryContext] in var _managed: T.ManagedModel? do { _managed = try item.readManaged(from: repositoryContext) @@ -91,8 +85,8 @@ extension CoreDataTestSuite { } func verify(transactionAuthor: String?, timeStamp: Date) throws { - let historyRequest = NSPersistentHistoryChangeRequest.fetchHistory(after: timeStamp) - try repositoryContext.performAndWait { + try repositoryContext.performAndWait { [repositoryContext] in + let historyRequest = NSPersistentHistoryChangeRequest.fetchHistory(after: timeStamp) let historyResult = try #require(repositoryContext.execute(historyRequest) as? NSPersistentHistoryResult) let history = try #require(historyResult.result as? [NSPersistentHistoryTransaction]) #expect(history.count > 0) @@ -103,7 +97,7 @@ extension CoreDataTestSuite { } func verifyDoesNotExist(_ item: T) async throws where T: FetchableUnmanagedModel, T: Equatable { - repositoryContext.performAndWait { + repositoryContext.performAndWait { [repositoryContext] in var _managed: T.ManagedModel? do { _managed = try repositoryContext.fetch(T.managedFetchRequest()).first { try T(managed: $0) == item } @@ -118,7 +112,7 @@ extension CoreDataTestSuite { } func verifyDoesNotExist(_ item: T) async throws where T: ReadableUnmanagedModel, T: Equatable { - repositoryContext.performAndWait { + repositoryContext.performAndWait { [repositoryContext] in var _managed: T.ManagedModel? do { _managed = try item.readManaged(from: repositoryContext) @@ -133,8 +127,8 @@ extension CoreDataTestSuite { } func verifyDoesNotExist(transactionAuthor: String?, timeStamp: Date) throws { - let historyRequest = NSPersistentHistoryChangeRequest.fetchHistory(after: timeStamp) - try repositoryContext.performAndWait { + try repositoryContext.performAndWait { [repositoryContext] in + let historyRequest = NSPersistentHistoryChangeRequest.fetchHistory(after: timeStamp) let historyResult = try #require(repositoryContext.execute(historyRequest) as? NSPersistentHistoryResult) let history = try #require(historyResult.result as? [NSPersistentHistoryTransaction]) if transactionAuthor == nil { @@ -148,7 +142,7 @@ extension CoreDataTestSuite { } func delete(managedId: NSManagedObjectID) throws { - try repositoryContext.performAndWait { + try repositoryContext.performAndWait { [repositoryContext] in let managed = repositoryContext.object(with: managedId) repositoryContext.delete(managed) try repositoryContext.save() diff --git a/Tests/CoreDataRepositoryTests/Create_BatchTests.swift b/Tests/CoreDataRepositoryTests/Create_BatchTests.swift index 83947ed..cbf1b13 100644 --- a/Tests/CoreDataRepositoryTests/Create_BatchTests.swift +++ b/Tests/CoreDataRepositoryTests/Create_BatchTests.swift @@ -21,9 +21,8 @@ extension CoreDataRepositoryTests { func create_Fetchable_Success(inTransaction: Bool) async throws { let modelType = FetchableModel_UuidId.self - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -56,7 +55,7 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -79,9 +78,8 @@ extension CoreDataRepositoryTests { modelType.seeded(5), ] - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") _ = try _values[0].asManagedModel(in: repositoryContext) @@ -123,7 +121,7 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -139,9 +137,8 @@ extension CoreDataRepositoryTests { func create_Identifiable_Success(inTransaction: Bool) async throws { let modelType = IdentifiableModel_UuidId.self - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -174,7 +171,7 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -197,9 +194,8 @@ extension CoreDataRepositoryTests { modelType.seeded(5), ] - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") _ = try _values[0].asManagedModel(in: repositoryContext) @@ -241,7 +237,7 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -257,9 +253,8 @@ extension CoreDataRepositoryTests { func create_ManagedIdUrlReferencable_Success(inTransaction: Bool) async throws { let modelType = ManagedIdUrlModel_UuidId.self - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -294,7 +289,7 @@ extension CoreDataRepositoryTests { expectNoDifference(successful.map { $0.removingManagedIdUrl() }.sorted(), _values) try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -317,9 +312,8 @@ extension CoreDataRepositoryTests { modelType.seeded(5), ] - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") _ = try _values[0].asManagedModel(in: repositoryContext) @@ -361,7 +355,7 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -377,9 +371,8 @@ extension CoreDataRepositoryTests { func create_ManagedIdReferencable_Success(inTransaction: Bool) async throws { let modelType = ManagedIdModel_UuidId.self - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -414,7 +407,7 @@ extension CoreDataRepositoryTests { expectNoDifference(successful.map { $0.removingManagedId() }.sorted(), _values) try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -437,9 +430,8 @@ extension CoreDataRepositoryTests { modelType.seeded(5), ] - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") _ = try _values[0].asManagedModel(in: repositoryContext) @@ -481,7 +473,7 @@ extension CoreDataRepositoryTests { } try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -497,9 +489,8 @@ extension CoreDataRepositoryTests { func createAtomically_Fetchable_Success(inTransaction: Bool) async throws { let modelType = FetchableModel_UuidId.self - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -533,7 +524,7 @@ extension CoreDataRepositoryTests { expectNoDifference(createdValues, _values) try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -556,9 +547,8 @@ extension CoreDataRepositoryTests { modelType.seeded(5), ] - let fetchRequest = modelType.managedFetchRequest() let existingValue = try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") let value = try _values[0].asManagedModel(in: repositoryContext) @@ -566,7 +556,8 @@ extension CoreDataRepositoryTests { try repositoryContext.parent?.save() return value } - try await verify(mapInContext(existingValue, transform: modelType.init(managed:))) + let unmanaged = try modelType.init(managed: existingValue) + try await verify(unmanaged) if inTransaction { try await withKnownIssue { @@ -610,9 +601,8 @@ extension CoreDataRepositoryTests { func createAtomically_Identifiable_Success(inTransaction: Bool) async throws { let modelType = IdentifiableModel_UuidId.self - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -646,7 +636,7 @@ extension CoreDataRepositoryTests { expectNoDifference(createdValues, _values) try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -669,9 +659,8 @@ extension CoreDataRepositoryTests { modelType.seeded(5), ] - let fetchRequest = modelType.managedFetchRequest() let existingValue = try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") let value = try _values[0].asManagedModel(in: repositoryContext) @@ -679,7 +668,8 @@ extension CoreDataRepositoryTests { try repositoryContext.parent?.save() return value } - try await verify(mapInContext(existingValue, transform: modelType.init(managed:))) + let unmanaged = try modelType.init(managed: existingValue) + try await verify(unmanaged) if inTransaction { try await withKnownIssue { @@ -723,9 +713,8 @@ extension CoreDataRepositoryTests { func createAtomically_ManagedIdUrlReferencable_Success(inTransaction: Bool) async throws { let modelType = ManagedIdUrlModel_UuidId.self - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -759,7 +748,7 @@ extension CoreDataRepositoryTests { expectNoDifference(createdValues.map { $0.removingManagedIdUrl() }, _values) try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -782,9 +771,8 @@ extension CoreDataRepositoryTests { modelType.seeded(5), ] - let fetchRequest = modelType.managedFetchRequest() let existingValue = try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") let value = try _values[0].asManagedModel(in: repositoryContext) @@ -792,7 +780,8 @@ extension CoreDataRepositoryTests { try repositoryContext.parent?.save() return value } - try await verify(mapInContext(existingValue, transform: modelType.init(managed:))) + let unmanaged = try modelType.init(managed: existingValue) + try await verify(unmanaged) if inTransaction { try await withKnownIssue { @@ -836,9 +825,8 @@ extension CoreDataRepositoryTests { func createAtomically_ManagedIdReferencable_Success(inTransaction: Bool) async throws { let modelType = ManagedIdModel_UuidId.self - let fetchRequest = modelType.managedFetchRequest() try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") } @@ -872,7 +860,7 @@ extension CoreDataRepositoryTests { expectNoDifference(createdValues.map { $0.removingManagedId() }, _values) try await repositoryContext.perform { - let data = try repositoryContext.fetch(fetchRequest) + let data = try repositoryContext.fetch(modelType.managedFetchRequest()) expectNoDifference( data.map(\.string).sorted(), ["1", "2", "3", "4", "5"], @@ -895,9 +883,8 @@ extension CoreDataRepositoryTests { modelType.seeded(5), ] - let fetchRequest = modelType.managedFetchRequest() let existingValue = try await repositoryContext.perform { - let count = try repositoryContext.count(for: fetchRequest) + let count = try repositoryContext.count(for: modelType.managedFetchRequest()) expectNoDifference(count, 0, "Count of objects in CoreData should be zero at the start of each test.") let value = try _values[0].asManagedModel(in: repositoryContext) @@ -905,7 +892,8 @@ extension CoreDataRepositoryTests { try repositoryContext.parent?.save() return value } - try await verify(mapInContext(existingValue, transform: modelType.init(managed:))) + let unmanaged = try modelType.init(managed: existingValue) + try await verify(unmanaged) if inTransaction { try await withKnownIssue { diff --git a/Tests/CoreDataRepositoryTests/FetchTests.swift b/Tests/CoreDataRepositoryTests/FetchTests.swift index 4ea8e51..fa3c083 100644 --- a/Tests/CoreDataRepositoryTests/FetchTests.swift +++ b/Tests/CoreDataRepositoryTests/FetchTests.swift @@ -17,11 +17,11 @@ extension CoreDataRepositoryTests { let repositoryContext: NSManagedObjectContext let repository: CoreDataRepository - let fetchRequest: NSFetchRequest = { + static func fetchRequest() -> NSFetchRequest { let request = FetchableModel_UuidId.managedFetchRequest() request.sortDescriptors = [NSSortDescriptor(keyPath: \ManagedModel_UuidId.int, ascending: true)] return request - }() + } let values = [ FetchableModel_UuidId.seeded(1), @@ -34,15 +34,15 @@ extension CoreDataRepositoryTests { var objectIds = [NSManagedObjectID]() mutating func extraSetup() async throws { - let (_expectedValues, _objectIds) = try repositoryContext.performAndWait { + let (_expectedValues, _objectIds) = try repositoryContext.performAndWait { [repositoryContext, values] in let managedMovies = try values - .map { + .map { [repositoryContext] in try ManagedIdUrlModel_UuidId(fetchable: $0) .asManagedModel(in: repositoryContext) } try repositoryContext.save() return try ( - repositoryContext.fetch(fetchRequest).map(FetchableModel_UuidId.init(managed:)), + repositoryContext.fetch(Self.fetchRequest()).map(FetchableModel_UuidId.init(managed:)), managedMovies.map(\.objectID) ) } @@ -54,10 +54,10 @@ extension CoreDataRepositoryTests { func fetchSuccess(inTransaction: Bool) async throws { let result = if inTransaction { try await repository.withTransaction { _ in - await repository.fetch(fetchRequest, as: FetchableModel_UuidId.self) + await repository.fetch(Self.fetchRequest(), as: FetchableModel_UuidId.self) } } else { - await repository.fetch(fetchRequest, as: FetchableModel_UuidId.self) + await repository.fetch(Self.fetchRequest(), as: FetchableModel_UuidId.self) } switch result { @@ -76,11 +76,11 @@ extension CoreDataRepositoryTests { let stream = if inTransaction { try await repository.withTransaction { _ in repository - .fetchSubscription(fetchRequest, of: FetchableModel_UuidId.self) + .fetchSubscription(Self.fetchRequest(), of: FetchableModel_UuidId.self) } } else { repository - .fetchSubscription(fetchRequest, of: FetchableModel_UuidId.self) + .fetchSubscription(Self.fetchRequest(), of: FetchableModel_UuidId.self) } for await _items in stream { let items = try _items.get() @@ -117,13 +117,13 @@ extension CoreDataRepositoryTests { let stream = if inTransaction { try await repository.withTransaction { _ in repository.fetchThrowingSubscription( - fetchRequest, + Self.fetchRequest(), of: FetchableModel_UuidId.self ) } } else { repository.fetchThrowingSubscription( - fetchRequest, + Self.fetchRequest(), of: FetchableModel_UuidId.self ) } diff --git a/Tests/CoreDataRepositoryTests/ReadTests.swift b/Tests/CoreDataRepositoryTests/ReadTests.swift index d8c8785..c7cd656 100644 --- a/Tests/CoreDataRepositoryTests/ReadTests.swift +++ b/Tests/CoreDataRepositoryTests/ReadTests.swift @@ -125,12 +125,13 @@ extension CoreDataRepositoryTests { func readSubscription_Identifiable_Success(inTransaction: Bool) async throws { let modelType = IdentifiableModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue, _value) try await verify(existingValue) @@ -150,7 +151,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -167,12 +170,13 @@ extension CoreDataRepositoryTests { func readThrowingSubscription_Identifiable_Success(inTransaction: Bool) async throws { let modelType = IdentifiableModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue, _value) try await verify(existingValue) @@ -192,7 +196,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -209,12 +215,13 @@ extension CoreDataRepositoryTests { func readSubscription_Identifiable_ById_Success(inTransaction: Bool) async throws { let modelType = IdentifiableModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue, _value) try await verify(existingValue) @@ -234,7 +241,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -251,12 +260,13 @@ extension CoreDataRepositoryTests { func readThrowingSubscription_Identifiable_ById_Success(inTransaction: Bool) async throws { let modelType = IdentifiableModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue, _value) try await verify(existingValue) @@ -276,7 +286,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -359,12 +371,13 @@ extension CoreDataRepositoryTests { func readSubscription_ManagedId_Success(inTransaction: Bool) async throws { let modelType = ManagedIdModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue.removingManagedId(), _value) try await verify(existingValue) @@ -384,7 +397,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -401,12 +416,13 @@ extension CoreDataRepositoryTests { func readThrowingSubscription_ManagedId_Success(inTransaction: Bool) async throws { let modelType = ManagedIdModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue.removingManagedId(), _value) try await verify(existingValue) @@ -426,7 +442,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -534,12 +552,13 @@ extension CoreDataRepositoryTests { func readSubscription_ManagedIdReferencable_Success(inTransaction: Bool) async throws { let modelType = ManagedIdModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue.removingManagedId(), _value) try await verify(existingValue) @@ -559,7 +578,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -576,12 +597,13 @@ extension CoreDataRepositoryTests { func readThrowingSubscription_ManagedIdReferencable_Success(inTransaction: Bool) async throws { let modelType = ManagedIdModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue.removingManagedId(), _value) try await verify(existingValue) @@ -602,7 +624,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -685,12 +709,13 @@ extension CoreDataRepositoryTests { func readSubscription_ManagedIdUrl_Success(inTransaction: Bool) async throws { let modelType = ManagedIdUrlModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue.removingManagedIdUrl(), _value) try await verify(existingValue) @@ -711,7 +736,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -728,12 +755,13 @@ extension CoreDataRepositoryTests { func readThrowingSubscription_ManagedIdUrl_Success(inTransaction: Bool) async throws { let modelType = ManagedIdUrlModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue.removingManagedIdUrl(), _value) try await verify(existingValue) @@ -754,7 +782,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -862,12 +892,13 @@ extension CoreDataRepositoryTests { func readSubscription_ManagedIdUrlReferencable_Success(inTransaction: Bool) async throws { let modelType = ManagedIdUrlModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue.removingManagedIdUrl(), _value) try await verify(existingValue) @@ -888,7 +919,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -905,12 +938,13 @@ extension CoreDataRepositoryTests { func readThrowingSubscription_ManagedIdUrlReferencable_Success(inTransaction: Bool) async throws { let modelType = ManagedIdUrlModel_UuidId.self let _value = modelType.seeded(1) - var (existingValue, managed) = try await repositoryContext.perform(schedule: .immediate) { + var (existingValue, _managedId) = try await repositoryContext.perform(schedule: .immediate) { let managed = try _value.asManagedModel(in: repositoryContext) try repositoryContext.save() try repositoryContext.parent?.save() - return try (modelType.init(managed: managed), managed) + return try (modelType.init(managed: managed), managed.objectID) } + let managedId = _managedId expectNoDifference(existingValue.removingManagedIdUrl(), _value) try await verify(existingValue) @@ -931,7 +965,9 @@ extension CoreDataRepositoryTests { expectNoDifference(latestValue, existingValue) - existingValue = try await repositoryContext.perform(schedule: .immediate) { + existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in + let managed = try #require(repositoryContext + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() From e74a8e4ccdf8c871a7960a745600a0c5d88dc804 Mon Sep 17 00:00:00 2001 From: Andrew Roan Date: Tue, 14 Oct 2025 13:00:54 -0500 Subject: [PATCH 2/3] Run swiftformat bugfix/build-errors-with-swift-6-2 --- Tests/CoreDataRepositoryTests/ReadTests.swift | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/Tests/CoreDataRepositoryTests/ReadTests.swift b/Tests/CoreDataRepositoryTests/ReadTests.swift index c7cd656..4055677 100644 --- a/Tests/CoreDataRepositoryTests/ReadTests.swift +++ b/Tests/CoreDataRepositoryTests/ReadTests.swift @@ -153,7 +153,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -198,7 +199,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -243,7 +245,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -288,7 +291,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -399,7 +403,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -444,7 +449,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -580,7 +586,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -626,7 +633,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -738,7 +746,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -784,7 +793,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -921,7 +931,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() @@ -967,7 +978,8 @@ extension CoreDataRepositoryTests { existingValue = try await repositoryContext.perform(schedule: .immediate) { [repositoryContext] in let managed = try #require(repositoryContext - .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel) + .existingObject(with: managedId) as? ManagedIdUrlModel_UuidId.ManagedModel + ) managed.int += 1 try repositoryContext.save() try repositoryContext.parent?.save() From 7259c073e3d3a6ac34c7b71e67de0d044e639be5 Mon Sep 17 00:00:00 2001 From: Andrew Roan Date: Thu, 6 Nov 2025 22:37:49 -0600 Subject: [PATCH 3/3] Bump workflow macos version --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc1965c..bf4961e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: - name: Lint run: swiftlint lint --quiet test: - runs-on: macos-15 + runs-on: macos-26 environment: default steps: - uses: actions/checkout@v4