Skip to content

Commit 2c0def0

Browse files
committed
Fix CoreData concurrency violations in tests
feature/sendable
1 parent 1a36b00 commit 2c0def0

2 files changed

Lines changed: 18 additions & 4 deletions

File tree

Tests/CoreDataRepositoryTests/CoreDataXCTestCase.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ import CustomDump
1010
import Internal
1111
import XCTest
1212

13+
extension FetchableUnmanagedModel {
14+
static func initFromManaged(_ managed: ManagedModel) throws -> Self {
15+
try managed.managedObjectContext!.performAndWait {
16+
try Self.init(managed: managed)
17+
}
18+
}
19+
}
20+
1321
class CoreDataXCTestCase: XCTestCase {
1422
var _container: NSPersistentContainer?
1523
var _repositoryContext: NSManagedObjectContext?
@@ -55,6 +63,12 @@ class CoreDataXCTestCase: XCTestCase {
5563
_repositoryContext = nil
5664
_repository = nil
5765
}
66+
67+
func mapInContext<I, O>(_ input: I, transform: (I) throws -> O) throws -> O {
68+
try repositoryContext().performAndWait {
69+
try transform(input)
70+
}
71+
}
5872

5973
func verify<T>(_ item: T) async throws where T: FetchableUnmanagedModel, T: Equatable {
6074
let context = try repositoryContext()

Tests/CoreDataRepositoryTests/Create_BatchTests.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ final class Create_BatchTests: CoreDataXCTestCase {
431431
try self.repositoryContext().parent?.save()
432432
return value
433433
}
434-
try await verify(modelType.init(managed: existingValue))
434+
try await verify(mapInContext(existingValue, transform: modelType.init(managed:)))
435435

436436
let result = try await repository()
437437
.createAtomically(_values)
@@ -514,7 +514,7 @@ final class Create_BatchTests: CoreDataXCTestCase {
514514
try self.repositoryContext().parent?.save()
515515
return value
516516
}
517-
try await verify(modelType.init(managed: existingValue))
517+
try await verify(mapInContext(existingValue, transform: modelType.init(managed:)))
518518

519519
let result = try await repository()
520520
.createAtomically(_values)
@@ -597,7 +597,7 @@ final class Create_BatchTests: CoreDataXCTestCase {
597597
try self.repositoryContext().parent?.save()
598598
return value
599599
}
600-
try await verify(modelType.init(managed: existingValue))
600+
try await verify(mapInContext(existingValue, transform: modelType.init(managed:)))
601601

602602
let result = try await repository()
603603
.createAtomically(_values)
@@ -680,7 +680,7 @@ final class Create_BatchTests: CoreDataXCTestCase {
680680
try self.repositoryContext().parent?.save()
681681
return value
682682
}
683-
try await verify(modelType.init(managed: existingValue))
683+
try await verify(mapInContext(existingValue, transform: modelType.init(managed:)))
684684

685685
let result = try await repository()
686686
.createAtomically(_values)

0 commit comments

Comments
 (0)