- Updated isolated cron jobs to support new delivery modes: `announce` and `none`, improving output management. - Refactored job configuration to remove legacy fields and streamline delivery settings. - Enhanced the `CronJobEditor` UI to reflect changes in delivery options, including a new segmented control for delivery mode selection. - Updated documentation to clarify the new delivery configurations and their implications for job execution. - Improved tests to validate the new delivery behavior and ensure backward compatibility with legacy settings. This update provides users with greater flexibility in managing how isolated jobs deliver their outputs, enhancing overall usability and clarity in job configurations.
94 lines
3.0 KiB
Swift
94 lines
3.0 KiB
Swift
import SwiftUI
|
|
import Testing
|
|
@testable import OpenClaw
|
|
|
|
@Suite(.serialized)
|
|
@MainActor
|
|
struct CronJobEditorSmokeTests {
|
|
@Test func statusPillBuildsBody() {
|
|
_ = StatusPill(text: "ok", tint: .green).body
|
|
_ = StatusPill(text: "disabled", tint: .secondary).body
|
|
}
|
|
|
|
@Test func cronJobEditorBuildsBodyForNewJob() {
|
|
let channelsStore = ChannelsStore(isPreview: true)
|
|
let view = CronJobEditor(
|
|
job: nil,
|
|
isSaving: .constant(false),
|
|
error: .constant(nil),
|
|
channelsStore: channelsStore,
|
|
onCancel: {},
|
|
onSave: { _ in })
|
|
_ = view.body
|
|
}
|
|
|
|
@Test func cronJobEditorBuildsBodyForExistingJob() {
|
|
let channelsStore = ChannelsStore(isPreview: true)
|
|
let job = CronJob(
|
|
id: "job-1",
|
|
agentId: "ops",
|
|
name: "Daily summary",
|
|
description: nil,
|
|
enabled: true,
|
|
deleteAfterRun: nil,
|
|
createdAtMs: 1_700_000_000_000,
|
|
updatedAtMs: 1_700_000_000_000,
|
|
schedule: .every(everyMs: 3_600_000, anchorMs: 1_700_000_000_000),
|
|
sessionTarget: .isolated,
|
|
wakeMode: .nextHeartbeat,
|
|
payload: .agentTurn(
|
|
message: "Summarize the last day",
|
|
thinking: "low",
|
|
timeoutSeconds: 120,
|
|
deliver: nil,
|
|
channel: nil,
|
|
to: nil,
|
|
bestEffortDeliver: nil),
|
|
delivery: CronDelivery(mode: .announce, channel: "whatsapp", to: "+15551234567", bestEffort: true),
|
|
state: CronJobState(
|
|
nextRunAtMs: 1_700_000_100_000,
|
|
runningAtMs: nil,
|
|
lastRunAtMs: 1_700_000_050_000,
|
|
lastStatus: "ok",
|
|
lastError: nil,
|
|
lastDurationMs: 1000))
|
|
|
|
let view = CronJobEditor(
|
|
job: job,
|
|
isSaving: .constant(false),
|
|
error: .constant(nil),
|
|
channelsStore: channelsStore,
|
|
onCancel: {},
|
|
onSave: { _ in })
|
|
_ = view.body
|
|
}
|
|
|
|
@Test func cronJobEditorExercisesBuilders() {
|
|
let channelsStore = ChannelsStore(isPreview: true)
|
|
var view = CronJobEditor(
|
|
job: nil,
|
|
isSaving: .constant(false),
|
|
error: .constant(nil),
|
|
channelsStore: channelsStore,
|
|
onCancel: {},
|
|
onSave: { _ in })
|
|
view.exerciseForTesting()
|
|
}
|
|
|
|
@Test func cronJobEditorIncludesDeleteAfterRunForAtSchedule() throws {
|
|
let channelsStore = ChannelsStore(isPreview: true)
|
|
let view = CronJobEditor(
|
|
job: nil,
|
|
isSaving: .constant(false),
|
|
error: .constant(nil),
|
|
channelsStore: channelsStore,
|
|
onCancel: {},
|
|
onSave: { _ in })
|
|
|
|
var root: [String: Any] = [:]
|
|
view.applyDeleteAfterRun(to: &root, scheduleKind: CronJobEditor.ScheduleKind.at, deleteAfterRun: true)
|
|
let raw = root["deleteAfterRun"] as? Bool
|
|
#expect(raw == true)
|
|
}
|
|
}
|