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

83 lines
3.6 KiB
Swift

import Foundation
import Testing
@testable import CodexBarCore
@Suite(.serialized)
struct VertexAIOAuthCredentialsTests {
@Test
func `service account credentials from GOOGLE_APPLICATION_CREDENTIALS use gcloud token`() async throws {
let fileURL = try Self.writeServiceAccountCredentials()
defer { try? FileManager.default.removeItem(at: fileURL.deletingLastPathComponent()) }
let env = ["GOOGLE_APPLICATION_CREDENTIALS": fileURL.path]
#expect(VertexAIOAuthCredentialsStore.hasCredentials(environment: env))
let override: @Sendable ([String: String]) async throws -> String = { environment in
#expect(environment["GOOGLE_APPLICATION_CREDENTIALS"] == fileURL.path)
return "ya29.service-account\n"
}
let credentials = try await VertexAIOAuthCredentialsStore.$gcloudAccessTokenOverrideForTesting.withValue(
override)
{
try await VertexAIOAuthCredentialsStore.loadForFetch(environment: env)
}
#expect(credentials.accessToken == "ya29.service-account")
#expect(credentials.projectId == "service-project")
#expect(credentials.email == "codexbar@test.iam.gserviceaccount.com")
#expect(!credentials.needsRefresh)
}
@Test
func `user ADC credentials still parse from CLOUDSDK_CONFIG`() throws {
let configDir = FileManager.default.temporaryDirectory
.appendingPathComponent("codexbar-vertex-\(UUID().uuidString)", isDirectory: true)
try FileManager.default.createDirectory(at: configDir, withIntermediateDirectories: true)
defer { try? FileManager.default.removeItem(at: configDir) }
let credentialsURL = configDir.appendingPathComponent("application_default_credentials.json")
let credentialsJSON = """
{
"client_id": "client-id",
"client_secret": "client-secret",
"refresh_token": "refresh-token"
}
"""
try credentialsJSON.write(to: credentialsURL, atomically: true, encoding: .utf8)
let configurationsDir = configDir
.appendingPathComponent("configurations", isDirectory: true)
try FileManager.default.createDirectory(at: configurationsDir, withIntermediateDirectories: true)
try "project = configured-project\n".write(
to: configurationsDir.appendingPathComponent("config_default"),
atomically: true,
encoding: .utf8)
let env = ["CLOUDSDK_CONFIG": configDir.path]
let credentials = try VertexAIOAuthCredentialsStore.load(environment: env)
#expect(credentials.refreshToken == "refresh-token")
#expect(credentials.projectId == "configured-project")
}
private static func writeServiceAccountCredentials() throws -> URL {
let directory = FileManager.default.temporaryDirectory
.appendingPathComponent("codexbar-vertex-\(UUID().uuidString)", isDirectory: true)
try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)
let fileURL = directory.appendingPathComponent("service-account.json")
let json = """
{
"type": "service_account",
"project_id": "service-project",
"private_key_id": "key-id",
"private_key": "-----BEGIN PRIVATE KEY-----\\nabc\\n-----END PRIVATE KEY-----\\n",
"client_email": "codexbar@test.iam.gserviceaccount.com",
"client_id": "1234567890",
"token_uri": "https://oauth2.googleapis.com/token"
}
"""
try json.write(to: fileURL, atomically: true, encoding: .utf8)
return fileURL
}
}