Files
hyungi_document_server/clients/ds-app/Tests/AITests/SpecializedProviderTests.swift
T

40 lines
1.7 KiB
Swift

import XCTest
@testable import AIFabric
final class SpecializedProviderTests: XCTestCase {
func testScaffoldUnavailableAndNotImplemented() async throws {
let p = SpecializedProvider()
let available = await p.isAvailable
XCTAssertFalse(available)
do {
_ = try await p.complete(AICompletionRequest(task: .vision, prompt: "p"))
XCTFail("scaffold must throw notImplemented")
} catch let AIProviderError.notImplemented(id) {
XCTAssertEqual(id, .specialized)
}
}
/// .vision [.specialized, .onDevice] specialized · onDevice **** ( log).
/// (onDevice providerUsed=id CountingProvider MockAIProvider vision
/// providerUsed .specialized .)
func testVisionFallsBackToOnDeviceVisibly() async throws {
let sink = LogSink()
let onDevice = CountingProvider(id: .onDevice, available: true)
let router = AIRouter(
providers: [
.specialized: SpecializedProvider(),
.onDevice: onDevice,
],
log: { sink.append($0) }
)
let resp = try await router.route(AICompletionRequest(task: .vision, prompt: "도면 보기"))
XCTAssertEqual(resp.providerUsed, .onDevice)
XCTAssertEqual(resp.routingNote, "fallback from specialized → onDevice")
let calls = await onDevice.completeCalls
XCTAssertEqual(calls, 1)
XCTAssertTrue(sink.lines.contains { $0.contains("specialized") && $0.contains("unavailable") },
"specialized 불가가 침묵 아닌 log 로 가시화")
}
}