Skip to content

Commit 03ef80b

Browse files
authored
fix: Add WaiterTypedError conformance to ClientError (#505)
1 parent 03ec067 commit 03ef80b

File tree

2 files changed

+121
-22
lines changed

2 files changed

+121
-22
lines changed

Sources/ClientRuntime/Networking/ClientError.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,18 @@ public enum ClientError: Error, Equatable {
4242
}
4343
}
4444
}
45+
46+
extension ClientError: WaiterTypedError {
47+
48+
/// The Smithy identifier, without namespace, for the type of this error, or `nil` if the
49+
/// error has no known type.
50+
public var waiterErrorType: String? {
51+
switch self {
52+
case .networkError(let error), .deserializationFailed(let error), .retryError(let error):
53+
return (error as? WaiterTypedError)?.waiterErrorType
54+
case .crtError, .pathCreationFailed, .queryItemCreationFailed, .serializationFailed,
55+
.dataNotFound, .unknownError, .authError:
56+
return nil
57+
}
58+
}
59+
}

Tests/ClientRuntimeTests/ClientRuntimeTests/NetworkingTests/ClientErrorTests.swift

Lines changed: 106 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
*/
55

66
import XCTest
7+
import AwsCommonRuntimeKit
78
@testable import ClientRuntime
89

910
class ClientErrorTests: XCTestCase {
1011

1112
func testNetworkErrorInEqualityWithoutDescription() throws {
1213
enum NetworkError: Error {
13-
case actual
14-
case expected
14+
case actual
15+
case expected
1516
}
1617
let actualNetworkError = ClientError.networkError(NetworkError.actual)
1718
let expectedNetworkError = ClientError.networkError(NetworkError.expected)
@@ -21,17 +22,17 @@ class ClientErrorTests: XCTestCase {
2122

2223
func testNetworkErrorInEqualityWithDescription() throws {
2324
enum NetworkError: Error, CustomStringConvertible {
24-
case actual
25-
case expected
26-
27-
var description: String {
28-
switch self {
29-
case .actual:
30-
return "Actual"
31-
case .expected:
32-
return "Expected"
25+
case actual
26+
case expected
27+
28+
var description: String {
29+
switch self {
30+
case .actual:
31+
return "Actual"
32+
case .expected:
33+
return "Expected"
34+
}
3335
}
34-
}
3536
}
3637

3738
let actualNetworkError = ClientError.networkError(NetworkError.actual)
@@ -42,22 +43,105 @@ class ClientErrorTests: XCTestCase {
4243

4344
func testNetworkErrorEqualityWithDescription() throws {
4445
enum NetworkError: Error, CustomStringConvertible {
45-
case actual
46-
case actualCopy
47-
48-
var description: String {
49-
switch self {
50-
case .actual:
51-
return "Actual"
52-
case .actualCopy:
53-
return "Actual"
46+
case actual
47+
case actualCopy
48+
49+
var description: String {
50+
switch self {
51+
case .actual:
52+
return "Actual"
53+
case .actualCopy:
54+
return "Actual"
55+
}
5456
}
55-
}
5657
}
5758

5859
let actualNetworkError = ClientError.networkError(NetworkError.actual)
5960
let actualCopyNetworkError = ClientError.networkError(NetworkError.actualCopy)
6061

6162
XCTAssertEqual(actualNetworkError, actualCopyNetworkError)
6263
}
64+
65+
// MARK: - WaiterTypedError protocol
66+
67+
func test_waiterErrorType_returnsErrorTypeForWaitableNetworkError() async throws {
68+
let networkError = WaitableError()
69+
let subject = ClientError.networkError(networkError)
70+
XCTAssertEqual(subject.waiterErrorType, networkError.waiterErrorType)
71+
}
72+
73+
func test_waiterErrorType_returnsNilForNonWaitableNetworkError() async throws {
74+
let networkError = NonWaitableError()
75+
let subject = ClientError.networkError(networkError)
76+
XCTAssertNil(subject.waiterErrorType)
77+
}
78+
79+
func test_waiterErrorType_returnsErrorTypeForWaitableDeserializationError() async throws {
80+
let deserializationError = WaitableError()
81+
let subject = ClientError.deserializationFailed(deserializationError)
82+
XCTAssertEqual(subject.waiterErrorType, deserializationError.waiterErrorType)
83+
}
84+
85+
func test_waiterErrorType_returnsNilForNonWaitableDeserializationError() async throws {
86+
let deserializationError = NonWaitableError()
87+
let subject = ClientError.deserializationFailed(deserializationError)
88+
XCTAssertNil(subject.waiterErrorType)
89+
}
90+
91+
func test_waiterErrorType_returnsErrorTypeForWaitableRetryError() async throws {
92+
let retryError = WaitableError()
93+
let subject = ClientError.retryError(retryError)
94+
XCTAssertEqual(subject.waiterErrorType, retryError.waiterErrorType)
95+
}
96+
97+
func test_waiterErrorType_returnsNilForNonWaitableRetryError() async throws {
98+
let retryError = NonWaitableError()
99+
let subject = ClientError.retryError(retryError)
100+
XCTAssertNil(subject.waiterErrorType)
101+
}
102+
103+
func test_waiterErrorType_returnsNilForCRTError() async throws {
104+
let crtError = CRTError(code: 2)
105+
let subject = ClientError.crtError(crtError)
106+
XCTAssertNil(subject.waiterErrorType)
107+
}
108+
109+
func test_waiterErrorType_returnsNilForPathCreationFailedError() async throws {
110+
let subject = ClientError.pathCreationFailed("path creation failed error")
111+
XCTAssertNil(subject.waiterErrorType)
112+
}
113+
114+
func test_waiterErrorType_returnsNilForQueryItemCreationFailedError() async throws {
115+
let subject = ClientError.queryItemCreationFailed("query item creation failed error")
116+
XCTAssertNil(subject.waiterErrorType)
117+
}
118+
119+
func test_waiterErrorType_returnsNilForSerializationFailedError() async throws {
120+
let subject = ClientError.serializationFailed("serialization failed error")
121+
XCTAssertNil(subject.waiterErrorType)
122+
}
123+
124+
func test_waiterErrorType_returnsNilForDataNotFoundError() async throws {
125+
let subject = ClientError.dataNotFound("data not found error")
126+
XCTAssertNil(subject.waiterErrorType)
127+
}
128+
129+
func test_waiterErrorType_returnsNilForUnknownError() async throws {
130+
let subject = ClientError.unknownError("unknown error")
131+
XCTAssertNil(subject.waiterErrorType)
132+
}
133+
134+
func test_waiterErrorType_returnsNilForAuthError() async throws {
135+
let subject = ClientError.authError("auth error")
136+
XCTAssertNil(subject.waiterErrorType)
137+
}
63138
}
139+
140+
// MARK: - Helper types
141+
142+
fileprivate struct WaitableError: WaiterTypedError {
143+
144+
public var waiterErrorType: String? { "WaitableType" }
145+
}
146+
147+
fileprivate struct NonWaitableError: Error {}

0 commit comments

Comments
 (0)