Support token providers in Bearer Auth middleware.
This commit is contained in:
1 parent
2c0c050e30
commit
d5035f9a3a
4 files changed
+109
-11
No files matched your search
@@ -3,7 +3,8 @@ import HTTPTypes
|
||||
import OpenAPIRuntime
|
||||
import Testing
|
||||
|
||||
@testable import ASConnectService
|
||||
// A non-testable import ensures that the middleware can be created from outside the module.
|
||||
import ASConnectService
|
||||
|
||||
@Suite("BearerAuthMiddleware")
|
||||
struct BearerAuthMiddlewareTests {
|
||||
@@ -112,6 +113,67 @@ struct BearerAuthMiddlewareTests {
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Test("Asks the token provider for a token on every request")
|
||||
func asksTokenProviderOnEveryRequest() async throws {
|
||||
let tokens = TokenSequence()
|
||||
let middleware = BearerAuthMiddleware {
|
||||
await tokens.next()
|
||||
}
|
||||
|
||||
for expectedToken in ["token-1", "token-2"] {
|
||||
_ = try await middleware.intercept(
|
||||
.get,
|
||||
body: nil,
|
||||
baseURL: .base,
|
||||
operationID: "listApps",
|
||||
next: { interceptedRequest, _, _ in
|
||||
#expect(interceptedRequest.headerFields[.authorization] == "Bearer \(expectedToken)")
|
||||
|
||||
return (HTTPResponse(status: .ok), nil)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Rethrows the token provider error without calling the next handler")
|
||||
func rethrowsTokenProviderError() async throws {
|
||||
let middleware = BearerAuthMiddleware {
|
||||
throw TokenError.expired
|
||||
}
|
||||
|
||||
await #expect(throws: TokenError.expired) {
|
||||
_ = try await middleware.intercept(
|
||||
.get,
|
||||
body: nil,
|
||||
baseURL: .base,
|
||||
operationID: "listApps",
|
||||
next: { _, _, _ in
|
||||
Issue.record("The next handler should not be called when the token provider throws")
|
||||
|
||||
return (HTTPResponse(status: .ok), nil)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Helpers
|
||||
|
||||
/// An actor that returns a new token every time it is asked for one.
|
||||
private actor TokenSequence {
|
||||
private var count = 0
|
||||
|
||||
func next() -> String {
|
||||
count += 1
|
||||
|
||||
return "token-\(count)"
|
||||
}
|
||||
}
|
||||
|
||||
/// An error thrown by a token provider.
|
||||
private enum TokenError: Error {
|
||||
case expired
|
||||
}
|
||||
|
||||
// MARK: - HTTPRequest+Samples
|
||||
|
||||
Reference in new issue
Block a user