Skip to content

Commit 745f318

Browse files
committed
Updated unit tests
1 parent 93a0734 commit 745f318

2 files changed

Lines changed: 69 additions & 62 deletions

File tree

Tests/CoreModelTests/CoreDataTests.swift

Lines changed: 13 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -18,84 +18,35 @@ final class CoreDataTests: XCTestCase {
1818

1919
func testCoreData() async throws {
2020

21-
let model = Model(entities: [
22-
EntityDescription(entity: Person.self),
23-
EntityDescription(entity: Event.self)
24-
])
21+
let model = Model(entities: Person.self, Event.self)
2522

2623
let store = NSPersistentContainer(
2724
name: "Test\(UUID())",
2825
managedObjectModel: NSManagedObjectModel(model: model)
2926
)
3027

28+
for try await store in store.loadPersistentStores() {
29+
print("Loaded store", store.type, store.url?.absoluteString ?? "")
30+
}
31+
3132
var person1 = Person(
3233
name: "John Appleseed",
3334
age: 22
3435
)
3536

36-
//store.insert(person1)
37+
try await store.insert(person1)
3738

3839
var event1 = Event(
3940
name: "WWDC",
40-
date: Date(timeIntervalSinceNow: 60 * 60 * 24 * 10)
41+
date: Date(timeIntervalSinceNow: 60 * 60 * 24 * 10),
42+
people: [person1.id]
4143
)
4244

43-
//store.insert(event1)
44-
45-
/*
46-
do {
47-
let event1 = ModelInstance(
48-
entity: "Event",
49-
id: "1",
50-
attributes: [:],
51-
relationships: [:]
52-
)
53-
store.insert()
54-
let event = try store("Event")
55-
event.setAttribute(.string("Event 1"), for: "name")
56-
event.setAttribute(.date(Date()), for: "date")
57-
58-
let person1 = try store.create("Person")
59-
person1.setAttribute(.string("Person1"), for: "name")
60-
61-
let person2 = try store.create("Person")
62-
person2.setAttribute(.string("Person2"), for: "name")
63-
64-
person1.setRelationship(.toMany([event]), for: "events")
65-
XCTAssertEqual(event.relationship(for: "people"), .toMany([person1]))
66-
XCTAssertEqual(person1.relationship(for: "events"), .toMany([event]))
67-
XCTAssertEqual(person2.relationship(for: "events"), .null)
68-
XCTAssertNotEqual(person2.relationship(for: "events"), .toMany([]))
69-
70-
event.setRelationship(.toMany([person1, person2]), for: "people")
71-
XCTAssertEqual(event.relationship(for: "people"), .toMany([person1, person2]))
72-
XCTAssertEqual(person1.relationship(for: "events"), .toMany([event]))
73-
XCTAssertEqual(person2.relationship(for: "events"), .toMany([event]))
74-
75-
event.setRelationship(.toMany([]), for: "people")
76-
XCTAssertEqual(event.relationship(for: "people"), .toMany([]))
77-
XCTAssertEqual(person1.relationship(for: "events"), .toMany([]))
78-
XCTAssertEqual(person2.relationship(for: "events"), .toMany([]))
79-
80-
event.setRelationship(.toMany([person1]), for: "people")
81-
XCTAssertEqual(event.relationship(for: "people"), .toMany([person1]))
82-
XCTAssertEqual(person1.relationship(for: "events"), .toMany([event]))
83-
XCTAssertEqual(person2.relationship(for: "events"), .toMany([]))
84-
85-
event.setRelationship(.toMany([person1, person2]), for: "people")
86-
XCTAssertEqual(person1.relationship(for: "events"), .toMany([event]))
87-
XCTAssertEqual(person2.relationship(for: "events"), .toMany([event]))
88-
store.delete(event)
89-
90-
XCTAssert(event.isDeleted)
91-
XCTAssertFalse(person1.isDeleted)
92-
XCTAssertFalse(person2.isDeleted)
93-
XCTAssertEqual(person1.relationship(for: "events"), .toMany([]))
94-
XCTAssertEqual(person2.relationship(for: "events"), .toMany([]))
95-
96-
XCTAssertEqual(try store.fetch(FetchRequest(entity: "Person")), [person1, person2])
97-
XCTAssertEqual(try store.fetch(FetchRequest(entity: "Event")), [event])
98-
}*/
45+
try await store.insert(event1)
46+
person1 = try await store.fetch(Person.self, for: person1.id)!
47+
XCTAssertEqual(person1.events, [event1.id])
48+
event1 = try await store.fetch(Event.self, for: event1.id)!
49+
XCTAssertEqual(event1.people, [person1.id])
9950
}
10051
}
10152

