Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit 62f2f23

Browse files
committed
Add unit tests for BackgroundURLSessionDelegate
1 parent 74d1b3d commit 62f2f23

File tree

1 file changed

+57
-12
lines changed

1 file changed

+57
-12
lines changed

WordPressKitTests/Utilities/URLSessionHelperTests.swift

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ import OHHTTPStubs
66

77
class URLSessionHelperTests: XCTestCase {
88

9+
var session: URLSession!
10+
11+
override func setUp() {
12+
super.setUp()
13+
session = .shared
14+
}
15+
916
override func tearDown() {
1017
super.tearDown()
1118
HTTPStubs.removeAllStubs()
@@ -16,7 +23,7 @@ class URLSessionHelperTests: XCTestCase {
1623
HTTPStubsResponse(error: URLError(.serverCertificateUntrusted))
1724
}
1825

19-
let result = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self)
26+
let result = await session.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self)
2027
do {
2128
_ = try result.get()
2229
XCTFail("The above call should throw")
@@ -32,7 +39,7 @@ class URLSessionHelperTests: XCTestCase {
3239
HTTPStubsResponse(data: "success".data(using: .utf8)!, statusCode: 200, headers: nil)
3340
}
3441

35-
let result = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self)
42+
let result = await session.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self)
3643

3744
// The result is a successful result. This line should not throw
3845
let response = try result.get()
@@ -45,7 +52,7 @@ class URLSessionHelperTests: XCTestCase {
4552
HTTPStubsResponse(data: "Internal server error".data(using: .utf8)!, statusCode: 500, headers: nil)
4653
}
4754

48-
let result = await URLSession.shared
55+
let result = await session
4956
.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self)
5057

5158
switch result {
@@ -61,7 +68,7 @@ class URLSessionHelperTests: XCTestCase {
6168
HTTPStubsResponse(data: "Not found".data(using: .utf8)!, statusCode: 404, headers: nil)
6269
}
6370

64-
let result = await URLSession.shared
71+
let result = await session
6572
.perform(
6673
request: .init(url: URL(string: "https://wordpress.org/hello")!),
6774
acceptableStatusCodes: [200...299, 400...499], errorType: TestError.self
@@ -77,7 +84,7 @@ class URLSessionHelperTests: XCTestCase {
7784
HTTPStubsResponse(data: "Not found".data(using: .utf8)!, statusCode: 404, headers: nil)
7885
}
7986

80-
let result = await URLSession.shared
87+
let result = await session
8188
.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), errorType: TestError.self)
8289
.mapUnacceptableStatusCodeError { response, _ in
8390
XCTAssertEqual(response.statusCode, 404)
@@ -100,7 +107,7 @@ class URLSessionHelperTests: XCTestCase {
100107
var title: String
101108
}
102109

103-
let result: WordPressAPIResult<Post, TestError> = await URLSession.shared
110+
let result: WordPressAPIResult<Post, TestError> = await session
104111
.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!))
105112
.decodeSuccess()
106113

@@ -116,7 +123,7 @@ class URLSessionHelperTests: XCTestCase {
116123
XCTAssertEqual(progress.completedUnitCount, 0)
117124
XCTAssertEqual(progress.fractionCompleted, 0)
118125

119-
let _ = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, errorType: TestError.self)
126+
let _ = await session.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, errorType: TestError.self)
120127
XCTAssertEqual(progress.completedUnitCount, 20)
121128
XCTAssertEqual(progress.fractionCompleted, 1)
122129
}
@@ -134,7 +141,7 @@ class URLSessionHelperTests: XCTestCase {
134141
progressReported.fulfill()
135142
}
136143

137-
let _ = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, errorType: TestError.self)
144+
let _ = await session.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, errorType: TestError.self)
138145
await fulfillment(of: [progressReported], timeout: 0.3)
139146
observer.invalidate()
140147
}
@@ -154,7 +161,7 @@ class URLSessionHelperTests: XCTestCase {
154161
}
155162

156163
// The result should be an cancellation result
157-
let result = await URLSession.shared.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, errorType: TestError.self)
164+
let result = await session.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!), fulfilling: progress, errorType: TestError.self)
158165
if case let .failure(.connection(urlError)) = result, urlError.code == .cancelled {
159166
// Do nothing
160167
} else {
@@ -167,7 +174,7 @@ class URLSessionHelperTests: XCTestCase {
167174
let builder = HTTPRequestBuilder(url: URL(string: "https://wordpress.org")!)
168175
.method(.post)
169176
.body(json: { throw underlyingError })
170-
let result = await URLSession.shared.perform(request: builder, errorType: TestError.self)
177+
let result = await session.perform(request: builder, errorType: TestError.self)
171178

172179
if case let .failure(.requestEncodingFailure(underlyingError: error)) = result {
173180
XCTAssertEqual(error as NSError, underlyingError)
@@ -185,7 +192,7 @@ class URLSessionHelperTests: XCTestCase {
185192
HTTPStubsResponse(data: "success".data(using: .utf8)!, statusCode: 200, headers: nil)
186193
}
187194

188-
let result: WordPressAPIResult<Model, TestError> = await URLSession.shared
195+
let result: WordPressAPIResult<Model, TestError> = await session
189196
.perform(request: .init(url: URL(string: "https://wordpress.org/hello")!))
190197
.decodeSuccess()
191198

@@ -207,7 +214,7 @@ class URLSessionHelperTests: XCTestCase {
207214
.method(.post)
208215
.body(form: [MultipartFormField(text: "value", name: "name", filename: nil)])
209216

210-
let _ = await URLSession.shared.perform(request: builder, errorType: TestError.self)
217+
let _ = await session.perform(request: builder, errorType: TestError.self)
211218

212219
let request = try XCTUnwrap(req)
213220
let boundary = try XCTUnwrap(
@@ -229,6 +236,44 @@ class URLSessionHelperTests: XCTestCase {
229236
}
230237
}
231238

239+
class BackgroundURLSessionHelperTests: URLSessionHelperTests {
240+
241+
// swiftlint:disable weak_delegate
242+
private var delegate: TestBackgroundURLSessionDelegate!
243+
// swiftlint:enable weak_delegate
244+
245+
override func setUp() {
246+
super.setUp()
247+
248+
delegate = TestBackgroundURLSessionDelegate()
249+
session = URLSession(configuration: .default, delegate: delegate, delegateQueue: nil)
250+
}
251+
252+
override func tearDown() {
253+
super.tearDown()
254+
255+
if delegate.startedReceivingResponse {
256+
XCTAssertTrue(delegate.completionCalled)
257+
}
258+
}
259+
260+
}
261+
262+
private class TestBackgroundURLSessionDelegate: BackgroundURLSessionDelegate {
263+
var startedReceivingResponse = false
264+
var completionCalled = false
265+
266+
override func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
267+
startedReceivingResponse = true
268+
super.urlSession(session, dataTask: dataTask, didReceive: data)
269+
}
270+
271+
override func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
272+
completionCalled = true
273+
super.urlSession(session, task: task, didCompleteWithError: error)
274+
}
275+
}
276+
232277
private enum TestError: LocalizedError, Equatable {
233278
case postNotFound
234279
case serverFailure

0 commit comments

Comments
 (0)