@@ -20,15 +20,14 @@ struct DataTaskTests {
2020 }
2121
2222// MARK: - Tests
23- @Test func executingDataTaskReturnsDataAndResponseOnSuccess ( ) async throws {
23+ @Test func executingDataTaskReturnsDataOnSuccess ( ) async throws {
2424 let requestID = " data-task-success "
2525 let request = TestRequest ( )
2626 . testID ( requestID)
2727
2828 let string = " Hello, this is a data test. "
29- let expectedStatus = ResponseStatus . ok
3029 await MockURLProtocol . setResult (
31- . success( ( string. data ( using: . utf8) !, expectedStatus ) ) ,
30+ . success( ( string. data ( using: . utf8) !, . ok ) ) ,
3231 for: requestID
3332 )
3433
@@ -39,7 +38,21 @@ struct DataTaskTests {
3938
4039 let decoded = String ( data: response. data, encoding: . utf8)
4140 #expect( decoded == string)
42- #expect( response. response. status == expectedStatus)
41+ }
42+
43+ @Test ( arguments: [ ResponseStatus . accepted, ResponseStatus . badRequest] )
44+ func executingDataTaskReturnsResponseOnSuccess( expectedStatus: ResponseStatus ) async throws {
45+ let requestID = " expect-status \( expectedStatus. rawValue) "
46+ let request = TestRequest ( )
47+ . testID ( requestID)
48+
49+ let response = ( Data ( ) , expectedStatus)
50+ await MockURLProtocol . setResult ( . success( response) , for: requestID)
51+
52+ let status = try await session. dataTask ( request)
53+ . response ( )
54+ . 1 . status
55+ #expect( status == expectedStatus)
4356 }
4457
4558 @Test func dataTaskResponseDecoding( ) async throws {
@@ -85,6 +98,29 @@ struct DataTaskTests {
8598 #expect( object == expectedObject)
8699 }
87100
101+ @Test func dataTaskResponseDecodingThrowsErrorOnDecodeFailure( ) async throws {
102+ let requestID = " data-task-decoding-error "
103+ let request = TestRequest ( )
104+ . testID ( requestID)
105+
106+ let data = try JSONEncoder ( ) . encode ( TestCodable ( ) )
107+ await MockURLProtocol . setResult (
108+ . success( ( data, . ok) ) ,
109+ for: requestID
110+ )
111+
112+ let networkingError = try await #require( throws: NetworkingError . self) {
113+ _ = try await session
114+ . dataTask ( request)
115+ . decode ( as: String . self)
116+ }
117+ var foundCorrectError = false
118+ if case NetworkingError . decoding = networkingError {
119+ foundCorrectError = true
120+ }
121+ #expect( foundCorrectError, " Found error \( String ( describing: networkingError) ) " )
122+ }
123+
88124 @Test func executingDataTaskThrowsErrorOnFailure( ) async throws {
89125 let requestID = " data-task-failure "
90126 let request = TestRequest ( )
@@ -109,10 +145,54 @@ struct DataTaskTests {
109145 }
110146 #expect( foundCorrectError, " Found error \( String ( describing: networkingError) ) " )
111147 }
148+
149+ @Test func urlSessionTaskGetsCancelledWhenCancellingTask( ) async throws {
150+ let requestID = " expect-cancellation-error "
151+ let request = TestRequest ( )
152+ . testID ( requestID)
153+
154+ await MockURLProtocol . setResult (
155+ ( 4_000_000_000 , . failure( MockURLError . errorMock) ) ,
156+ for: requestID
157+ )
158+ let task = ErrorExtractingDataTask ( request: AnyRequest ( request) , session: session)
159+ task. _accept ( session. configurations)
160+
161+ Task {
162+ try await Task . sleep ( nanoseconds: 1_000_000_000 )
163+ await task. cancel ( )
164+ }
165+
166+ _ = try ? await task. response ( )
167+ let networkingError = try #require( task. error)
168+
169+ var foundCorrectError = false
170+ if case NetworkingError . custom( let error) = networkingError,
171+ let clientError = error as? ClientError ,
172+ case ClientError . urlError( let urlError) = clientError {
173+ foundCorrectError = urlError. code == . cancelled
174+ }
175+ #expect( foundCorrectError, " Found error \( String ( describing: networkingError) ) " )
176+ }
112177}
113178
114179extension DataTaskTests {
115180 struct TestCodable : Codable , Equatable {
116181 var someId = UUID ( )
117182 }
183+ class ErrorExtractingDataTask : DataTask , @unchecked Sendable {
184+ var error : NetworkingError ?
185+
186+ open override func _execute(
187+ _ urlRequest: borrowing URLRequest ,
188+ session: Session
189+ ) async throws ( NetworkingError) -> DataResponse {
190+ do {
191+ return try await super. _execute ( urlRequest, session: session)
192+ } catch {
193+ self . error = error
194+ throw error
195+ }
196+ }
197+ }
118198}
0 commit comments