amplify-swift/AmplifyTests/CategoryTests/Hub/DefaultPluginTests/AutoUnsubscribeOperationTes...

201 lines
8.3 KiB
Swift

//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
import XCTest
@testable import Amplify
@testable import AmplifyTestCommon
class AutoUnsubscribeOperationTests: XCTestCase {
override func setUp() async throws {
await Amplify.reset()
let storageConfiguration =
StorageCategoryConfiguration(plugins: ["MockDispatchingStoragePlugin": nil])
let config = AmplifyConfiguration(storage: storageConfiguration)
do {
try Amplify.add(plugin: MockDispatchingStoragePlugin())
try Amplify.configure(config)
} catch {
XCTFail("Error setting up Amplify: \(error)")
}
}
override func tearDown() async throws {
await Amplify.reset()
}
/// - Given: An Amplify operation class
/// - When: I pass an event listener with no other options to the operation constructor
/// - Then: The event listener is unsubscribed when it receives a successful result
func testOperationUnsubscribesOnSuccess() throws {
throw XCTSkip("Storage listeners removed")
// TODO: consider rewriting with async API
// let listenerWasInvokedForInProcess = expectation(description: "listener was invoked for in process event")
// listenerWasInvokedForInProcess.isInverted = true
//
// let listenerWasInvokedForCompleted = expectation(description: "listener was invoked for completed event")
//
// let listenerWasInvokedForFailed = expectation(description: "listener was invoked for failed event")
// listenerWasInvokedForFailed.isInverted = true
//
// let progressListener: ProgressListener = { _ in listenerWasInvokedForInProcess.fulfill() }
//
// let amplifyOperation = Amplify.Storage.downloadData(
// key: "foo",
// progressListener: progressListener
// ) { result in
// switch result {
// case .success:
// listenerWasInvokedForCompleted.fulfill()
// case .failure:
// listenerWasInvokedForFailed.fulfill()
// }
// }
//
// guard let operation = amplifyOperation as? MockDispatchingStorageDownloadDataOperation else {
// XCTFail("Unable to cast amplifyOperation as MockDispatchingStorageListOperation")
// return
// }
//
// operation.doMockDispatch()
// wait(for: [listenerWasInvokedForCompleted], timeout: 0.1)
//
// operation.doMockProgress()
// operation.doMockDispatch(result: .failure(StorageError.accessDenied("", "")))
// wait(for: [listenerWasInvokedForInProcess, listenerWasInvokedForFailed], timeout: 0.1)
}
/// - Given: An Amplify operation class
/// - When: I pass an event listener with no other options to the operation constructor
/// - Then: The event listener is unsubscribed when it receives a terminal event (.error)
func testOperationUnsubscribesOnError() throws {
throw XCTSkip("Storage listeners removed")
// TODO: consider rewriting with async API
// let listenerWasInvokedForInProcess = expectation(description: "listener was invoked for in process event")
// listenerWasInvokedForInProcess.isInverted = true
//
// let listenerWasInvokedForCompleted = expectation(description: "listener was invoked for completed event")
// listenerWasInvokedForCompleted.isInverted = true
//
// let listenerWasInvokedForFailed = expectation(description: "listener was invoked for failed event")
//
// let progressListener: ProgressListener = { _ in listenerWasInvokedForInProcess.fulfill() }
//
// let amplifyOperation = Amplify.Storage.downloadData(
// key: "foo",
// progressListener: progressListener
// ) { result in
// switch result {
// case .success:
// listenerWasInvokedForCompleted.fulfill()
// case .failure:
// listenerWasInvokedForFailed.fulfill()
// }
// }
//
// guard let operation = amplifyOperation as? MockDispatchingStorageDownloadDataOperation else {
// XCTFail("Unable to cast amplifyOperation as MockDispatchingStorageListOperation")
// return
// }
//
// operation.doMockDispatch(result: .failure(StorageError.accessDenied("", "")))
// wait(for: [listenerWasInvokedForFailed], timeout: 0.1)
//
// operation.doMockProgress()
// operation.doMockDispatch()
// wait(for: [listenerWasInvokedForInProcess, listenerWasInvokedForCompleted], timeout: 0.1)
}
/// - Given: An Amplify operation class
/// - When: I pass an event listener with no other options to the operation constructor
/// - Then: The event listener is unsubscribed when it receives a terminal event (.completed) after processing in-
/// progress events
func testOperationUnsubscribesOnCompleteAfterProgress() throws {
throw XCTSkip("Storage listeners removed")
// TODO: consider rewriting with async API
// let listenerWasInvokedForInProcess = expectation(description: "listener was invoked for in process event")
//
// let listenerWasInvokedForCompleted = expectation(description: "listener was invoked for completed event")
//
// let listenerWasInvokedForFailed = expectation(description: "listener was invoked for failed event")
// listenerWasInvokedForFailed.isInverted = true
//
// let progressListener: ProgressListener = { _ in listenerWasInvokedForInProcess.fulfill() }
//
// let amplifyOperation = Amplify.Storage.downloadData(
// key: "foo",
// progressListener: progressListener
// ) { result in
// switch result {
// case .success:
// listenerWasInvokedForCompleted.fulfill()
// case .failure:
// listenerWasInvokedForFailed.fulfill()
// }
// }
//
// guard let operation = amplifyOperation as? MockDispatchingStorageDownloadDataOperation else {
// XCTFail("Unable to cast amplifyOperation as MockDispatchingStorageListOperation")
// return
// }
//
// operation.doMockProgress()
// operation.doMockDispatch()
// wait(for: [listenerWasInvokedForInProcess, listenerWasInvokedForCompleted], timeout: 0.1)
//
// operation.doMockDispatch(result: .failure(StorageError.accessDenied("", "")))
// wait(for: [listenerWasInvokedForFailed], timeout: 0.1)
}
/// - Given: An Amplify operation class
/// - When: I pass an event listener with no other options to the operation constructor
/// - Then: The event listener is unsubscribed when it receives a terminal event (.error) after processing in-
/// progress events
func testOperationUnsubscribesOnErrorAfterProgress() throws {
throw XCTSkip("Storage listeners removed")
// TODO: consider rewriting with async API
// let listenerWasInvokedForInProcess = expectation(description: "listener was invoked for in process event")
//
// let listenerWasInvokedForCompleted = expectation(description: "listener was invoked for completed event")
// listenerWasInvokedForCompleted.isInverted = true
//
// let listenerWasInvokedForFailed = expectation(description: "listener was invoked for failed event")
//
// let progressListener: ProgressListener = { _ in listenerWasInvokedForInProcess.fulfill() }
//
// let amplifyOperation = Amplify.Storage.downloadData(
// key: "foo",
// progressListener: progressListener
// ) { result in
// switch result {
// case .success:
// listenerWasInvokedForCompleted.fulfill()
// case .failure:
// listenerWasInvokedForFailed.fulfill()
// }
// }
//
// guard let operation = amplifyOperation as? MockDispatchingStorageDownloadDataOperation else {
// XCTFail("Unable to cast amplifyOperation as MockDispatchingStorageListOperation")
// return
// }
//
// operation.doMockProgress()
// operation.doMockDispatch(result: .failure(StorageError.accessDenied("", "")))
// wait(for: [listenerWasInvokedForInProcess, listenerWasInvokedForFailed], timeout: 0.1)
//
// operation.doMockProgress()
// wait(for: [listenerWasInvokedForCompleted], timeout: 0.1)
}
}