83 lines
3.6 KiB
Swift
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
|
|
}
|
|
}
|