Skip to content

Commit bb81fdc

Browse files
committed
added unauthorized notification to manager
Signed-off-by: James Hall <james.hall@vmlyr.com>
1 parent b1f8d6a commit bb81fdc

File tree

5 files changed

+44
-2
lines changed

5 files changed

+44
-2
lines changed

Sources/WebRequest/Manager/WebRequestManager.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
import Foundation
22

3+
internal protocol WRNotificationCenterInterface {
4+
func post(_ notification: Notification)
5+
}
6+
extension NotificationCenter: WRNotificationCenterInterface {}
7+
38
public class WebRequestManager: WebRequestManaging {
49

5-
typealias ErrorCode = WebRequest.Result.ErrorCode
10+
public typealias ErrorCode = WebRequest.Result.ErrorCode
11+
12+
internal var UnauthorizedResponseNotification: Notification {
13+
return Notification(name: WebRequestUnauthorizedResponseNotification, object: nil, userInfo: nil)
14+
}
615

716
private let accessQueue: DispatchQueue = DispatchQueue(label: "WebRequestQueue.accessQueue",
817
qos: .background,
@@ -32,6 +41,8 @@ public class WebRequestManager: WebRequestManaging {
3241

3342
public var applySession: SessionApplier!
3443

44+
internal lazy var notificationCenter: WRNotificationCenterInterface = NotificationCenter.default
45+
3546
public static let shared = WebRequestManager()
3647

3748
private init() { /**/ }
@@ -119,6 +130,7 @@ private extension WebRequestManager {
119130
.filter { $0.state == .ready || $0.state == .unauthorized }
120131

121132
guard let session = self.sessionProvider?.current else {
133+
notificationCenter.post(UnauthorizedResponseNotification)
122134
if let anyRequest = readyRequests.first?.originalRequest {
123135
self.fail(request: anyRequest, withStatus: 401)
124136
}
@@ -148,6 +160,10 @@ private extension WebRequestManager {
148160
return
149161
}
150162

163+
if wrapper.state == .unauthorized {
164+
notificationCenter.post(UnauthorizedResponseNotification)
165+
}
166+
151167
try wrapper.originalRequest.completion?(actualResult, wrapper.originalRequest)
152168
}
153169

Sources/WebRequest/Manager/WebRequestManaging.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import Foundation
22

3+
public let WebRequestUnauthorizedResponseNotification: Notification.Name = Notification.Name("UnauthorizedResponseNotification")
4+
35
public protocol WebRequestManaging {
46

57
typealias SessionApplier = (WebRequest, WebRequestSession) -> (WebRequest)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import Foundation
2+
@testable import WebRequest
3+
4+
class MockNotificationCenter: WRNotificationCenterInterface {
5+
6+
var didPost: Bool = false
7+
var postedNotificationName: Notification.Name? = nil
8+
9+
func post(_ notification: Notification) {
10+
didPost = true
11+
postedNotificationName = notification.name
12+
}
13+
}

Tests/WebRequestTests/Manager/WebRequestManagerTests.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class WebRequestManagerTests: XCTestCase {
66
var subject: WebRequestManager!
77
var mockSessionProvider: MockWebRequestSessionProvider!
88
var mockApplySession: WebRequestManaging.SessionApplier!
9+
var mockNotificationCenter: MockNotificationCenter!
910

1011
var capturedRequest: WebRequest?
1112
var capturedSession: WebRequestSession?
@@ -27,6 +28,8 @@ class WebRequestManagerTests: XCTestCase {
2728
subject = WebRequestManager(sessionProvider: mockSessionProvider,
2829
applySession: mockApplySession)
2930

31+
mockNotificationCenter = MockNotificationCenter()
32+
subject.notificationCenter = mockNotificationCenter
3033
}
3134

3235
func test_begin_request_with_current_session_should_complete() {
@@ -119,9 +122,11 @@ class WebRequestManagerTests: XCTestCase {
119122

120123
XCTAssertFalse(mockDelivery.didCall_deliver)
121124
XCTAssert(receivedResult!.status == StatusCode.unauthorized.rawValue)
125+
XCTAssertTrue(mockNotificationCenter.didPost)
126+
XCTAssertEqual(mockNotificationCenter.postedNotificationName, WebRequestUnauthorizedResponseNotification)
122127
}
123128

124-
func test_begin_request_when_getting_unauthorized_result_should_attempt_refresh_once_and_raise_401_if_call_fails_again() {
129+
func test_begin_request_when_getting_unauthorized_result_should_attempt_refresh_once_then_raise_401_and_post_notification_if_call_fails_again() {
125130
var receivedResult: WebRequest.Result? = nil
126131
let expectComplete = expectation(description: "should refresh")
127132

@@ -147,5 +152,7 @@ class WebRequestManagerTests: XCTestCase {
147152
XCTAssertTrue(mockDelivery.didCall_deliver)
148153
XCTAssertEqual(mockSessionProvider.timesCalled_refresh, 1)
149154
XCTAssert(receivedResult!.status == StatusCode.unauthorized.rawValue)
155+
XCTAssertTrue(mockNotificationCenter.didPost)
156+
XCTAssertEqual(mockNotificationCenter.postedNotificationName, WebRequestUnauthorizedResponseNotification)
150157
}
151158
}

WebRequest.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
DC8F2B6F223359D400277F70 /* HTTPWebRequestDelivery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB68C6E2022EC9E00973778 /* HTTPWebRequestDelivery.swift */; };
1919
DC8F2B70223359D400277F70 /* JSONWebRequestDelivery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB68C6F2022EC9E00973778 /* JSONWebRequestDelivery.swift */; };
2020
DC8F2B71223359D400277F70 /* MultipartFormUploadWebRequestDelivery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB68C702022EC9E00973778 /* MultipartFormUploadWebRequestDelivery.swift */; };
21+
DCAAB91323676AB4000B3463 /* MockNotificationCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCAAB91223676AB4000B3463 /* MockNotificationCenter.swift */; };
2122
DCB68C5E2022CCE500973778 /* WebRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB68C5D2022CCE500973778 /* WebRequestTests.swift */; };
2223
DCB68C6B2022CE6800973778 /* TestHTTPServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB68C6A2022CE6800973778 /* TestHTTPServer.swift */; };
2324
DCB68C802022EDD300973778 /* MockWebRequestDelivery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB68C7B2022ED2200973778 /* MockWebRequestDelivery.swift */; };
@@ -64,6 +65,7 @@
6465
DC0B165C2270BDA9000DA8E8 /* WebRequest+Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WebRequest+Result.swift"; sourceTree = "<group>"; };
6566
DC0B165E2270C43B000DA8E8 /* WebRequestEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebRequestEndpoint.swift; sourceTree = "<group>"; };
6667
DC8F2B61223358CD00277F70 /* libWebRequest-iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libWebRequest-iOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
68+
DCAAB91223676AB4000B3463 /* MockNotificationCenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockNotificationCenter.swift; sourceTree = "<group>"; };
6769
DCB68C532022CCE500973778 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
6870
DCB68C582022CCE500973778 /* WebRequestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebRequestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
6971
DCB68C5D2022CCE500973778 /* WebRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebRequestTests.swift; sourceTree = "<group>"; };
@@ -210,6 +212,7 @@
210212
isa = PBXGroup;
211213
children = (
212214
DCB68C852022FA8500973778 /* MockEndpoint.swift */,
215+
DCAAB91223676AB4000B3463 /* MockNotificationCenter.swift */,
213216
DCB68C7A2022ED2200973778 /* MockURLSession.swift */,
214217
DCB68C7B2022ED2200973778 /* MockWebRequestDelivery.swift */,
215218
DCBC7BA4230E346A002FBF61 /* MockWebRequestSession.swift */,
@@ -387,6 +390,7 @@
387390
buildActionMask = 2147483647;
388391
files = (
389392
DCBC7BA3230E2CB1002FBF61 /* MockWebRequestSessionProvider.swift in Sources */,
393+
DCAAB91323676AB4000B3463 /* MockNotificationCenter.swift in Sources */,
390394
DCBC7B94230C7BEE002FBF61 /* BasicHTTPResultValidatorTests.swift in Sources */,
391395
DCB68C812022EDD700973778 /* MockURLSession.swift in Sources */,
392396
DCB68C802022EDD300973778 /* MockWebRequestDelivery.swift in Sources */,

0 commit comments

Comments
 (0)