mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-01 11:03:32 +00:00
Summary: - Replace the legacy iOS shell with Pro Command, Chat, Agents, and Settings tabs. - Wire iOS chat/session/settings/diagnostics and realtime Talk flows through gateway-backed APIs. - Add gateway/session and shared chat coverage for the new iOS flow. Verification: - git diff --check - node scripts/run-vitest.mjs src/gateway/server.sessions.create.test.ts src/gateway/talk-realtime-relay.test.ts - swift test --filter ChatViewModelTests (apps/shared/OpenClawKit) - xcodebuild build for Nimrod's iPhone succeeded; install succeeded; launch was blocked because the phone was locked Known follow-up: - Preserve traceLevel in sessions.create parent runtime inheritance and keep the changelog credit in the follow-up patch.
115 lines
4.1 KiB
Swift
115 lines
4.1 KiB
Swift
import Foundation
|
|
import Testing
|
|
@testable import OpenClaw
|
|
|
|
@Suite(.serialized) struct OnboardingStateStoreTests {
|
|
@Test @MainActor func shouldPresentWhenFreshAndDisconnected() {
|
|
let testDefaults = self.makeDefaults()
|
|
let defaults = testDefaults.defaults
|
|
defer { self.reset(testDefaults) }
|
|
|
|
let appModel = NodeAppModel()
|
|
appModel.gatewayServerName = nil
|
|
#expect(OnboardingStateStore.shouldPresentOnLaunch(
|
|
appModel: appModel,
|
|
defaults: defaults,
|
|
hasSavedGatewayConnection: false))
|
|
}
|
|
|
|
@Test @MainActor func doesNotPresentWhenConnected() {
|
|
let testDefaults = self.makeDefaults()
|
|
let defaults = testDefaults.defaults
|
|
defer { self.reset(testDefaults) }
|
|
|
|
let appModel = NodeAppModel()
|
|
appModel.gatewayServerName = "gateway"
|
|
#expect(!OnboardingStateStore.shouldPresentOnLaunch(
|
|
appModel: appModel,
|
|
defaults: defaults,
|
|
hasSavedGatewayConnection: false))
|
|
}
|
|
|
|
@Test @MainActor func doesNotPresentForSavedGatewayBeforeReconnectCompletes() {
|
|
let testDefaults = self.makeDefaults()
|
|
let defaults = testDefaults.defaults
|
|
defer { self.reset(testDefaults) }
|
|
|
|
let appModel = NodeAppModel()
|
|
appModel.gatewayServerName = nil
|
|
#expect(!OnboardingStateStore.shouldPresentOnLaunch(
|
|
appModel: appModel,
|
|
defaults: defaults,
|
|
hasSavedGatewayConnection: true))
|
|
}
|
|
|
|
@Test @MainActor func markCompletedPersistsMode() {
|
|
let testDefaults = self.makeDefaults()
|
|
let defaults = testDefaults.defaults
|
|
defer { self.reset(testDefaults) }
|
|
|
|
let appModel = NodeAppModel()
|
|
appModel.gatewayServerName = nil
|
|
|
|
OnboardingStateStore.markCompleted(mode: .remoteDomain, defaults: defaults)
|
|
#expect(OnboardingStateStore.lastMode(defaults: defaults) == .remoteDomain)
|
|
#expect(!OnboardingStateStore.shouldPresentOnLaunch(
|
|
appModel: appModel,
|
|
defaults: defaults,
|
|
hasSavedGatewayConnection: false))
|
|
|
|
OnboardingStateStore.markIncomplete(defaults: defaults)
|
|
#expect(OnboardingStateStore.shouldPresentOnLaunch(
|
|
appModel: appModel,
|
|
defaults: defaults,
|
|
hasSavedGatewayConnection: false))
|
|
}
|
|
|
|
@Test func firstRunIntroDefaultsToVisibleThenPersists() {
|
|
let testDefaults = self.makeDefaults()
|
|
let defaults = testDefaults.defaults
|
|
defer { self.reset(testDefaults) }
|
|
|
|
#expect(OnboardingStateStore.shouldPresentFirstRunIntro(defaults: defaults))
|
|
|
|
OnboardingStateStore.markFirstRunIntroSeen(defaults: defaults)
|
|
#expect(!OnboardingStateStore.shouldPresentFirstRunIntro(defaults: defaults))
|
|
}
|
|
|
|
@Test @MainActor func resetClearsCompletionAndIntroSeen() {
|
|
let testDefaults = self.makeDefaults()
|
|
let defaults = testDefaults.defaults
|
|
defer { self.reset(testDefaults) }
|
|
|
|
OnboardingStateStore.markCompleted(mode: .homeNetwork, defaults: defaults)
|
|
OnboardingStateStore.markFirstRunIntroSeen(defaults: defaults)
|
|
|
|
OnboardingStateStore.reset(defaults: defaults)
|
|
|
|
let appModel = NodeAppModel()
|
|
appModel.gatewayServerName = nil
|
|
|
|
#expect(OnboardingStateStore.shouldPresentOnLaunch(
|
|
appModel: appModel,
|
|
defaults: defaults,
|
|
hasSavedGatewayConnection: false))
|
|
#expect(OnboardingStateStore.shouldPresentFirstRunIntro(defaults: defaults))
|
|
#expect(OnboardingStateStore.lastMode(defaults: defaults) == .homeNetwork)
|
|
}
|
|
|
|
private struct TestDefaults {
|
|
var suiteName: String
|
|
var defaults: UserDefaults
|
|
}
|
|
|
|
private func makeDefaults() -> TestDefaults {
|
|
let suiteName = "OnboardingStateStoreTests.\(UUID().uuidString)"
|
|
return TestDefaults(
|
|
suiteName: suiteName,
|
|
defaults: UserDefaults(suiteName: suiteName) ?? .standard)
|
|
}
|
|
|
|
private func reset(_ defaults: TestDefaults) {
|
|
defaults.defaults.removePersistentDomain(forName: defaults.suiteName)
|
|
}
|
|
}
|