package server import ( "path/filepath" "testing" "time" "github.com/longbin/agent-notify/internal/remote" ) func TestStoreUpsertAndList(t *testing.T) { db := filepath.Join(t.TempDir(), "test.db") s, err := Open(db) if err != nil { t.Fatal(err) } defer s.Close() now := time.Now().UTC() base := remote.StatusReport{ Hostname: "host-a", IPs: []string{"10.0.0.1"}, Agent: "Cursor", CWD: "/proj", UpdatedAt: now, } r1 := base r1.Status = "waiting" if err := s.Upsert(r1); err != nil { t.Fatal(err) } r2 := base r2.Status = "running" if err := s.Upsert(r2); err != nil { t.Fatal(err) } rows, err := s.List(ListFilters{}) if err != nil { t.Fatal(err) } if len(rows) != 1 { t.Fatalf("expected 1 row, got %d", len(rows)) } if rows[0].Status != "running" { t.Fatalf("expected latest status running, got %q", rows[0].Status) } key := remote.SessionKey("host-a", "10.0.0.1", "/proj", "Cursor") if rows[0].SessionKey != key { t.Fatalf("session_key: got %q want %q", rows[0].SessionKey, key) } } func TestStoreOfflineAfter5Min(t *testing.T) { db := filepath.Join(t.TempDir(), "test.db") s, err := Open(db) if err != nil { t.Fatal(err) } defer s.Close() stale := time.Now().UTC().Add(-10 * time.Minute) report := remote.StatusReport{ Hostname: "host-b", IPs: []string{"192.168.1.5"}, Agent: "Claude", CWD: "/work", Status: "waiting", UpdatedAt: stale, } if err := s.Upsert(report); err != nil { t.Fatal(err) } rows, err := s.List(ListFilters{}) if err != nil { t.Fatal(err) } if len(rows) != 1 { t.Fatalf("expected 1 row, got %d", len(rows)) } if rows[0].Status != "offline" { t.Fatalf("expected offline status, got %q", rows[0].Status) } } func TestStoreMergePreservesLastUser(t *testing.T) { db := filepath.Join(t.TempDir(), "test.db") s, err := Open(db) if err != nil { t.Fatal(err) } defer s.Close() now := time.Now().UTC() base := remote.StatusReport{ Hostname: "host-c", IPs: []string{"10.0.0.2"}, Agent: "Cursor", CWD: "/proj", Status: "waiting", UpdatedAt: now, } r1 := base r1.LastUser = "keep me" if err := s.Upsert(r1); err != nil { t.Fatal(err) } r2 := base r2.LastUser = "" r2.Status = "running" if err := s.Upsert(r2); err != nil { t.Fatal(err) } rows, err := s.List(ListFilters{}) if err != nil { t.Fatal(err) } if len(rows) != 1 { t.Fatalf("expected 1 row, got %d", len(rows)) } if rows[0].LastUser != "keep me" { t.Fatalf("last_user: got %q want %q", rows[0].LastUser, "keep me") } if rows[0].Status != "running" { t.Fatalf("expected status running, got %q", rows[0].Status) } }