100 lines
3.2 KiB
Swift
100 lines
3.2 KiB
Swift
import ClawdbotProtocol
|
|
import Foundation
|
|
import Testing
|
|
@testable import Clawdbot
|
|
|
|
@Suite
|
|
@MainActor
|
|
struct WorkActivityStoreTests {
|
|
@Test func mainSessionJobPreemptsOther() {
|
|
let store = WorkActivityStore()
|
|
|
|
store.handleJob(sessionKey: "discord:group:1", state: "started")
|
|
#expect(store.iconState == .workingOther(.job))
|
|
#expect(store.current?.sessionKey == "discord:group:1")
|
|
|
|
store.handleJob(sessionKey: "main", state: "started")
|
|
#expect(store.iconState == .workingMain(.job))
|
|
#expect(store.current?.sessionKey == "main")
|
|
|
|
store.handleJob(sessionKey: "main", state: "finished")
|
|
#expect(store.iconState == .workingOther(.job))
|
|
#expect(store.current?.sessionKey == "discord:group:1")
|
|
|
|
store.handleJob(sessionKey: "discord:group:1", state: "finished")
|
|
#expect(store.iconState == .idle)
|
|
#expect(store.current == nil)
|
|
}
|
|
|
|
@Test func jobStaysWorkingAfterToolResultGrace() async {
|
|
let store = WorkActivityStore()
|
|
|
|
store.handleJob(sessionKey: "main", state: "started")
|
|
#expect(store.iconState == .workingMain(.job))
|
|
|
|
store.handleTool(
|
|
sessionKey: "main",
|
|
phase: "start",
|
|
name: "read",
|
|
meta: nil,
|
|
args: ["path": AnyCodable("/tmp/file.txt")])
|
|
#expect(store.iconState == .workingMain(.tool(.read)))
|
|
|
|
store.handleTool(
|
|
sessionKey: "main",
|
|
phase: "result",
|
|
name: "read",
|
|
meta: nil,
|
|
args: ["path": AnyCodable("/tmp/file.txt")])
|
|
|
|
for _ in 0..<50 {
|
|
if store.iconState == .workingMain(.job) { break }
|
|
try? await Task.sleep(nanoseconds: 100_000_000)
|
|
}
|
|
#expect(store.iconState == .workingMain(.job))
|
|
|
|
store.handleJob(sessionKey: "main", state: "done")
|
|
#expect(store.iconState == .idle)
|
|
}
|
|
|
|
@Test func toolLabelExtractsFirstLineAndShortensHome() {
|
|
let store = WorkActivityStore()
|
|
let home = NSHomeDirectory()
|
|
|
|
store.handleTool(
|
|
sessionKey: "main",
|
|
phase: "start",
|
|
name: "bash",
|
|
meta: nil,
|
|
args: [
|
|
"command": AnyCodable("echo hi\necho bye"),
|
|
"path": AnyCodable("\(home)/Projects/clawdbot"),
|
|
])
|
|
|
|
#expect(store.current?.label == "bash: echo hi")
|
|
#expect(store.iconState == .workingMain(.tool(.bash)))
|
|
|
|
store.handleTool(
|
|
sessionKey: "main",
|
|
phase: "start",
|
|
name: "read",
|
|
meta: nil,
|
|
args: ["path": AnyCodable("\(home)/secret.txt")])
|
|
|
|
#expect(store.current?.label == "read: ~/secret.txt")
|
|
#expect(store.iconState == .workingMain(.tool(.read)))
|
|
}
|
|
|
|
@Test func resolveIconStateHonorsOverrideSelection() {
|
|
let store = WorkActivityStore()
|
|
store.handleJob(sessionKey: "main", state: "started")
|
|
#expect(store.iconState == .workingMain(.job))
|
|
|
|
store.resolveIconState(override: .idle)
|
|
#expect(store.iconState == .idle)
|
|
|
|
store.resolveIconState(override: .otherEdit)
|
|
#expect(store.iconState == .overridden(.tool(.edit)))
|
|
}
|
|
}
|