Skip to content

Commit ef25029

Browse files
HuiSFcshfang
andauthored
feat(datastore): Populate belongs-to nested models (#658)
* feat(datastore): Populate has-one and belongs-to nested models * Nest data under serializedData key and persist modelName * Resolve comment * Update packages/amplify_datastore/example/ios/unit_tests/resources/SchemaData.swift Co-authored-by: Chris F <[email protected]>
1 parent 8ff6ffd commit ef25029

13 files changed

+708
-593
lines changed

packages/amplify_datastore/example/ios/unit_tests/AmplifySerializedModelUnitTests.swift

Lines changed: 71 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -22,79 +22,100 @@ import Amplify
2222
class AmplifySerializedModelUnitTests: XCTestCase {
2323

2424
let serializedModelMaps: [String: Any] = try! readJsonMap(filePath: "serialized_model_maps")
25+
let flutterModelRegistration = SchemaData.flutterModelRegistration
2526

26-
func test_blog_hasMany_serialization() throws {
27-
let ourMap = FlutterSerializedModelData.BlogSerializedModel.toMap(modelSchema: SchemaData.BlogSchema);
28-
let refMap = serializedModelMaps["BlogSerializedMap"] as! [String : Any];
27+
func test_blog_hasMany_serialization() throws {
28+
let ourMap = try FlutterSerializedModelData.BlogSerializedModel.toMap(flutterModelRegistration: flutterModelRegistration, modelName: SchemaData.BlogSchema.name)
29+
let refMap = serializedModelMaps["BlogSerializedMap"] as! [String : Any]
2930

30-
XCTAssertEqual(ourMap["id"] as! String , refMap["id"] as! String);
31-
XCTAssertEqual(ourMap["modelName"] as! String , refMap["modelName"] as! String);
31+
XCTAssertEqual(ourMap["id"] as! String , refMap["id"] as! String)
32+
XCTAssertEqual(ourMap["modelName"] as! String , refMap["modelName"] as! String)
3233

33-
let ourSd : [String: Any] = ourMap["serializedData"] as! [String: Any];
34-
let refSd : [String: Any] = refMap["serializedData"] as! [String: Any];
34+
let ourSd : [String: Any] = ourMap["serializedData"] as! [String: Any]
35+
let refSd : [String: Any] = refMap["serializedData"] as! [String: Any]
3536

36-
XCTAssertEqual(ourSd["id"] as! String , refSd["id"] as! String);
37-
XCTAssertEqual(ourSd["name"] as! String , refSd["name"] as! String);
37+
XCTAssertEqual(ourSd["id"] as! String , refSd["id"] as! String)
38+
XCTAssertEqual(ourSd["name"] as! String , refSd["name"] as! String)
3839
}
3940

4041
func test_comment_belongs_serialization() throws {
41-
let ourMap = FlutterSerializedModelData.CommentSerializedModel.toMap(modelSchema: SchemaData.CommentSchema);
42-
let refMap = serializedModelMaps["CommentSerializedMap"] as! [String : Any];
42+
let ourMap = try FlutterSerializedModelData.CommentSerializedModel.toMap(flutterModelRegistration: flutterModelRegistration, modelName: SchemaData.CommentSchema.name)
43+
let refMap = serializedModelMaps["CommentSerializedMap"] as! [String : Any]
4344

44-
XCTAssertEqual(ourMap["id"] as! String , refMap["id"] as! String);
45-
XCTAssertEqual(ourMap["modelName"] as! String , refMap["modelName"] as! String);
45+
XCTAssertEqual(ourMap["id"] as! String , refMap["id"] as! String)
46+
XCTAssertEqual(ourMap["modelName"] as! String , refMap["modelName"] as! String)
4647

47-
let ourSd : [String: Any] = ourMap["serializedData"] as! [String: Any];
48-
let refSd : [String: Any] = refMap["serializedData"] as! [String: Any];
48+
let ourSd : [String: Any] = ourMap["serializedData"] as! [String: Any]
49+
let refSd : [String: Any] = refMap["serializedData"] as! [String: Any]
4950

50-
XCTAssertEqual(ourSd["id"] as! String , refSd["id"] as! String);
51-
XCTAssertEqual(ourSd["content"] as! String , refSd["content"] as! String);
51+
XCTAssertEqual(ourSd["id"] as! String , refSd["id"] as! String)
52+
XCTAssertEqual(ourSd["content"] as! String , refSd["content"] as! String)
5253

53-
let ourNs : [String: Any] = ourSd["post"] as! [String: Any];
54-
let refNs : [String: Any] = refSd["post"] as! [String: Any];
54+
let ourNs : [String: Any] = ourSd["post"] as! [String: Any]
55+
let refNs : [String: Any] = refSd["post"] as! [String: Any]
5556

56-
XCTAssertEqual(ourNs["id"] as! String , refNs["id"] as! String);
57-
}
57+
XCTAssertEqual(ourNs["id"] as! String , refNs["id"] as! String)
58+
}
5859

59-
func test_post_with_datetime_int_hasMany__serialization() throws {
60-
let ourMap = FlutterSerializedModelData.PostSerializedModel.toMap(modelSchema: SchemaData.PostSchema);
61-
let refMap = serializedModelMaps["PostSerializedMap"] as! [String : Any];
60+
func test_post_with_datetime_int_hasMany_serialization() throws {
61+
let ourMap = try FlutterSerializedModelData.PostSerializedModel.toMap(flutterModelRegistration: flutterModelRegistration, modelName: SchemaData.PostSchema.name)
62+
let refMap = serializedModelMaps["PostSerializedMap"] as! [String : Any]
6263

63-
XCTAssertEqual(ourMap["id"] as! String , refMap["id"] as! String);
64-
XCTAssertEqual(ourMap["modelName"] as! String , refMap["modelName"] as! String);
64+
XCTAssertEqual(ourMap["id"] as! String , refMap["id"] as! String)
65+
XCTAssertEqual(ourMap["modelName"] as! String , refMap["modelName"] as! String)
6566

66-
let ourSd : [String: Any] = ourMap["serializedData"] as! [String: Any];
67-
let refSd : [String: Any] = refMap["serializedData"] as! [String: Any];
67+
let ourSd : [String: Any] = ourMap["serializedData"] as! [String: Any]
68+
let refSd : [String: Any] = refMap["serializedData"] as! [String: Any]
6869

69-
XCTAssertEqual(ourSd["id"] as! String , refSd["id"] as! String);
70-
XCTAssertEqual(ourSd["title"] as! String , refSd["title"] as! String);
71-
XCTAssertEqual(ourSd["created"] as! String , refSd["created"] as! String);
70+
XCTAssertEqual(ourSd["id"] as! String , refSd["id"] as! String)
71+
XCTAssertEqual(ourSd["title"] as! String , refSd["title"] as! String)
72+
XCTAssertEqual(ourSd["created"] as! String , refSd["created"] as! String)
7273

73-
let ourNs : [String: Any] = ourSd["blog"] as! [String: Any];
74-
let refNs : [String: Any] = refSd["blog"] as! [String: Any];
74+
let ourNs : [String: Any] = ourSd["blog"] as! [String: Any]
75+
let refNs : [String: Any] = refSd["blog"] as! [String: Any]
7576

76-
XCTAssertEqual(ourNs["id"] as! String , refNs["id"] as! String);
77-
}
77+
XCTAssertEqual(ourNs["id"] as! String , refNs["id"] as! String)
78+
}
79+
80+
func test_post_with_nested_models_serialization() throws {
81+
let serializedData = try (FlutterSerializedModelData.PostSerializedModel.toMap(flutterModelRegistration: flutterModelRegistration, modelName: SchemaData.PostSchema.name))["serializedData"] as! [String: Any]
82+
let expectedData = (serializedModelMaps["PostSerializedMap"] as! [String : Any])["serializedData"] as! [String: Any]
83+
let serializedBlog = (serializedData["blog"] as! [String: Any])["serializedData"] as! [String: String]
84+
let expectedBlog = (expectedData["blog"] as! [String: Any])["serializedData"] as! [String: String]
85+
86+
XCTAssertEqual(serializedBlog, expectedBlog)
87+
88+
let serializedAuthor = (serializedData["author"] as! [String: Any])["serializedData"] as! [String: Any]
89+
let expectedAuthor = (expectedData["author"] as! [String: Any])["serializedData"] as! [String: Any]
90+
91+
XCTAssertEqual(serializedAuthor["id"] as! String, expectedAuthor["id"] as! String)
92+
XCTAssertEqual(serializedAuthor["name"] as! String, expectedAuthor["name"] as! String)
93+
94+
let serializedDepartment = (serializedAuthor["department"] as! [String: Any])["serializedData"] as! [String: String]
95+
let expectedDepartment = (expectedAuthor["department"] as! [String: Any])["serializedData"] as! [String: String]
96+
97+
XCTAssertEqual(serializedDepartment, expectedDepartment)
98+
}
7899

79100

80101
func test_allTypeModel_serialization() throws {
81-
let ourMap = FlutterSerializedModelData.AllTypeModelSerializedModel.toMap(modelSchema: SchemaData.AllTypeModelSchema);
82-
let refMap = serializedModelMaps["AllTypeModelSerializedMap"] as! [String : Any];
102+
let ourMap = try FlutterSerializedModelData.AllTypeModelSerializedModel.toMap(flutterModelRegistration: flutterModelRegistration, modelName: SchemaData.AllTypeModelSchema.name)
103+
let refMap = serializedModelMaps["AllTypeModelSerializedMap"] as! [String : Any]
83104

84-
XCTAssertEqual(ourMap["id"] as! String , refMap["id"] as! String);
85-
XCTAssertEqual(ourMap["modelName"] as! String , refMap["modelName"] as! String);
105+
XCTAssertEqual(ourMap["id"] as! String , refMap["id"] as! String)
106+
XCTAssertEqual(ourMap["modelName"] as! String , refMap["modelName"] as! String)
86107

87-
let ourSd : [String: Any] = ourMap["serializedData"] as! [String: Any];
88-
let refSd : [String: Any] = refMap["serializedData"] as! [String: Any];
108+
let ourSd : [String: Any] = ourMap["serializedData"] as! [String: Any]
109+
let refSd : [String: Any] = refMap["serializedData"] as! [String: Any]
89110

90-
XCTAssertEqual(ourSd["id"] as! String , refSd["id"] as! String);
91-
XCTAssertEqual(ourSd["stringType"] as! String , refSd["stringType"] as! String);
92-
XCTAssertEqual(ourSd["intType"] as! NSNumber , refSd["intType"] as! NSNumber);
93-
XCTAssertEqual(ourSd["floatType"] as! NSNumber , refSd["floatType"] as! NSNumber);
94-
XCTAssertEqual(ourSd["boolType"] as! Bool , refSd["boolType"] as! Bool);
95-
XCTAssertEqual(ourSd["dateType"] as! String , refSd["dateType"] as! String);
96-
XCTAssertEqual(ourSd["dateTimeType"] as! String , refSd["dateTimeType"] as! String);
97-
XCTAssertEqual(ourSd["timeType"] as! String , refSd["timeType"] as! String);
98-
XCTAssertEqual(ourSd["enumType"] as! String , refSd["enumType"] as! String);
111+
XCTAssertEqual(ourSd["id"] as! String , refSd["id"] as! String)
112+
XCTAssertEqual(ourSd["stringType"] as! String , refSd["stringType"] as! String)
113+
XCTAssertEqual(ourSd["intType"] as! NSNumber , refSd["intType"] as! NSNumber)
114+
XCTAssertEqual(ourSd["floatType"] as! NSNumber , refSd["floatType"] as! NSNumber)
115+
XCTAssertEqual(ourSd["boolType"] as! Bool , refSd["boolType"] as! Bool)
116+
XCTAssertEqual(ourSd["dateType"] as! String , refSd["dateType"] as! String)
117+
XCTAssertEqual(ourSd["dateTimeType"] as! String , refSd["dateTimeType"] as! String)
118+
XCTAssertEqual(ourSd["timeType"] as! String , refSd["timeType"] as! String)
119+
XCTAssertEqual(ourSd["enumType"] as! String , refSd["enumType"] as! String)
99120
}
100121
}

packages/amplify_datastore/example/ios/unit_tests/DataStoreHubEventStreamHandlerTests.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class DataStoreHubEventStreamHandlerTests: XCTestCase {
6363
let hubHandler = MockDataStoreHubHandler()
6464
// passing the expectation we are awaiting into the enclosed class
6565
hubHandler.setExpectation(outerExpect: expect)
66-
hubHandler.registerModelsForHub(flutterModels: flutterModelSchemaRegistration)
66+
hubHandler.registerModelsForHub(flutterModelRegistration: flutterModelSchemaRegistration)
6767
hubHandler.setHubListener()
6868

6969
let modelSyncedEventPayload = HubPayload(eventName: HubPayload.EventName.DataStore.modelSynced,
@@ -91,7 +91,7 @@ class DataStoreHubEventStreamHandlerTests: XCTestCase {
9191

9292
let hubHandler = MockDataStoreHubHandler()
9393
hubHandler.setExpectation(outerExpect: expect)
94-
hubHandler.registerModelsForHub(flutterModels: flutterModelSchemaRegistration)
94+
hubHandler.registerModelsForHub(flutterModelRegistration: flutterModelSchemaRegistration)
9595
hubHandler.setHubListener()
9696

9797
let readyEventPayload = HubPayload(eventName: HubPayload.EventName.DataStore.ready)
@@ -116,7 +116,7 @@ class DataStoreHubEventStreamHandlerTests: XCTestCase {
116116

117117
let hubHandler = MockDataStoreHubHandler()
118118
hubHandler.setExpectation(outerExpect: expect)
119-
hubHandler.registerModelsForHub(flutterModels: flutterModelSchemaRegistration)
119+
hubHandler.registerModelsForHub(flutterModelRegistration: flutterModelSchemaRegistration)
120120
hubHandler.setHubListener()
121121

122122
let subscriptionEstablishedPayload = HubPayload(eventName: HubPayload.EventName.DataStore.subscriptionsEstablished)
@@ -140,7 +140,7 @@ class DataStoreHubEventStreamHandlerTests: XCTestCase {
140140

141141
let hubHandler = MockDataStoreHubHandler()
142142
hubHandler.setExpectation(outerExpect: expect)
143-
hubHandler.registerModelsForHub(flutterModels: flutterModelSchemaRegistration)
143+
hubHandler.registerModelsForHub(flutterModelRegistration: flutterModelSchemaRegistration)
144144
hubHandler.setHubListener()
145145

146146
let syncQueriesReadyPayload = HubPayload(eventName: HubPayload.EventName.DataStore.syncQueriesReady)
@@ -167,7 +167,7 @@ class DataStoreHubEventStreamHandlerTests: XCTestCase {
167167

168168
let hubHandler = MockDataStoreHubHandler()
169169
hubHandler.setExpectation(outerExpect: expect)
170-
hubHandler.registerModelsForHub(flutterModels: flutterModelSchemaRegistration)
170+
hubHandler.registerModelsForHub(flutterModelRegistration: flutterModelSchemaRegistration)
171171
hubHandler.setHubListener()
172172

173173
let networkStatusPayload = HubPayload(eventName: HubPayload.EventName.DataStore.networkStatus, data: networkStatusEvent)
@@ -194,7 +194,7 @@ class DataStoreHubEventStreamHandlerTests: XCTestCase {
194194

195195
let hubHandler = MockDataStoreHubHandler()
196196
hubHandler.setExpectation(outerExpect: expect)
197-
hubHandler.registerModelsForHub(flutterModels: flutterModelSchemaRegistration)
197+
hubHandler.registerModelsForHub(flutterModelRegistration: flutterModelSchemaRegistration)
198198
hubHandler.setHubListener()
199199

200200
let outboxStatusPayload = HubPayload(eventName: HubPayload.EventName.DataStore.outboxStatus, data: outboxStatusEvent)
@@ -220,7 +220,7 @@ class DataStoreHubEventStreamHandlerTests: XCTestCase {
220220
let syncQueriesStartedEvent = SyncQueriesStartedEvent(models: ["Blog"])
221221
let hubHandler = MockDataStoreHubHandler()
222222
hubHandler.setExpectation(outerExpect: expect)
223-
hubHandler.registerModelsForHub(flutterModels: flutterModelSchemaRegistration)
223+
hubHandler.registerModelsForHub(flutterModelRegistration: flutterModelSchemaRegistration)
224224
hubHandler.setHubListener()
225225

226226
let syncQueriesStartedPayload = HubPayload(eventName: HubPayload.EventName.DataStore.syncQueriesStarted, data: syncQueriesStartedEvent)
@@ -263,7 +263,7 @@ class DataStoreHubEventStreamHandlerTests: XCTestCase {
263263
let outboxMutationEnqueuedEvent = OutboxMutationEvent.fromModelWithoutMetadata(modelName: "Post", model: serializedModel)
264264
let hubHandler = MockDataStoreHubHandler()
265265
hubHandler.setExpectation(outerExpect: expect)
266-
hubHandler.registerModelsForHub(flutterModels: flutterModelSchemaRegistration)
266+
hubHandler.registerModelsForHub(flutterModelRegistration: flutterModelSchemaRegistration)
267267
hubHandler.setHubListener()
268268

269269
let outboxMutationEnqueuedPayload = HubPayload(eventName: HubPayload.EventName.DataStore.outboxMutationEnqueued, data: outboxMutationEnqueuedEvent)
@@ -313,11 +313,11 @@ class DataStoreHubEventStreamHandlerTests: XCTestCase {
313313
let hubHandler = MockDataStoreHubHandler()
314314

315315
do {
316-
var anyModel = try serializedModel.eraseToAnyModel()
316+
let anyModel = try serializedModel.eraseToAnyModel()
317317
let mutationSync = MutationSync(model: anyModel, syncMetadata: syncMetadata)
318318
let outboxMutationProcessedEvent = OutboxMutationEvent.fromModelWithMetadata(modelName: "Post", model: serializedModel, mutationSync: mutationSync)
319319
hubHandler.setExpectation(outerExpect: expect)
320-
hubHandler.registerModelsForHub(flutterModels: flutterModelSchemaRegistration)
320+
hubHandler.registerModelsForHub(flutterModelRegistration: flutterModelSchemaRegistration)
321321
hubHandler.setHubListener()
322322
let outboxMutationProcessedPayload = HubPayload(eventName: HubPayload.EventName.DataStore.outboxMutationProcessed, data: outboxMutationProcessedEvent)
323323
Amplify.Hub.dispatch(to: .dataStore, payload: outboxMutationProcessedPayload)

packages/amplify_datastore/example/ios/unit_tests/resources/FlutterSerializedModelData.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,17 @@ struct FlutterSerializedModelData {
3939
"title" : JSONValue.string("post title"),
4040
"created" : JSONValue.string("2020-11-25T01:28:49.000Z"),
4141
"blog" : JSONValue.object([
42-
"id" : "555"
42+
"id" : "555",
43+
"name": "Blog 1"
44+
]),
45+
"author": JSONValue.object([
46+
"id": "666",
47+
"name": "Someone Testing",
48+
"department": JSONValue.object([
49+
"id": "777",
50+
"name": "Department 1",
51+
"description": "Testing department 1"
52+
])
4353
])
4454
]);
4555

0 commit comments

Comments
 (0)