Files
steipete--codexbar/Tests/CodexBarTests/BedrockProfileCredentialProviderTests.swift
2026-07-13 12:22:33 +08:00

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)
}
}