in AmplifyPlugins/DataStore/AWSDataStoreCategoryPluginFlutterIntegrationTests/DataStoreFlutterConsecutiveUpdatesTests.swift [243:373]
func testSaveThenUpdateAndImmediatelyDelete() throws {
try startAmplifyAndWaitForSync()
let plugin: AWSDataStorePlugin = try Amplify.DataStore.getPlugin(for: "awsDataStorePlugin") as! AWSDataStorePlugin
let newPost = try PostWrapper(title: "MyPost",
content: "This is my post.",
createdAt: Temporal.DateTime.now().iso8601String,
rating: 3)
var updatedPost = newPost
try updatedPost.updateRating(rating: 5)
try updatedPost.updateStringProp(key: "title", value: "MyUpdatedTitle")
try updatedPost.updateStringProp(key: "content", value: "This is my updated post.")
let saveSyncReceived = expectation(description: "Received create mutation event on subscription for Post")
let updateSyncReceived = expectation(description: "Received update mutation event on subscription for Post")
let deleteSyncReceived = expectation(description: "Received delete mutation event on subscription for Post")
let hubListener = Amplify.Hub.listen(
to: .dataStore,
eventName: HubPayload.EventName.DataStore.syncReceived) { payload in
guard let mutationEvent = payload.data as? MutationEvent else {
XCTFail("Can't cast payload as mutation event")
return
}
guard let post = try? PostWrapper(json: mutationEvent.json) as! PostWrapper, post.idString() == newPost.idString() else {
return
}
if mutationEvent.mutationType == GraphQLMutationType.create.rawValue {
XCTAssertEqual(post, newPost)
XCTAssertEqual(mutationEvent.version, 1)
saveSyncReceived.fulfill()
return
}
if mutationEvent.mutationType == GraphQLMutationType.update.rawValue {
XCTAssertEqual(post, updatedPost)
XCTAssertEqual(mutationEvent.version, 2)
updateSyncReceived.fulfill()
return
}
if mutationEvent.mutationType == GraphQLMutationType.delete.rawValue {
XCTAssertEqual(post, updatedPost)
deleteSyncReceived.fulfill()
XCTAssertEqual(mutationEvent.version, 3)
return
}
}
guard try HubListenerTestUtilities.waitForListener(with: hubListener, timeout: 5.0) else {
XCTFail("Listener not registered for hub")
return
}
// save the post, update and delete immediately
let saveCompleted = expectation(description: "Save is completed")
plugin.save(newPost.model, modelSchema: Post.schema) { result in
switch result {
case .success:
saveCompleted.fulfill()
case .failure(let error):
XCTFail("Error: \(error)")
}
}
wait(for: [saveCompleted, saveSyncReceived], timeout: networkTimeout)
let updateAndImmediatelyDelete =
expectation(description: "Post is updated and deleted immediately")
plugin.save(updatedPost.model, modelSchema: Post.schema) { result in
sleep(2)
switch result {
case .success:
plugin.delete(updatedPost.model, modelSchema: Post.schema) { result in
switch result {
case .success:
updateAndImmediatelyDelete.fulfill()
case .failure(let error):
XCTFail("Error: \(error)")
}
}
case .failure(let error):
XCTFail("Error: \(error)")
}
}
wait(for: [updateAndImmediatelyDelete], timeout: networkTimeout)
// query the deleted post immediately
let queryResult = queryPost(id: newPost.idString(), plugin: plugin)
XCTAssertNil(queryResult)
wait(for: [updateSyncReceived, deleteSyncReceived], timeout: networkTimeout)
// query the deleted post
let queryResultAfterSync = queryPost(id: updatedPost.idString(), plugin: plugin)
XCTAssertNil(queryResultAfterSync)
let queryRequest =
GraphQLRequest<MutationSyncResult?>.query(modelName: "Post", byId: updatedPost.idString())
let apiQuerySuccess = expectation(description: "API query is successful")
Amplify.API.query(request: queryRequest) { result in
switch result {
case .success(let mutationSyncResult):
switch mutationSyncResult {
case .success(let data):
guard let post = data else {
XCTFail("Failed to get data")
return
}
let testPost = self.convertToTestPost(model: post.model.instance as! Post)
XCTAssertNotNil(testPost)
XCTAssertEqual(testPost?.title(), updatedPost.title())
XCTAssertEqual(testPost?.content(), updatedPost.content())
XCTAssertEqual(testPost?.rating(), updatedPost.rating())
XCTAssertTrue(post.syncMetadata.deleted)
XCTAssertEqual(post.syncMetadata.version, 3)
apiQuerySuccess.fulfill()
case .failure(let error):
XCTFail("Error: \(error)")
}
case .failure(let error):
XCTFail("Error: \(error)")
}
}
wait(for: [apiQuerySuccess], timeout: networkTimeout)
}