accounts/internal/agentserver/registry_test.go
Haitao Pan ee6e1a6363 feat: move account service to repo root
# Conflicts:
#	account/Makefile
#	account/go.mod
#	docs/account-admin-settings.md
#	docs/account-svc-plus.md
2026-01-16 16:15:23 +08:00

105 lines
2.9 KiB
Go

package agentserver
import (
"testing"
"time"
"account/internal/agentproto"
)
func TestNewRegistryValidation(t *testing.T) {
_, err := NewRegistry(Config{})
if err != nil {
t.Fatalf("unexpected error for empty config: %v", err)
}
_, err = NewRegistry(Config{Credentials: []Credential{{ID: "", Token: "token"}}})
if err == nil {
t.Fatalf("expected error for empty id")
}
_, err = NewRegistry(Config{Credentials: []Credential{{ID: "edge", Token: ""}}})
if err == nil {
t.Fatalf("expected error for empty token")
}
_, err = NewRegistry(Config{Credentials: []Credential{{ID: "a", Token: "1"}, {ID: "a", Token: "2"}}})
if err == nil {
t.Fatalf("expected error for duplicate id")
}
_, err = NewRegistry(Config{Credentials: []Credential{{ID: "a", Token: "dup"}, {ID: "b", Token: "dup"}}})
if err == nil {
t.Fatalf("expected error for duplicate token")
}
}
func TestRegistryAuthenticateAndStatus(t *testing.T) {
registry, err := NewRegistry(Config{Credentials: []Credential{{ID: "edge", Name: "Edge", Token: "secret", Groups: []string{"default"}}}})
if err != nil {
t.Fatalf("new registry: %v", err)
}
identity, ok := registry.Authenticate("secret")
if !ok || identity == nil {
t.Fatalf("expected authentication to succeed")
}
if identity.ID != "edge" {
t.Fatalf("unexpected identity id %q", identity.ID)
}
report := agentproto.StatusReport{
Healthy: true,
Users: 5,
Xray: agentproto.XrayStatus{
Running: true,
Clients: 5,
},
}
registry.ReportStatus(*identity, report)
snapshots := registry.Statuses()
if len(snapshots) != 1 {
t.Fatalf("expected 1 snapshot, got %d", len(snapshots))
}
snapshot := snapshots[0]
if snapshot.Agent.ID != "edge" {
t.Fatalf("unexpected snapshot agent id %q", snapshot.Agent.ID)
}
if !snapshot.Report.Healthy {
t.Fatalf("expected healthy report")
}
if snapshot.Report.Users != 5 {
t.Fatalf("unexpected users count %d", snapshot.Report.Users)
}
if snapshot.Report.Xray.Clients != 5 {
t.Fatalf("unexpected xray clients %d", snapshot.Report.Xray.Clients)
}
if snapshot.UpdatedAt.IsZero() {
t.Fatalf("expected updated timestamp")
}
// Ensure snapshots include configured agents without reports.
registry, err = NewRegistry(Config{Credentials: []Credential{{ID: "a", Token: "1"}, {ID: "b", Token: "2"}}})
if err != nil {
t.Fatalf("new registry: %v", err)
}
snapshots = registry.Statuses()
if len(snapshots) != 2 {
t.Fatalf("expected 2 snapshots, got %d", len(snapshots))
}
if snapshots[0].Agent.ID != "a" || snapshots[1].Agent.ID != "b" {
t.Fatalf("unexpected snapshot ordering: %+v", snapshots)
}
// Report status with timestamp and ensure Latest is retained.
now := time.Now().UTC()
registry.ReportStatus(snapshots[0].Agent, agentproto.StatusReport{Users: 1})
entries := registry.Statuses()
if len(entries) != 2 {
t.Fatalf("expected 2 entries, got %d", len(entries))
}
if entries[0].UpdatedAt.Before(now) {
t.Fatalf("expected updated timestamp to be after initial time")
}
}