94 lines
3.5 KiB
Swift
94 lines
3.5 KiB
Swift
import Foundation
|
|
import Testing
|
|
@testable import CodexBarCore
|
|
|
|
@Suite(.serialized)
|
|
struct BedrockProfileCredentialProviderTests {
|
|
private func provider(
|
|
stdout: String = "",
|
|
stderr: String = "",
|
|
throwsNonZero: Bool = false) -> BedrockProfileCredentialProvider
|
|
{
|
|
BedrockProfileCredentialProvider(awsBinaryPath: "/usr/bin/aws") { _, _ in
|
|
if throwsNonZero {
|
|
throw SubprocessRunnerError.nonZeroExit(code: 1, stderr: stderr)
|
|
}
|
|
return SubprocessResult(stdout: stdout, stderr: stderr)
|
|
}
|
|
}
|
|
|
|
@Test
|
|
func `parses export-credentials json with session token`() async throws {
|
|
let json = """
|
|
{"Version":1,"AccessKeyId":"AKIA","SecretAccessKey":"secret",\
|
|
"SessionToken":"token","Expiration":"2026-05-27T12:00:00Z"}
|
|
"""
|
|
let creds = try await provider(stdout: json).exportCredentials(profile: "work")
|
|
#expect(creds.accessKeyID == "AKIA")
|
|
#expect(creds.secretAccessKey == "secret")
|
|
#expect(creds.sessionToken == "token")
|
|
}
|
|
|
|
@Test
|
|
func `parses export-credentials json without session token`() async throws {
|
|
let json = #"{"Version":1,"AccessKeyId":"AKIA","SecretAccessKey":"secret"}"#
|
|
let creds = try await provider(stdout: json).exportCredentials(profile: "work")
|
|
#expect(creds.accessKeyID == "AKIA")
|
|
#expect(creds.sessionToken == nil)
|
|
}
|
|
|
|
@Test
|
|
func `maps expired SSO stderr to profileSessionExpired`() async {
|
|
let stderr = "The SSO session associated with this profile has expired. " +
|
|
"To refresh this SSO session run aws sso login with the corresponding profile."
|
|
let sut = self.provider(stderr: stderr, throwsNonZero: true)
|
|
await #expect(throws: BedrockUsageError.profileSessionExpired("work")) {
|
|
try await sut.exportCredentials(profile: "work")
|
|
}
|
|
}
|
|
|
|
@Test
|
|
func `maps other non-zero exit to apiError`() async {
|
|
let sut = self.provider(stderr: "The config profile (work) could not be found", throwsNonZero: true)
|
|
do {
|
|
_ = try await sut.exportCredentials(profile: "work")
|
|
Issue.record("expected an error")
|
|
} catch let error as BedrockUsageError {
|
|
if case .apiError = error { } else { Issue.record("expected apiError, got \(error)") }
|
|
} catch {
|
|
Issue.record("unexpected error type: \(error)")
|
|
}
|
|
}
|
|
|
|
@Test
|
|
func `malformed json throws parseFailed`() async {
|
|
let sut = self.provider(stdout: "not json")
|
|
do {
|
|
_ = try await sut.exportCredentials(profile: "work")
|
|
Issue.record("expected an error")
|
|
} catch let error as BedrockUsageError {
|
|
if case .parseFailed = error { } else { Issue.record("expected parseFailed, got \(error)") }
|
|
} catch {
|
|
Issue.record("unexpected error type: \(error)")
|
|
}
|
|
}
|
|
|
|
@Test
|
|
func `resolveRegion returns trimmed value`() async throws {
|
|
let region = try await provider(stdout: "eu-west-1\n").resolveRegion(profile: "work")
|
|
#expect(region == "eu-west-1")
|
|
}
|
|
|
|
@Test
|
|
func `resolveRegion returns nil when unset (non-zero exit)`() async throws {
|
|
let region = try await provider(throwsNonZero: true).resolveRegion(profile: "work")
|
|
#expect(region == nil)
|
|
}
|
|
|
|
@Test
|
|
func `resolveRegion returns nil for empty output`() async throws {
|
|
let region = try await provider(stdout: "\n").resolveRegion(profile: "work")
|
|
#expect(region == nil)
|
|
}
|
|
}
|