diff --git a/Sources/CoreNetworking/HTTPClient.swift b/Sources/CoreNetworking/HTTPClient.swift index 8079fb5..19117e1 100644 --- a/Sources/CoreNetworking/HTTPClient.swift +++ b/Sources/CoreNetworking/HTTPClient.swift @@ -22,13 +22,20 @@ public class HTTPClient { } switch response.statusCode { case 200...299: - guard let decodedResponse = try? jsonDecoder.decode( - responseType, - from: data - ) else { - throw Request.RequestError.decode + do { + let decodedResponse = try jsonDecoder.decode( + responseType, + from: data + ) + + return decodedResponse + } catch { + guard let decodingError = error as? DecodingError else { + throw Request.RequestError.decode() + } + + throw Request.RequestError.decode(decodingError) } - return decodedResponse case 401: throw Request.RequestError.unauthorized default: diff --git a/Sources/CoreNetworking/Request.swift b/Sources/CoreNetworking/Request.swift index 9713357..000b744 100644 --- a/Sources/CoreNetworking/Request.swift +++ b/Sources/CoreNetworking/Request.swift @@ -61,15 +61,15 @@ public extension Request { } enum RequestError: Error { - case decode + case decode(DecodingError? = nil) case noResponse case unauthorized case unexpectedStatusCode var customMessage: String { switch self { - case .decode: - return "Decode error" + case .decode(let underlyingError): + return "Decode error: \(String(describing: underlyingError))" case .unauthorized: return "Session expired" default: diff --git a/Tests/CoreNetworkingTests/CoreNetworkingTests.swift b/Tests/CoreNetworkingTests/CoreNetworkingTests.swift index 020643e..5fdc865 100644 --- a/Tests/CoreNetworkingTests/CoreNetworkingTests.swift +++ b/Tests/CoreNetworkingTests/CoreNetworkingTests.swift @@ -36,8 +36,17 @@ final class CoreNetworkingTests: XCTestCase { do { _ = try await service.fetchCatFact() XCTFail("Should have thrown") + } catch let Request.RequestError.decode(DecodingError.keyNotFound(key, context)?) { + XCTAssertEqual(key.intValue, nil) + XCTAssertEqual(key.stringValue, "fact") + XCTAssertEqual(context.codingPath.count, 0) + XCTAssertEqual( + context.debugDescription, + "No value associated with key CodingKeys(stringValue: \"fact\", intValue: nil) (\"fact\")." + ) + XCTAssertNil(context.underlyingError) } catch { - XCTAssertEqual(error as? Request.RequestError, .decode) + XCTFail("Should have thrown RequestError.decode error") } } }