mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-02 06:56:36 +08:00
feat: 添加支持文件路径处理函数,增强证书目录路径验证和日志记录功能
This commit is contained in:
@@ -5,8 +5,10 @@ import (
|
||||
"atsflare/model"
|
||||
"io"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
type roundTripFunc func(req *http.Request) (*http.Response, error)
|
||||
@@ -164,3 +166,125 @@ func TestRequestNodeOpenrestyRestart(t *testing.T) {
|
||||
t.Fatal("expected restart_openresty_requested to be true")
|
||||
}
|
||||
}
|
||||
|
||||
func TestListNodeViewsIncludesLatestApplyLogsForMultipleNodes(t *testing.T) {
|
||||
setupServiceTestDB(t)
|
||||
|
||||
now := time.Now()
|
||||
nodes := []*model.Node{
|
||||
{
|
||||
NodeID: "node-a",
|
||||
Name: "edge-a",
|
||||
IP: "10.0.0.11",
|
||||
AgentToken: "token-a",
|
||||
AgentVersion: "v0.5.0",
|
||||
NginxVersion: "1.27.1.2",
|
||||
Status: NodeStatusOnline,
|
||||
LastSeenAt: now,
|
||||
},
|
||||
{
|
||||
NodeID: "node-b",
|
||||
Name: "edge-b",
|
||||
IP: "10.0.0.12",
|
||||
AgentToken: "token-b",
|
||||
AgentVersion: "v0.5.0",
|
||||
NginxVersion: "1.27.1.2",
|
||||
Status: NodeStatusOnline,
|
||||
LastSeenAt: now,
|
||||
},
|
||||
}
|
||||
for _, node := range nodes {
|
||||
if err := node.Insert(); err != nil {
|
||||
t.Fatalf("failed to insert node %s: %v", node.NodeID, err)
|
||||
}
|
||||
}
|
||||
|
||||
logs := []*model.ApplyLog{
|
||||
{NodeID: "node-a", Version: "20260313-001", Result: ApplyResultOK, Message: "first success", CreatedAt: now.Add(-2 * time.Minute)},
|
||||
{NodeID: "node-a", Version: "20260313-002", Result: ApplyResultFailed, Message: "latest failure", CreatedAt: now.Add(-1 * time.Minute)},
|
||||
{NodeID: "node-b", Version: "20260313-003", Result: ApplyResultOK, Message: "latest success", CreatedAt: now},
|
||||
}
|
||||
for _, log := range logs {
|
||||
if err := model.DB.Create(log).Error; err != nil {
|
||||
t.Fatalf("failed to insert apply log for %s: %v", log.NodeID, err)
|
||||
}
|
||||
}
|
||||
|
||||
views, err := ListNodeViews()
|
||||
if err != nil {
|
||||
t.Fatalf("ListNodeViews failed: %v", err)
|
||||
}
|
||||
if len(views) != 2 {
|
||||
t.Fatalf("expected 2 node views, got %d", len(views))
|
||||
}
|
||||
|
||||
sort.Slice(views, func(i int, j int) bool {
|
||||
return views[i].NodeID < views[j].NodeID
|
||||
})
|
||||
|
||||
if views[0].NodeID != "node-a" || views[0].LatestApplyResult != ApplyResultFailed || views[0].LatestApplyMessage != "latest failure" {
|
||||
t.Fatalf("unexpected latest apply log for node-a: %+v", views[0])
|
||||
}
|
||||
if views[1].NodeID != "node-b" || views[1].LatestApplyResult != ApplyResultOK || views[1].LatestApplyMessage != "latest success" {
|
||||
t.Fatalf("unexpected latest apply log for node-b: %+v", views[1])
|
||||
}
|
||||
}
|
||||
|
||||
func TestCollectNodeHeartbeatChangesOnlyReturnsChangedFields(t *testing.T) {
|
||||
now := time.Now()
|
||||
before := &model.Node{
|
||||
Name: "edge-1",
|
||||
IP: "10.0.0.8",
|
||||
AgentVersion: "v0.5.0",
|
||||
NginxVersion: "1.27.1.2",
|
||||
OpenrestyStatus: OpenrestyStatusHealthy,
|
||||
OpenrestyMessage: "",
|
||||
Status: NodeStatusOnline,
|
||||
CurrentVersion: "20260313-001",
|
||||
LastSeenAt: now.Add(-time.Minute),
|
||||
LastError: "",
|
||||
UpdateRequested: true,
|
||||
UpdateChannel: "preview",
|
||||
UpdateTag: "v0.5.0-rc.1",
|
||||
RestartOpenrestyRequested: true,
|
||||
}
|
||||
after := &model.Node{
|
||||
Name: "edge-1",
|
||||
IP: "10.0.0.8",
|
||||
AgentVersion: "v0.5.0",
|
||||
NginxVersion: "1.27.1.2",
|
||||
OpenrestyStatus: OpenrestyStatusHealthy,
|
||||
OpenrestyMessage: "",
|
||||
Status: NodeStatusOnline,
|
||||
CurrentVersion: "20260313-001",
|
||||
LastSeenAt: now,
|
||||
LastError: "",
|
||||
UpdateRequested: false,
|
||||
UpdateChannel: "stable",
|
||||
UpdateTag: "",
|
||||
RestartOpenrestyRequested: false,
|
||||
}
|
||||
|
||||
changes := collectNodeHeartbeatChanges(before, after)
|
||||
if len(changes) != 5 {
|
||||
t.Fatalf("expected 5 changed fields, got %d: %#v", len(changes), changes)
|
||||
}
|
||||
if _, ok := changes["last_seen_at"]; !ok {
|
||||
t.Fatal("expected last_seen_at change to be included")
|
||||
}
|
||||
if value, ok := changes["update_requested"]; !ok || value != false {
|
||||
t.Fatalf("expected update_requested reset, got %#v", value)
|
||||
}
|
||||
if value, ok := changes["update_channel"]; !ok || value != "stable" {
|
||||
t.Fatalf("expected update_channel reset, got %#v", value)
|
||||
}
|
||||
if value, ok := changes["update_tag"]; !ok || value != "" {
|
||||
t.Fatalf("expected update_tag reset, got %#v", value)
|
||||
}
|
||||
if value, ok := changes["restart_openresty_requested"]; !ok || value != false {
|
||||
t.Fatalf("expected restart_openresty_requested reset, got %#v", value)
|
||||
}
|
||||
if _, ok := changes["ip"]; ok {
|
||||
t.Fatal("did not expect unchanged ip to be included")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user