69 lines
3.4 KiB
Swift
69 lines
3.4 KiB
Swift
// SPDX-FileCopyrightText: 2026 Kaede Akino
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
import AgentKit
|
|
import Foundation
|
|
import TermindApplication
|
|
import TermindDomain
|
|
import Testing
|
|
|
|
@Suite @MainActor
|
|
struct ModelProviderFormTests {
|
|
@Test(arguments: ModelAPIType.allCases)
|
|
func emptyInputsSaveConcreteDefaultsWithoutChangingTheDraft(_ type: ModelAPIType) {
|
|
let draft = ModelProvider(name: " \n")
|
|
let endpoint = ProviderEndpoint(apiType: type, url: " \n")
|
|
let ai = AIConfigurationModel(persistsSecrets: false)
|
|
#expect(ai.saveProvider(draft, endpoint: endpoint))
|
|
let stored = ai.modelProvider(draft.id)
|
|
#expect(stored?.name == type.defaultProviderName)
|
|
#expect(ai.endpoint(for: draft.id).url == type.defaultURL)
|
|
#expect(stored?.inferenceURL == ProviderEndpoint(apiType: type, url: type.defaultURL).requestURL)
|
|
#expect(endpoint.url == " \n")
|
|
#expect(draft.name == " \n")
|
|
}
|
|
|
|
@Test func automaticUsesResponsesOnlyForAnEmptyFormURL() {
|
|
let empty = ModelProviderForm.normalized(ModelProvider(name: ""), endpoint: .init())
|
|
#expect(empty.provider.name == "OpenAI")
|
|
#expect(empty.provider.apiFormat == .responses)
|
|
#expect(empty.endpoint.url == "https://api.openai.com/v1/responses")
|
|
#expect(empty.provider.resolvedModelsURL == "https://api.openai.com/v1/models")
|
|
#expect(ProviderEndpoint().requestURL.isEmpty)
|
|
#expect(ProviderEndpoint(url: "https://local.test/v1").format == .chatCompletions)
|
|
}
|
|
|
|
@Test func explicitValuesAreNeverReplacedEvenWhenTheyMatchAnotherDefault() {
|
|
let value = ModelProviderForm.normalized(
|
|
ModelProvider(name: "OpenAI"),
|
|
endpoint: .init(apiType: .messages, url: ModelAPIType.automatic.defaultURL))
|
|
#expect(value.provider.name == "OpenAI")
|
|
#expect(value.provider.apiFormat == .messages)
|
|
#expect(value.endpoint.url == ModelAPIType.automatic.defaultURL)
|
|
let bad = ModelProviderForm.normalized(ModelProvider(name: "Private"), endpoint: .init(url: "bad URL"))
|
|
#expect(!ModelProviderForm.hasValidAddress(bad.provider))
|
|
#expect(bad.endpoint.url == "bad URL")
|
|
}
|
|
|
|
@Test func vertexNormalizesLocationAndKeepsItsSeparateDestination() {
|
|
var provider = ModelProvider(name: "", usesVertex: true)
|
|
provider.vertex = VertexConfig(projectID: "project", location: " ", credentialRef: "account")
|
|
let value = ModelProviderForm.normalized(provider, endpoint: .init(apiType: .generateContent))
|
|
#expect(value.provider.name == "Google")
|
|
#expect(value.provider.vertex.location == "global")
|
|
#expect(ModelProviderForm.hasValidAddress(value.provider))
|
|
#expect(
|
|
value.provider.requestURL()
|
|
== "https://aiplatform.googleapis.com/v1/projects/project/locations/global/publishers/google/models/{model}:generateContent"
|
|
)
|
|
#expect(!value.provider.canFetchModels)
|
|
let switched = ModelProviderForm.normalized(provider, endpoint: .init(apiType: .messages)).provider
|
|
#expect(!switched.usesVertex)
|
|
#expect(switched.vertex.credentialRef == "account")
|
|
provider.vertex.projectID = "project/escape"
|
|
#expect(
|
|
!ModelProviderForm.hasValidAddress(
|
|
ModelProviderForm.normalized(provider, endpoint: .init(apiType: .generateContent)).provider))
|
|
}
|
|
}
|