test(ios): add smoke coverage tests

This commit is contained in:
Peter Steinberger
2025-12-14 03:25:49 +00:00
parent a5b3b8743a
commit eec6212cdf
3 changed files with 92 additions and 2 deletions

View File

@@ -15,7 +15,7 @@ final class BridgeConnectionController: ObservableObject {
private var didAutoConnect = false
private var seenStableIDs = Set<String>()
init(appModel: NodeAppModel) {
init(appModel: NodeAppModel, startDiscovery: Bool = true) {
self.appModel = appModel
BridgeSettingsStore.bootstrapPersistence()
@@ -32,7 +32,9 @@ final class BridgeConnectionController: ObservableObject {
self.discovery.$statusText
.assign(to: &self.$discoveryStatusText)
self.discovery.start()
if startDiscovery {
self.discovery.start()
}
}
func setScenePhase(_ phase: ScenePhase) {

View File

@@ -0,0 +1,34 @@
import Testing
@testable import Clawdis
@Suite struct IOSBridgeChatTransportTests {
@Test func requestsFailFastWhenBridgeNotConnected() async {
let bridge = BridgeSession()
let transport = IOSBridgeChatTransport(bridge: bridge)
do {
try await transport.setActiveSessionKey("node-test")
Issue.record("Expected setActiveSessionKey to throw when bridge not connected")
} catch {}
do {
_ = try await transport.requestHistory(sessionKey: "node-test")
Issue.record("Expected requestHistory to throw when bridge not connected")
} catch {}
do {
_ = try await transport.sendMessage(
sessionKey: "node-test",
message: "hello",
thinking: "low",
idempotencyKey: "idempotency",
attachments: [])
Issue.record("Expected sendMessage to throw when bridge not connected")
} catch {}
do {
_ = try await transport.requestHealth(timeoutMs: 250)
} catch {}
}
}

View File

@@ -0,0 +1,54 @@
import SwiftUI
import Testing
import UIKit
@testable import Clawdis
@Suite struct SwiftUIRenderSmokeTests {
@MainActor private static func host<V: View>(_ view: V) -> UIWindow {
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = UIHostingController(rootView: view)
window.makeKeyAndVisible()
window.rootViewController?.view.setNeedsLayout()
window.rootViewController?.view.layoutIfNeeded()
return window
}
@Test @MainActor func settingsTabBuildsAViewHierarchy() {
let appModel = NodeAppModel()
let bridgeController = BridgeConnectionController(appModel: appModel, startDiscovery: false)
let root = SettingsTab()
.environmentObject(appModel)
.environmentObject(appModel.voiceWake)
.environmentObject(bridgeController)
_ = Self.host(root)
}
@Test @MainActor func rootTabsBuildAViewHierarchy() {
let appModel = NodeAppModel()
let bridgeController = BridgeConnectionController(appModel: appModel, startDiscovery: false)
let root = RootTabs()
.environmentObject(appModel)
.environmentObject(appModel.voiceWake)
.environmentObject(bridgeController)
_ = Self.host(root)
}
@Test @MainActor func voiceTabBuildsAViewHierarchy() {
let appModel = NodeAppModel()
let root = VoiceTab()
.environmentObject(appModel)
.environmentObject(appModel.voiceWake)
_ = Self.host(root)
}
@Test @MainActor func voiceWakeWordsViewBuildsAViewHierarchy() {
let root = NavigationStack { VoiceWakeWordsSettingsView() }
_ = Self.host(root)
}
}