cc8dd1070a
- Add macOS menu-bar dictation app with local ASR models (SenseVoice/Qwen3),
global Option hotkey, and bottom overlay
- Add cloud ASR/LLM providers (Anthropic, Volcengine, Bailian, and more) with
provider logos, model listing, and connection checks
- Add shared 7-day usage stats UI (UsageStatsCluster / SevenDayUsageChart)
- Add iOS onboarding step 6 for polish LLM setup; hide custom-language-model
diagnostic toggle behind DEBUG
- Unify iOS onboarding tagline with the macOS brand line ("开口即文字。")
- Rewrite README (Chinese-first, product-oriented) and refresh GitHub Pages
71 lines
2.6 KiB
Swift
71 lines
2.6 KiB
Swift
// ConfigurationStoreTests.swift
|
|
// OSGKeyboardTests
|
|
//
|
|
// Locks `AppGroupStore` conformance to `ConfigurationStore` and ensures
|
|
// pipeline helpers accept the protocol without changing iOS behavior.
|
|
|
|
import XCTest
|
|
@testable import OSGKeyboardShared
|
|
|
|
final class ConfigurationStoreTests: XCTestCase {
|
|
private var suiteName: String!
|
|
private var defaults: UserDefaults!
|
|
private var store: AppGroupStore!
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
suiteName = "group.com.osgkeyboard.shared.tests.configuration.\(UUID().uuidString)"
|
|
defaults = UserDefaults(suiteName: suiteName)!
|
|
defaults.removePersistentDomain(forName: suiteName)
|
|
store = AppGroupStore(defaults: defaults)
|
|
}
|
|
|
|
override func tearDown() {
|
|
defaults.removePersistentDomain(forName: suiteName)
|
|
defaults = nil
|
|
store = nil
|
|
super.tearDown()
|
|
}
|
|
|
|
func testAppGroupStoreConformsToConfigurationStore() {
|
|
let configuration: any ConfigurationStore = store
|
|
XCTAssertEqual(configuration.cloudASRPersistence, defaults)
|
|
XCTAssertEqual(
|
|
PolishingService.resolvedProviderId(store: configuration, providerIdOverride: nil),
|
|
PolishingService.resolvedProviderId(store: store, providerIdOverride: nil)
|
|
)
|
|
}
|
|
|
|
func testASRFactoryAcceptsConfigurationStore() {
|
|
store.setEngineMode("local")
|
|
let service = ASRServiceFactory.make(store: store as any ConfigurationStore)
|
|
XCTAssertTrue(service is SpeechAnalyzerASR)
|
|
}
|
|
|
|
func testASRAndPolishProvidersAreIndependent() throws {
|
|
try Keychain.setAPIKey("sk-llm", for: "openai", useICloudSync: false)
|
|
try Keychain.setASRAPIKey("sk-asr", for: "zhipu", useICloudSync: false)
|
|
|
|
var config = AppGroupConfiguration.load(fromAvailable: defaults)
|
|
config.engineMode = "cloud"
|
|
config.providerId = "openai"
|
|
config.asrProviderId = "zhipu"
|
|
config.save(to: defaults)
|
|
|
|
let loaded = AppGroupStore(defaults: defaults)
|
|
XCTAssertEqual(loaded.providerId, "openai")
|
|
XCTAssertEqual(loaded.asrProviderId, "zhipu")
|
|
XCTAssertEqual(loaded.apiKey, "sk-llm")
|
|
XCTAssertEqual(loaded.asrApiKey, "sk-asr")
|
|
|
|
let asrClient = CloudASRClientFactory.make(store: loaded)
|
|
XCTAssertTrue(asrClient is ZhipuCloudASRClient)
|
|
}
|
|
|
|
func testLegacyInstallCopiesProviderIdToAsrProviderIdThenMigratesQwen() {
|
|
defaults.set("qwen", forKey: AppGroupConfiguration.Keys.providerId)
|
|
let config = AppGroupConfiguration.load(fromAvailable: defaults)
|
|
XCTAssertEqual(config.asrProviderId, "bailian")
|
|
}
|
|
}
|