Skip to content

Commit df92adc

Browse files
committed
Improve Tests for NetworkTask, DataTask & DownloadTask
1 parent 65043bb commit df92adc

File tree

3 files changed

+259
-136
lines changed

3 files changed

+259
-136
lines changed

Tests/NetworkingClientTests/Tasks/DataTaskTests.swift

Lines changed: 84 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

114179
extension 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
}

Tests/NetworkingClientTests/Tasks/DonwloadTaskTests.swift

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,14 @@ struct DownloadTaskTests {
7474
let task = session.downloadTask(TestRequest())
7575

7676
Task {
77-
try await Task.sleep(nanoseconds: 1_000_000_000)
77+
try await Task.sleep(nanoseconds: 1_000_000_00)
7878
for update in expectedUpdates {
7979
await task._session(
8080
didWriteData: 2,
8181
totalBytesWritten: Int64(update * 10),
8282
totalBytesExpectedToWrite: 10
8383
)
84-
try await Task.sleep(nanoseconds: 100_000_000)
84+
try await Task.sleep(nanoseconds: 1_000_000_00)
8585
}
8686
await task._finished(with: nil)
8787
}
@@ -122,7 +122,7 @@ struct DownloadTaskTests {
122122
let task = session.downloadTask(TestRequest())
123123

124124
Task {
125-
try await Task.sleep(nanoseconds: 1_000_000_000)
125+
try await Task.sleep(nanoseconds: 1_000_000_00)
126126
await task._session(
127127
didWriteData: 0,
128128
totalBytesWritten: 0,
@@ -141,7 +141,7 @@ struct DownloadTaskTests {
141141
let task = session.downloadTask(TestRequest())
142142

143143
Task {
144-
try await Task.sleep(nanoseconds: 1_000_000_000)
144+
try await Task.sleep(nanoseconds: 1_000_000_00)
145145
await task._session(
146146
didResumeAtOffset: 0,
147147
expectedTotalBytes: 0
@@ -155,4 +155,54 @@ struct DownloadTaskTests {
155155
}
156156
}
157157
}
158+
159+
@Test func urlSessionTaskGetsCancelledWhenCancellingTask() async throws {
160+
let requestID = "expect-cancellation-error"
161+
let request = TestRequest()
162+
.testID(requestID)
163+
164+
await MockURLProtocol.setResult(
165+
(4_000_000_000, .failure(MockURLError.errorMock)),
166+
for: requestID
167+
)
168+
let task = ErrorExtractingDownloadTask(
169+
request: AnyRequest(request),
170+
session: session
171+
)
172+
task._accept(session.configurations)
173+
174+
Task {
175+
try await Task.sleep(nanoseconds: 1_000_000_00)
176+
await task.cancel()
177+
}
178+
179+
_ = try? await task.response()
180+
let networkingError = try #require(task.error)
181+
182+
var foundCorrectError = false
183+
if case NetworkingError.custom(let error) = networkingError,
184+
let clientError = error as? ClientError,
185+
case ClientError.urlError(let urlError) = clientError {
186+
foundCorrectError = urlError.code == .cancelled
187+
}
188+
#expect(foundCorrectError, "Found error \(String(describing: networkingError))")
189+
}
190+
}
191+
192+
extension DownloadTaskTests {
193+
class ErrorExtractingDownloadTask: DownloadTask, @unchecked Sendable {
194+
var error: NetworkingError?
195+
196+
open override func _execute(
197+
_ urlRequest: borrowing URLRequest,
198+
session: Session
199+
) async throws(NetworkingError) -> DownloadResponse {
200+
do {
201+
return try await super._execute(urlRequest, session: session)
202+
}catch {
203+
self.error = error
204+
throw error
205+
}
206+
}
207+
}
158208
}

0 commit comments

Comments
 (0)