Skip to content

Commit

Permalink
Propagate updates to request auth providers to all call sites (#406)
Browse files Browse the repository at this point in the history
  • Loading branch information
julianlocke authored Mar 1, 2024
1 parent 5ed2773 commit 230d75c
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -185,15 +185,6 @@ public class DropboxTransportClientImpl: DropboxTransportClientInternal {
) {
self.filesAccess = filesAccess

let apiRequestCreation: ApiRequestCreation = { taskCreation, onTaskCreation in
RequestWithTokenRefresh(
requestCreation: taskCreation,
onTaskCreation: onTaskCreation,
authStrategy: authStrategy,
filesAccess: filesAccess
)
}

let apiRequestReconnectionCreation: ((NetworkTask) -> ApiRequest)? = { task in
RequestWithTokenRefresh(backgroundRequest: task, filesAccess: filesAccess)
}
Expand All @@ -202,7 +193,6 @@ public class DropboxTransportClientImpl: DropboxTransportClientInternal {
sessionCreation: { delegate, queue in
sessionCreation(sessionConfiguration, delegate, queue)
},
apiRequestCreation: apiRequestCreation,
apiRequestReconnectionCreation: apiRequestReconnectionCreation,
authChallengeHandler: authChallengeHandler
)
Expand All @@ -211,7 +201,6 @@ public class DropboxTransportClientImpl: DropboxTransportClientInternal {
sessionCreation: { delegate, queue in
sessionCreation(longpollSessionConfiguration, delegate, queue)
},
apiRequestCreation: apiRequestCreation,
apiRequestReconnectionCreation: nil,
authChallengeHandler: authChallengeHandler
)
Expand All @@ -232,6 +221,26 @@ public class DropboxTransportClientImpl: DropboxTransportClientInternal {
}

self.headersForRouteHost = headersForRouteHost


// below this self is initialized

let apiRequestCreation: ApiRequestCreation = { [weak self] taskCreation, onTaskCreation in
guard let self = self else {
return NoopApiRequest()
}

return RequestWithTokenRefresh(
requestCreation: taskCreation,
onTaskCreation: onTaskCreation,
authStrategy: self.authStrategy, // reference the authStrategy stored on self so updates to it are propagated.
filesAccess: filesAccess
)
}


manager.apiRequestCreation = apiRequestCreation
longpollManager.apiRequestCreation = apiRequestCreation
}

public func shutdown() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class NetworkSessionManager: NSObject {
let requestMap: RequestMap
var didFinishBackgroundEvents: (() -> Void)?

let apiRequestCreation: ApiRequestCreation
var apiRequestCreation: ApiRequestCreation?
var apiRequestReconnectionCreation: ((NetworkTask) -> ApiRequest)?

private let authChallengeHandler: AuthChallenge.Handler?
Expand All @@ -40,14 +40,12 @@ class NetworkSessionManager: NSObject {

init(
sessionCreation: (CombinedURLSessionDelegate, OperationQueue) -> NetworkSession,
apiRequestCreation: @escaping ApiRequestCreation,
apiRequestReconnectionCreation: ((NetworkTask) -> ApiRequest)?,
requestMap: RequestMap = RequestMapImpl(),
authChallengeHandler: AuthChallenge.Handler?
) {
self.session = sessionCreation(passthroughDelegate, delegateQueue)
self.requestMap = requestMap
self.apiRequestCreation = apiRequestCreation
self.apiRequestReconnectionCreation = apiRequestReconnectionCreation
self.authChallengeHandler = authChallengeHandler

Expand Down Expand Up @@ -170,7 +168,10 @@ extension NetworkSessionManager {
}
}

let apiRequest = apiRequestCreation(taskCreation, onTaskCreation)
guard let apiRequest = apiRequestCreation?(taskCreation, onTaskCreation) else {
fatalError("ApiRequestCreation missing: You must set the `apiRequestCreation` block on a NetworkSessionManager before attempting to make requests")
}

return apiRequest
}
}
Expand Down
53 changes: 53 additions & 0 deletions Source/SwiftyDropboxUnitTests/TestDropboxTransportClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,44 @@ final class TestDropboxTransportClient: XCTestCase {
XCTAssertEqual(headers["User-Agent"], "userAgent")
}

func testUpdatingTransportClientAuthProviderUpdatesRequestAuthProvider() throws {
let e = expectation(description: "Token provider is checked for refresh")

// Create a transport client with an access token
sut = DropboxTransportClientImpl(
authStrategy: .accessToken(LongLivedAccessTokenProvider(accessToken: "accessToken")),
userAgent: nil,
firstPartyUserAgent: "userAgent",
selectUser: nil,
sessionCreation: { _, _, _ in
mockNetworkSession
},
authChallengeHandler: nil
)

let mockAccessToken = MockAccessToken(expectation: e)

// Update the transport client access token to the mocked one
sut.accessTokenProvider = mockAccessToken

let concreteDropboxTransportClient = try XCTUnwrap(sut as? DropboxTransportClientImpl)
let apiRequestCreation = try XCTUnwrap(concreteDropboxTransportClient.manager.apiRequestCreation)

createApiRequest(apiRequestCreation: apiRequestCreation)

wait(for: [e], timeout: 1)

// Verify that the mock access token was in fact used
XCTAssert(mockAccessToken.refreshAccessTokenCalled)
}

private func createApiRequest(apiRequestCreation: @escaping ApiRequestCreation) {
let urlRequest = URLRequest(url: .init(string: "www.example.com")!)
let networkTaskCreation: NetworkTaskCreation = { MockNetworkTaskDelegate(request: urlRequest) }
let onCreation: OnTaskCreation = { _ in }
_ = apiRequestCreation(networkTaskCreation, onCreation)
}

private func createRequestAndReturnURLRequest<A, B, C>(for route: Route<A, B, C>) throws -> URLRequest {
let request = sut.request(route)

Expand All @@ -95,3 +133,18 @@ final class TestDropboxTransportClient: XCTestCase {
return try XCTUnwrap(maybeUrlRequest)
}
}

class MockAccessToken: AccessTokenProvider {
var accessToken: String = ""
var expectation: XCTestExpectation
var refreshAccessTokenCalled = false

init(expectation: XCTestExpectation) {
self.expectation = expectation
}

func refreshAccessTokenIfNecessary(completion: @escaping SwiftyDropbox.DropboxOAuthCompletion) {
refreshAccessTokenCalled = true
expectation.fulfill()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ final class TestNetworkSessionManager: XCTestCase {
sessionCreation: { _, _ in
self.mockNetworkSession
},
apiRequestCreation: apiRequestCreation,
apiRequestReconnectionCreation: apiRequestReconnectionCreation,
authChallengeHandler: { _ in
self.certEvaluationResult
}
)
sut.apiRequestCreation = apiRequestCreation
}

func testCreatingEachTaskTypeRegistersToRequestMap() throws {
Expand Down

0 comments on commit 230d75c

Please sign in to comment.