Tests/CoreModelTests/TestModel.swift

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,33 @@ extension Person: Entity {
8080
)
8181
]
8282
}
83+
84+
init(from container: ModelData) throws {
85+
guard container.entity == Self.entityName else {
86+
throw DecodingError.typeMismatch(Self.self, DecodingError.Context(codingPath: [], debugDescription: "Cannot decode \(String(describing: Self.self)) from \(container.entity)"))
87+
}
88+
guard let id = UUID(uuidString: container.id.rawValue) else {
89+
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: [], debugDescription: "Cannot decode identifier from \(container.id)"))
90+
}
91+
self.id = id
92+
self.name = try container.decode(String.self, forKey: Person.CodingKeys.name)
93+
self.created = try container.decode(Date.self, forKey: Person.CodingKeys.created)
94+
self.age = try container.decode(UInt.self, forKey: Person.CodingKeys.age)
95+
self.events = try container.decodeRelationship([Event.ID].self, forKey: Person.CodingKeys.events)
96+
}
97+
98+
func encode() -> ModelData {
99+
100+
var container = ModelData(
101+
entity: Self.entityName,
102+
id: ObjectID(rawValue: self.id.description)
103+
)
104+
container.encode(self.name, forKey: Person.CodingKeys.name)
105+
container.encode(self.created, forKey: Person.CodingKeys.created)
106+
container.encode(self.age, forKey: Person.CodingKeys.age)
107+
container.encodeRelationship(self.events, forKey: Person.CodingKeys.events)
108+
return container
109+
}
83110
}
84111

85112
struct Event: Equatable, Hashable, Codable, Identifiable {
@@ -92,6 +119,10 @@ struct Event: Equatable, Hashable, Codable, Identifiable {
92119

93120
var people: [Person.ID]
94121

122+
//var speaker: Person.ID?
123+
124+
//var notes: String?
125+
95126
init(id: UUID = UUID(), name: String, date: Date, people: [Person.ID] = []) {
96127
self.id = id
97128
self.name = name
@@ -146,4 +177,29 @@ extension Event: Entity {
146177
inverseRelationship: PropertyKey(Person.CodingKeys.events))
147178
]
148179
}
180+
181+
init(from container: ModelData) throws {
182+
guard container.entity == Self.entityName else {
183+
throw DecodingError.typeMismatch(Self.self, DecodingError.Context(codingPath: [], debugDescription: "Cannot decode \(String(describing: Self.self)) from \(container.entity)"))
184+
}
185+
guard let id = UUID(uuidString: container.id.rawValue) else {
186+
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: [], debugDescription: "Cannot decode identifier from \(container.id)"))
187+
}
188+
self.id = id
189+
self.name = try container.decode(String.self, forKey: Event.CodingKeys.name)
190+
self.date = try container.decode(Date.self, forKey: Event.CodingKeys.date)
191+
self.people = try container.decodeRelationship([Person.ID].self, forKey: Event.CodingKeys.people)
192+
}
193+
194+
func encode() -> ModelData {
195+
196+
var container = ModelData(
197+
entity: Self.entityName,
198+
id: ObjectID(rawValue: self.id.description)
199+
)
200+
container.encode(self.name, forKey: Event.CodingKeys.name)
201+
container.encode(self.date, forKey: Event.CodingKeys.date)
202+
container.encodeRelationship(self.people, forKey: Event.CodingKeys.people)
203+
return container
204+
}
149205
}

0 commit comments

Comments
 (0)