102 lines
4.1 KiB
Swift
102 lines
4.1 KiB
Swift
//
|
|
// Copyright Amazon.com Inc. or its affiliates.
|
|
// All Rights Reserved.
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
import XCTest
|
|
import Combine
|
|
|
|
@testable import Amplify
|
|
@testable import AmplifyTestCommon
|
|
@testable import AWSDataStorePlugin
|
|
|
|
class AWSDataStorePluginBaseBehaviorTests: BaseDataStoreTests {
|
|
|
|
func testDispatchModelSyncedEventToHub() {
|
|
|
|
let modelSyncedEvent = ModelSyncedEvent(modelName: Post.modelName,
|
|
isFullSync: true,
|
|
isDeltaSync: false,
|
|
added: 10,
|
|
updated: 1,
|
|
deleted: 1)
|
|
let modelSyncedReceivedFromHub = expectation(description: "modelSynced received from Hub")
|
|
let listener = Amplify.Hub.publisher(for: .dataStore).sink { payload in
|
|
switch payload.eventName {
|
|
case HubPayload.EventName.DataStore.modelSynced:
|
|
guard let modelSyncedEventPayload = payload.data as? ModelSyncedEvent else {
|
|
XCTFail("Couldn't cast payload data as ModelSyncedEvent")
|
|
return
|
|
}
|
|
XCTAssertEqual(modelSyncedEventPayload, modelSyncedEvent)
|
|
modelSyncedReceivedFromHub.fulfill()
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
|
|
guard let dispatchedModelSyncedEvent = dataStorePlugin.dispatchedModelSyncedEvents[Post.modelName] else {
|
|
XCTFail("Missing `dispatchedModelSyncedEvent` for `Post` model")
|
|
return
|
|
}
|
|
XCTAssertFalse(dispatchedModelSyncedEvent.get())
|
|
|
|
dataStorePlugin.onReceiveValue(receiveValue: .modelSyncedEvent(modelSyncedEvent))
|
|
XCTAssertTrue(dispatchedModelSyncedEvent.get())
|
|
wait(for: [modelSyncedReceivedFromHub], timeout: 1)
|
|
listener.cancel()
|
|
}
|
|
|
|
func testDispatchedModelSyncedEventFalseAfterStop() throws {
|
|
let modelSyncedEvent = ModelSyncedEvent(modelName: Post.modelName,
|
|
isFullSync: true,
|
|
isDeltaSync: false,
|
|
added: 10,
|
|
updated: 1,
|
|
deleted: 1)
|
|
guard let dispatchedModelSyncedEvent = dataStorePlugin.dispatchedModelSyncedEvents[Post.modelName] else {
|
|
XCTFail("Missing `dispatchedModelSyncedEvent` for `Post` model")
|
|
return
|
|
}
|
|
XCTAssertFalse(dispatchedModelSyncedEvent.get())
|
|
dataStorePlugin.onReceiveValue(receiveValue: .modelSyncedEvent(modelSyncedEvent))
|
|
XCTAssertTrue(dispatchedModelSyncedEvent.get())
|
|
|
|
let dataStoreStopSuccess = expectation(description: "Stop successfully")
|
|
dataStorePlugin.stop { result in
|
|
switch result {
|
|
case .success:
|
|
dataStoreStopSuccess.fulfill()
|
|
case .failure(let error):
|
|
XCTFail("\(error.localizedDescription)")
|
|
}
|
|
}
|
|
|
|
wait(for: [dataStoreStopSuccess], timeout: 1)
|
|
XCTAssertFalse(dispatchedModelSyncedEvent.get())
|
|
}
|
|
|
|
func testDispatchReadyEventToHub() {
|
|
let readyReceivedFromHub = expectation(description: "ready event received from Hub")
|
|
let syncQueriesReadyFromHub = expectation(description: "ready event received from Hub")
|
|
let listener = Amplify.Hub.publisher(for: .dataStore).sink { payload in
|
|
switch payload.eventName {
|
|
case HubPayload.EventName.DataStore.ready:
|
|
readyReceivedFromHub.fulfill()
|
|
case HubPayload.EventName.DataStore.syncQueriesReady:
|
|
syncQueriesReadyFromHub.fulfill()
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
|
|
dataStorePlugin.onReceiveValue(receiveValue: .syncQueriesReadyEvent)
|
|
dataStorePlugin.onReceiveValue(receiveValue: .readyEvent)
|
|
|
|
wait(for: [syncQueriesReadyFromHub, readyReceivedFromHub], timeout: 1)
|
|
listener.cancel()
|
|
}
|
|
}
|