Skip to content

Commit 01ab1a8

Browse files
committed
Migrate tests to swift-testing
feature/swift-testing
1 parent 4c001f3 commit 01ab1a8

14 files changed

Lines changed: 4603 additions & 4243 deletions

Tests/CoreDataRepositoryTests/AggregateTests.swift

Lines changed: 564 additions & 507 deletions
Large diffs are not rendered by default.

Tests/CoreDataRepositoryTests/BatchRequestTests.swift

Lines changed: 182 additions & 161 deletions
Large diffs are not rendered by default.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// CoreDataRepositoryTests.swift
2+
// CoreDataRepository
3+
//
4+
// This source code is licensed under the MIT License (MIT) found in the
5+
// LICENSE file in the root directory of this source tree.
6+
7+
import Testing
8+
9+
@Suite(.serialized)
10+
struct CoreDataRepositoryTests {}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
// CoreDataTestSuite.swift
2+
// CoreDataRepository
3+
//
4+
// This source code is licensed under the MIT License (MIT) found in the
5+
// LICENSE file in the root directory of this source tree.
6+
7+
import CoreData
8+
import CoreDataRepository
9+
import CustomDump
10+
import Internal
11+
import Testing
12+
13+
protocol CoreDataTestSuite {
14+
var container: NSPersistentContainer { get }
15+
var repositoryContext: NSManagedObjectContext { get }
16+
var repository: CoreDataRepository { get }
17+
18+
mutating func extraSetup() async throws
19+
20+
init() async throws
21+
init(container: NSPersistentContainer, repositoryContext: NSManagedObjectContext, repository: CoreDataRepository)
22+
}
23+
24+
extension CoreDataTestSuite {
25+
init() async throws {
26+
let stack = CoreDataStack(
27+
storeName: "coredata_repository_tests",
28+
type: .sqliteEphemeral,
29+
container: CoreDataStack.persistentContainer(
30+
storeName: "coredata_repository_tests",
31+
type: .sqliteEphemeral,
32+
model: .model_UuidId
33+
)
34+
)
35+
let _container = stack.container
36+
let _repositoryContext = _container.newBackgroundContext()
37+
_repositoryContext.automaticallyMergesChangesFromParent = true
38+
let _repository = CoreDataRepository(context: _repositoryContext)
39+
self.init(container: _container, repositoryContext: _repositoryContext, repository: _repository)
40+
41+
try await extraSetup()
42+
}
43+
44+
mutating func extraSetup() async throws {
45+
// empty by default
46+
}
47+
48+
func mapInContext<I, O>(_ input: I, transform: (I) throws -> O) throws -> O {
49+
try repositoryContext.performAndWait {
50+
try transform(input)
51+
}
52+
}
53+
54+
func verify<T>(_ item: T) async throws where T: FetchableUnmanagedModel, T: Equatable {
55+
repositoryContext.performAndWait {
56+
var managed: T.ManagedModel?
57+
do {
58+
managed = try repositoryContext.fetch(T.managedFetchRequest()).first { try T(managed: $0) == item }
59+
} catch {
60+
Issue.record(
61+
"Failed to verify item in store because fetching failed. Error: \(error.localizedDescription)"
62+
)
63+
return
64+
}
65+
66+
guard managed != nil else {
67+
Issue.record("Failed to verify item in store because it was not found.")
68+
return
69+
}
70+
}
71+
}
72+
73+
func verify<T>(_ item: T) async throws where T: ReadableUnmanagedModel, T: Equatable {
74+
try repositoryContext.performAndWait {
75+
var _managed: T.ManagedModel?
76+
do {
77+
_managed = try item.readManaged(from: repositoryContext)
78+
} catch {
79+
Issue.record(
80+
"Failed to verify item in store because reading it failed. Error: \(error.localizedDescription)"
81+
)
82+
return
83+
}
84+
85+
guard let managed = _managed else {
86+
Issue.record("Failed to verify item in store because it was not found.")
87+
return
88+
}
89+
try expectNoDifference(item, T(managed: managed))
90+
}
91+
}
92+
93+
func verify(transactionAuthor: String?, timeStamp: Date) throws {
94+
let historyRequest = NSPersistentHistoryChangeRequest.fetchHistory(after: timeStamp)
95+
try repositoryContext.performAndWait {
96+
let historyResult = try #require(repositoryContext.execute(historyRequest) as? NSPersistentHistoryResult)
97+
let history = try #require(historyResult.result as? [NSPersistentHistoryTransaction])
98+
#expect(history.count > 0)
99+
for historyTransaction in history {
100+
#expect(historyTransaction.author == transactionAuthor)
101+
}
102+
}
103+
}
104+
105+
func verifyDoesNotExist<T>(_ item: T) async throws where T: FetchableUnmanagedModel, T: Equatable {
106+
repositoryContext.performAndWait {
107+
var _managed: T.ManagedModel?
108+
do {
109+
_managed = try repositoryContext.fetch(T.managedFetchRequest()).first { try T(managed: $0) == item }
110+
} catch {
111+
return
112+
}
113+
114+
if let _managed, !_managed.isDeleted {
115+
Issue.record("Item does exist and is not deleted which is not expected")
116+
}
117+
}
118+
}
119+
120+
func verifyDoesNotExist<T>(_ item: T) async throws where T: ReadableUnmanagedModel, T: Equatable {
121+
repositoryContext.performAndWait {
122+
var _managed: T.ManagedModel?
123+
do {
124+
_managed = try item.readManaged(from: repositoryContext)
125+
} catch {
126+
return
127+
}
128+
129+
if let _managed, !_managed.isDeleted {
130+
Issue.record("Item does exist and is not deleted which is not expected")
131+
}
132+
}
133+
}
134+
135+
func delete(managedId: NSManagedObjectID) throws {
136+
try repositoryContext.performAndWait {
137+
let managed = repositoryContext.object(with: managedId)
138+
repositoryContext.delete(managed)
139+
try repositoryContext.save()
140+
}
141+
}
142+
}

Tests/CoreDataRepositoryTests/CoreDataXCTestCase.swift

Lines changed: 0 additions & 157 deletions
This file was deleted.

0 commit comments

Comments
 (0)