diff --git a/Sources/OpenCombine/Publishers/Publishers.Decode.swift b/Sources/OpenCombine/Publishers/Publishers.Decode.swift index 2a4b412..f61e8f6 100644 --- a/Sources/OpenCombine/Publishers/Publishers.Decode.swift +++ b/Sources/OpenCombine/Publishers/Publishers.Decode.swift @@ -90,12 +90,7 @@ private final class _Decode) { - switch completion { - case .finished: - downstream.receive(completion: .finished) - case .failure(let error): - downstream.receive(completion: .failure(error)) - } + downstream.receive(completion: completion.eraseError()) } func request(_ demand: Subscribers.Demand) { diff --git a/Sources/OpenCombine/Publishers/Publishers.Encode.swift b/Sources/OpenCombine/Publishers/Publishers.Encode.swift index 32e2217..c752f03 100644 --- a/Sources/OpenCombine/Publishers/Publishers.Encode.swift +++ b/Sources/OpenCombine/Publishers/Publishers.Encode.swift @@ -8,9 +8,9 @@ extension Publishers { public struct Encode: Publisher - where Upstream : Publisher, - Coder : TopLevelEncoder, - Upstream.Output : Encodable + where Upstream: Publisher, + Coder: TopLevelEncoder, + Upstream.Output: Encodable { /// The kind of errors this publisher might publish. @@ -37,13 +37,14 @@ extension Publishers { /// - Parameters: /// - subscriber: The subscriber to attach to this `Publisher`. /// once attached it can begin to receive values. - public func receive(subscriber: Receiver) - where Failure == Receiver.Failure, Output == Receiver.Input { - let encodeSubscriber = _Encode( - downstream: subscriber, - encoder: encoder - ) - upstream.receive(subscriber: encodeSubscriber) + public func receive(subscriber: SubscriberType) + where Failure == SubscriberType.Failure, Output == SubscriberType.Input + { + let encodeSubscriber = _Encode( + downstream: subscriber, + encoder: encoder + ) + upstream.receive(subscriber: encodeSubscriber) } } } @@ -108,7 +109,7 @@ extension Publisher { public func encode( encoder: Coder ) -> Publishers.Encode - where Coder : TopLevelEncoder + where Coder: TopLevelEncoder { return Publishers.Encode(upstream: self, encoder: encoder) } diff --git a/Tests/OpenCombineTests/PublisherTests/DecodeTests.swift b/Tests/OpenCombineTests/PublisherTests/DecodeTests.swift index 124a227..14fea89 100644 --- a/Tests/OpenCombineTests/PublisherTests/DecodeTests.swift +++ b/Tests/OpenCombineTests/PublisherTests/DecodeTests.swift @@ -52,10 +52,10 @@ final class DecodeTests: XCTestCase { subject.send(failData) // Then - guard case .completion(.failure) = subscriber.history[1] else { - XCTFail("Decode failure not found") - return - } + let decodeContext = DecodingError.Context(codingPath: [], debugDescription: "") + let decodeError = DecodingError.dataCorrupted(decodeContext) + XCTAssertEqual(subscriber.history, [.subscription(Subscriptions.empty), + .completion(.failure(decodeError))]) } func testDemand() { @@ -86,7 +86,7 @@ final class DecodeTests: XCTestCase { ) decode.subscribe(tracking) - XCTAssert(downstreamSubscription != nil) // Removes unused variable warning + XCTAssertNotNil(downstreamSubscription) // Removes unused variable warning XCTAssertEqual(subscription.history, [.requested(.unlimited)]) } } diff --git a/Tests/OpenCombineTests/PublisherTests/EncodeTests.swift b/Tests/OpenCombineTests/PublisherTests/EncodeTests.swift index 9e97e0e..3ac1599 100644 --- a/Tests/OpenCombineTests/PublisherTests/EncodeTests.swift +++ b/Tests/OpenCombineTests/PublisherTests/EncodeTests.swift @@ -17,7 +17,8 @@ import OpenCombine final class EncodeTests: XCTestCase { static let allTests = [ ("testEncodeWorks", testEncodeWorks), - ("testDemand", testDemand) + ("testDemand", testDemand), + ("testEncodeSuccessHistory", testEncodeSuccessHistory) ] private let jsonEncoder = JSONEncoder() @@ -44,6 +45,23 @@ final class EncodeTests: XCTestCase { XCTAssert(decoded == testValue) } + func testEncodeSuccessHistory() throws { + // Given + let testValue = ["test": "TestDecodable"] + let subject = PassthroughSubject<[String: String], Error>() + let publisher = subject.encode(encoder: jsonEncoder) + let subscriber = TrackingSubscriberBase() + + // When + publisher.subscribe(subscriber) + subject.send(testValue) + + // Then + let testData = try jsonEncoder.encode(testValue) + XCTAssertEqual(subscriber.history, [.subscription(Subscriptions.empty), + .value(testData)]) + } + func testDemand() { // `CustomSubscription` tracks all the requests and cancellations // in its `history` property @@ -71,7 +89,7 @@ final class EncodeTests: XCTestCase { ) encode.subscribe(tracking) - XCTAssert(downstreamSubscription != nil) // Removes unused variable warning + XCTAssertNotNil(downstreamSubscription) // Removes unused variable warning XCTAssertEqual(subscription.history, [.requested(.unlimited)]) } }