feat: add sqlite session store for remote server
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user