Skip to content

Commit 133f7f2

Browse files
committed
increase test coverage for EKSerializer. Fix a bug that prevented EKSerializer from serialization with non-nested keypaths.
1 parent 2d46db3 commit 133f7f2

File tree

4 files changed

+84
-2
lines changed

4 files changed

+84
-2
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file.
33

44
## Next
55

6+
* Fixed a bug in `EKSerializer` that prevented has one relationships from being properly serialized with non-nested keypaths.
7+
68
## [0.21.0](https://github.com/lucasmedeirosleite/EasyMapping/releases/tag/0.21.0)
79

810
* Fixed potential buffer overflow when using scalar Objective-C properties(#155, #156).

EasyMapping.xcodeproj/project.pbxproj

+10
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
/* Begin PBXFileReference section */
126126
3E1FB69B1EBE334A007CB0F4 /* EKObjectModelTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EKObjectModelTestCase.swift; path = Tests/EasyMappingTests/EKObjectModelTestCase.swift; sourceTree = "<group>"; };
127127
3E1FB69D1EBE36D0007CB0F4 /* EKManagedObjectModelTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EKManagedObjectModelTestCase.swift; path = Tests/EasyMappingTests/EKManagedObjectModelTestCase.swift; sourceTree = "<group>"; };
128+
3E1FB6A01EBF95D9007CB0F4 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = "<group>"; };
128129
3E9A90E71EB24789006305D1 /* UniversalFramework_Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = UniversalFramework_Base.xcconfig; sourceTree = "<group>"; };
129130
3E9A90E81EB24789006305D1 /* UniversalFramework_Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = UniversalFramework_Framework.xcconfig; sourceTree = "<group>"; };
130131
3E9A90E91EB24789006305D1 /* UniversalFramework_Test.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = UniversalFramework_Test.xcconfig; sourceTree = "<group>"; };
@@ -280,6 +281,14 @@
280281
/* End PBXFrameworksBuildPhase section */
281282

282283
/* Begin PBXGroup section */
284+
3E1FB69F1EBF95B9007CB0F4 /* Docs */ = {
285+
isa = PBXGroup;
286+
children = (
287+
3E1FB6A01EBF95D9007CB0F4 /* CHANGELOG.md */,
288+
);
289+
name = Docs;
290+
sourceTree = "<group>";
291+
};
283292
3E9A90EA1EB24809006305D1 /* Source */ = {
284293
isa = PBXGroup;
285294
children = (
@@ -495,6 +504,7 @@
495504
52D6D9721BEFF229002C0205 = {
496505
isa = PBXGroup;
497506
children = (
507+
3E1FB69F1EBF95B9007CB0F4 /* Docs */,
498508
3E9A912A1EB24827006305D1 /* Example */,
499509
3E9A91291EB2481E006305D1 /* Tests */,
500510
3E9A90EA1EB24809006305D1 /* Source */,

Sources/EasyMapping/EKSerializer.m

+1-2
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,8 @@ +(NSDictionary *)serializeObject:(id)object withMapping:(EKManagedObjectMapping
103103

104104
if (hasOneObject) {
105105
NSDictionary *hasOneRepresentation = [self serializeObject:hasOneObject
106-
withMapping:(EKManagedObjectMapping *)[[relationship objectClass] objectMapping]
106+
withMapping:(EKManagedObjectMapping *)[relationship mappingForObject:hasOneObject]
107107
fromContext:context];
108-
109108
if (relationship.nonNestedKeyPaths)
110109
{
111110
for (NSString * key in hasOneRepresentation.allKeys)

Tests/EasyMappingTests/EKSerializerTestCase.swift

+71
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,28 @@ class EKSerializerTestCase: XCTestCase {
119119
XCTAssertEqual(car?["year"] as? String, "2013")
120120
}
121121

122+
func testSerializesManagedObjectWithRootPath() {
123+
ManagedPhone.register(ManagedMappingProvider.phoneMapping())
124+
ManagedCar.register(ManagedMappingProvider.carMapping())
125+
ManagedPerson.register(ManagedMappingProvider.personMapping())
126+
defer {
127+
ManagedCar.register(nil)
128+
ManagedPerson.register(nil)
129+
ManagedPhone.register(nil)
130+
}
131+
132+
let info = FixtureLoader.dictionary(fromFileNamed: "Person.json")
133+
let person = EKManagedObjectMapper.object(fromExternalRepresentation: info, with: ManagedMappingProvider.personMapping(), in: Storage.shared.context) as? ManagedPerson
134+
135+
let serialized = EKSerializer.serializeObject(person!.car!, with: ManagedMappingProvider.carWithRootKeyMapping(), from: Storage.shared.context)
136+
137+
let data = serialized["data"] as? [String:Any]
138+
let car = data?["car"] as? [String:Any]
139+
140+
XCTAssertEqual(car?["model"] as? String, "i30")
141+
XCTAssertEqual(car?["year"] as? String, "2013")
142+
}
143+
122144
func testSerializerShouldSerializeNestedKeypaths() {
123145
let sut = EKSerializer.serializeObject(Car.i30, with: MappingProvider.carNestedAttributesMapping())
124146

@@ -292,4 +314,53 @@ class EKSerializerRelationshipsTestCase: XCTestCase {
292314
XCTAssertEqual(sut["email"] as? String, "[email protected]")
293315
XCTAssertEqual(sut["gender"] as? String, "male")
294316
}
317+
318+
func testSerializationOfNonNestedManagedObjects() {
319+
ManagedCar.register(ManagedMappingProvider.carMapping())
320+
ManagedPhone.register(ManagedMappingProvider.phoneMapping())
321+
ManagedPerson.register(ManagedMappingProvider.personMapping())
322+
defer {
323+
ManagedCar.register(nil)
324+
ManagedPhone.register(nil)
325+
ManagedPerson.register(nil)
326+
}
327+
let info = FixtureLoader.dictionary(fromFileNamed: "Person.json")
328+
let person = EKManagedObjectMapper.object(fromExternalRepresentation: info,
329+
with: ManagedMappingProvider.personMapping(),
330+
in: Storage.shared.context) as? ManagedPerson
331+
let sut = EKSerializer.serializeObject(person!, with: ManagedMappingProvider.personNonNestedMapping(), from: Storage.shared.context)
332+
333+
XCTAssertEqual(sut["carId"] as? Int, 3)
334+
XCTAssertEqual(sut["carModel"] as? String, "i30")
335+
XCTAssertEqual(sut["carYear"] as? String, "2013")
336+
337+
XCTAssertEqual(sut["name"] as? String, "Lucas")
338+
XCTAssertEqual(sut["email"] as? String, "[email protected]")
339+
XCTAssertEqual(sut["gender"] as? String, "male")
340+
}
341+
342+
func testSerializeCollectionOfHasManyObjects() {
343+
ManagedCar.register(ManagedMappingProvider.carMapping())
344+
ManagedPhone.register(ManagedMappingProvider.phoneMapping())
345+
ManagedPerson.register(ManagedMappingProvider.personMapping())
346+
defer {
347+
ManagedCar.register(nil)
348+
ManagedPhone.register(nil)
349+
ManagedPerson.register(nil)
350+
}
351+
let info = FixtureLoader.dictionary(fromFileNamed: "Person.json")
352+
let person = EKManagedObjectMapper.object(fromExternalRepresentation: info,
353+
with: ManagedMappingProvider.personMapping(),
354+
in: Storage.shared.context) as? ManagedPerson
355+
let sut = EKSerializer.serializeObject(person!,
356+
with: ManagedMappingProvider.personMapping(),
357+
from: Storage.shared.context)
358+
359+
guard let phones = sut["phones"] as? [[String:Any]] else { XCTFail(); return }
360+
361+
XCTAssertEqual(phones.count, 2)
362+
let numbers = phones.map { $0["number"] as? String }
363+
XCTAssert(numbers.contains(where: { $0 == "1111-1111"}))
364+
XCTAssert(numbers.contains(where: { $0 == "2222-222" }))
365+
}
295366
}

0 commit comments

Comments
 (0)