Files
openclaw/apps/macos/Tests/OpenClawIPCTests/MacSessionObserverDigestTests.swift
2026-07-27 05:43:19 -04:00

177 lines
5.9 KiB
Swift

import OpenClawChatUI
import OpenClawProtocol
import Testing
struct MacSessionObserverDigestTests {
@Test func `native chat sidebar accepts only the server reported run`() {
let session = OpenClawChatSessionEntry(
key: "agent:main:work",
kind: nil,
displayName: nil,
surface: nil,
subject: nil,
room: nil,
space: nil,
updatedAt: 100,
sessionId: nil,
systemSent: nil,
abortedLastRun: nil,
thinkingLevel: nil,
verboseLevel: nil,
inputTokens: nil,
outputTokens: nil,
totalTokens: nil,
modelProvider: nil,
model: nil,
contextTokens: nil,
status: "running",
hasActiveRun: true,
activeRunIds: ["run-1"])
let wrongRun = SessionObserverDigest(
sessionkey: session.key,
runid: "run-old",
revision: 5,
updatedat: 500,
headline: "Wrong run",
health: .stuck)
let accepted = SessionObserverDigest(
sessionkey: session.key,
runid: "run-1",
revision: 1,
updatedat: 600,
headline: "On track",
health: .onTrack)
let rejected = ChatSessionSidebarModel.applying(observerDigest: wrongRun, to: [session])
let updated = ChatSessionSidebarModel.applying(observerDigest: accepted, to: rejected)
#expect(rejected[0].observerDigest == nil)
#expect(updated[0].observerDigest?.headline == "On track")
#expect(ChatSessionSidebarModel.subtitle(for: updated[0], workSubtitle: "Work") == "On track")
}
@Test func `native chat sidebar rejects another agent global digest`() {
let session = OpenClawChatSessionEntry(
key: "global",
kind: "global",
displayName: nil,
surface: nil,
subject: nil,
room: nil,
space: nil,
updatedAt: 100,
sessionId: nil,
systemSent: nil,
abortedLastRun: nil,
thinkingLevel: nil,
verboseLevel: nil,
inputTokens: nil,
outputTokens: nil,
totalTokens: nil,
modelProvider: nil,
model: nil,
contextTokens: nil,
status: "running",
hasActiveRun: true,
activeRunIds: ["run-work"])
let other = SessionObserverDigest(
sessionkey: "global",
agentid: "main",
runid: "run-work",
revision: 1,
updatedat: 200,
headline: "Wrong owner",
health: .stuck)
let selected = SessionObserverDigest(
sessionkey: "global",
agentid: "work",
runid: "run-work",
revision: 1,
updatedat: 200,
headline: "Selected owner",
health: .onTrack)
let ownerless = SessionObserverDigest(
sessionkey: "global",
runid: "run-work",
revision: 1,
updatedat: 200,
headline: "Missing owner",
health: .stuck)
let rejected = ChatSessionSidebarModel.applying(
observerDigest: other,
to: [session],
activeAgentId: "work")
let rejectedOwnerless = ChatSessionSidebarModel.applying(
observerDigest: ownerless,
to: rejected,
activeAgentId: "work")
let accepted = ChatSessionSidebarModel.applying(
observerDigest: selected,
to: rejectedOwnerless,
activeAgentId: "work")
#expect(rejected[0].observerDigest == nil)
#expect(rejectedOwnerless[0].observerDigest == nil)
#expect(accepted[0].observerDigest?.headline == "Selected owner")
}
@Test func `changing the selected agent clears the previous global digest`() {
var session = OpenClawChatSessionEntry(
key: "global",
kind: "global",
displayName: nil,
surface: nil,
subject: nil,
room: nil,
space: nil,
updatedAt: 100,
sessionId: nil,
systemSent: nil,
abortedLastRun: nil,
thinkingLevel: nil,
verboseLevel: nil,
inputTokens: nil,
outputTokens: nil,
totalTokens: nil,
modelProvider: nil,
model: nil,
contextTokens: nil,
status: "running",
hasActiveRun: true,
activeRunIds: ["run-main"])
session.observerDigest = OpenClawChatSessionObserverDigest(
agentId: "main",
runId: "run-main",
revision: 4,
updatedAt: 400,
headline: "Main owner",
health: "on-track")
let disconnected = ChatSessionSidebarModel.clearingForeignGlobalObserverDigest(
in: [session],
activeAgentId: nil)
let switched = ChatSessionSidebarModel.clearingForeignGlobalObserverDigest(
in: [session],
activeAgentId: "work")
#expect(disconnected[0].observerDigest?.headline == "Main owner")
#expect(switched[0].observerDigest == nil)
session.observerDigest = OpenClawChatSessionObserverDigest(
runId: "run-work",
revision: 1,
updatedAt: 500,
headline: "Legacy selected owner",
health: "on-track")
let clearedLegacy = ChatSessionSidebarModel.clearingForeignGlobalObserverDigest(
in: [session],
activeAgentId: "work")
let adopted = ChatSessionSidebarModel.reconcilingGlobalObserverDigestOwner(
in: [session],
activeAgentId: "work")
#expect(clearedLegacy[0].observerDigest == nil)
#expect(adopted[0].observerDigest?.agentId == "work")
}
}