93 lines · 3.5 KB · Swift
RawDownload
import Foundationimport 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)    }}