package session import ( "os" "path/filepath" "testing" "time" ) // TestJobMarkerRoundtrip:任务会话标记的写入与读取。 func TestJobMarkerRoundtrip(t *testing.T) { t.Setenv("HOME", t.TempDir()) at := time.Date(2026, 9, 30, 9, 0, 0, 0, time.Local) if err := SaveJobMarkerAt("sess-1", "cron-喝水提醒", "喝水提醒", at); err != nil { t.Fatal(err) } m, ok := LoadJobMarker("sess-1") if !ok { t.Fatal("标记写入后读不到") } if m.JobID != "cron-喝水提醒" || m.JobName != "喝水提醒" || !m.At.Equal(at) { t.Fatalf("标记内容不符: %+v", m) } if _, err := os.Stat(filepath.Join(Dir(), "sess-1.job.json")); err != nil { t.Fatalf("sidecar 文件不存在: %v", err) } // 未标记的会话读不到;Remove 后同样读不到。 if _, ok := LoadJobMarker("sess-other"); ok { t.Fatal("未标记会话不该有标记") } if err := RemoveJobMarker("sess-1"); err != nil { t.Fatal(err) } if _, ok := LoadJobMarker("sess-1"); ok { t.Fatal("Remove 后仍能读到标记") } // Remove 幂等(不存在不报错)。 if err := RemoveJobMarker("sess-1"); err != nil { t.Fatalf("重复 Remove 报错: %v", err) } // 空参数不写文件。 if err := SaveJobMarker("", "j", "n"); err != nil { t.Fatal(err) } if err := SaveJobMarker("sess-2", "", "n"); err != nil { t.Fatal(err) } if _, ok := LoadJobMarker("sess-2"); ok { t.Fatal("空 jobID 不该写出标记") } }