@@ -6,6 +6,13 @@ import OHHTTPStubs
66
77class 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+
232277private enum TestError : LocalizedError , Equatable {
233278 case postNotFound
234279 case serverFailure
0 commit comments