amplify-swift/AmplifyTests/CoreTests/AmplifyInProcessReportingOp...

165 lines
6.2 KiB
Swift

//
// Copyright Amazon.com Inc. or its affiliates.
// All Rights Reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
#if canImport(Combine)
import XCTest
import Combine
@testable import Amplify
@testable import AmplifyTestCommon
// swiftlint:disable:next type_name
class AmplifyInProcessReportingOperationChainedTests: XCTestCase {
func testChainedResultPublishersSucceed() {
let makeSuccessResponder: (Int) -> MockPublisherInProcessOperation.Responder = { value in
let successResponder: MockPublisherInProcessOperation.Responder = { operation in
operation.dispatch(result: .success(value))
operation.finish()
}
return successResponder
}
let receivedValue = expectation(description: "Received value")
let receivedFinished = expectation(description: "Received finished")
let receivedFailure = expectation(description: "Received failure")
receivedFailure.isInverted = true
let mockOp1 = MockPublisherInProcessOperation(responder: makeSuccessResponder(1))
let mockOp2 = MockPublisherInProcessOperation(responder: makeSuccessResponder(2))
let sink = Publishers.Zip(
mockOp1.internalResultPublisher,
mockOp2.internalResultPublisher
).flatMap { (value1: Int, value2: Int) -> AnyPublisher<Int, APIError> in
let mockOp = MockPublisherInProcessOperation(responder: makeSuccessResponder(value1 + value2))
mockOp.main()
return mockOp.internalResultPublisher
}.flatMap { (value: Int) -> AnyPublisher<Int, APIError> in
let mockOp = MockPublisherInProcessOperation(responder: makeSuccessResponder(value + 1))
mockOp.main()
return mockOp.internalResultPublisher
}.sink(receiveCompletion: { completion in
switch completion {
case .failure:
receivedFailure.fulfill()
case .finished:
receivedFinished.fulfill()
}
}, receiveValue: { _ in
receivedValue.fulfill()
})
mockOp1.main()
mockOp2.main()
waitForExpectations(timeout: 0.05)
sink.cancel()
}
func testChainedResultPublishersFail() {
let makeSuccessResponder: (Int) -> MockPublisherInProcessOperation.Responder = { value in
let successResponder: MockPublisherInProcessOperation.Responder = { operation in
operation.dispatch(result: .success(value))
operation.finish()
}
return successResponder
}
let failureResponder: MockPublisherInProcessOperation.Responder = { operation in
operation.dispatch(result: .failure(.unknown("Test", "Test")))
operation.finish()
}
let receivedValue = expectation(description: "Received value")
receivedValue.isInverted = true
let receivedFinished = expectation(description: "Received finished")
receivedFinished.isInverted = true
let receivedFailure = expectation(description: "Received failure")
let mockOp1 = MockPublisherInProcessOperation(responder: makeSuccessResponder(1))
let mockOp2 = MockPublisherInProcessOperation(responder: makeSuccessResponder(2))
let sink = Publishers.Zip(
mockOp1.internalResultPublisher,
mockOp2.internalResultPublisher
).flatMap { (_, _) -> AnyPublisher<Int, APIError> in
let mockOp = MockPublisherInProcessOperation(responder: failureResponder)
mockOp.main()
return mockOp.internalResultPublisher
}.flatMap { (value: Int) -> AnyPublisher<Int, APIError> in
let mockOp = MockPublisherInProcessOperation(responder: makeSuccessResponder(value + 1))
mockOp.main()
return mockOp.internalResultPublisher
}.sink(receiveCompletion: { completion in
switch completion {
case .failure:
receivedFailure.fulfill()
case .finished:
receivedFinished.fulfill()
}
}, receiveValue: { _ in
receivedValue.fulfill()
})
mockOp1.main()
mockOp2.main()
waitForExpectations(timeout: 0.05)
sink.cancel()
}
func testChainedResultPublishersCancel() {
let makeSuccessResponder: (Int) -> MockPublisherInProcessOperation.Responder = { value in
let successResponder: MockPublisherInProcessOperation.Responder = { operation in
operation.dispatch(result: .success(value))
operation.finish()
}
return successResponder
}
let receivedValue = expectation(description: "Received value")
receivedValue.isInverted = true
let receivedFinished = expectation(description: "Received finished")
let receivedFailure = expectation(description: "Received failure")
receivedFailure.isInverted = true
let mockOp1 = MockPublisherInProcessOperation(responder: makeSuccessResponder(1))
let mockOp2 = MockPublisherInProcessOperation(responder: makeSuccessResponder(2))
let sink = Publishers.Zip(
mockOp1.internalResultPublisher,
mockOp2.internalResultPublisher
).flatMap { (value1: Int, value2: Int) -> AnyPublisher<Int, APIError> in
let mockOp = MockPublisherInProcessOperation(responder: makeSuccessResponder(value1 + value2))
mockOp.cancel()
return mockOp.internalResultPublisher
}.flatMap { (value: Int) -> AnyPublisher<Int, APIError> in
let mockOp = MockPublisherInProcessOperation(responder: makeSuccessResponder(value + 1))
mockOp.main()
return mockOp.internalResultPublisher
}.sink(receiveCompletion: { completion in
switch completion {
case .failure:
receivedFailure.fulfill()
case .finished:
receivedFinished.fulfill()
}
}, receiveValue: { _ in
receivedValue.fulfill()
})
mockOp1.main()
mockOp2.main()
waitForExpectations(timeout: 0.05)
sink.cancel()
}
}
#endif