Files
kandev/apps/backend/internal/office/repository/sqlite/activity_test.go
T
2026-05-16 20:07:57 +01:00

125 lines
3.1 KiB
Go

package sqlite_test
import (
"context"
"testing"
"github.com/kandev/kandev/internal/office/models"
)
func TestActivityEntry_CreateAndList(t *testing.T) {
repo := newTestRepo(t)
ctx := context.Background()
entry := &models.ActivityEntry{
WorkspaceID: "ws-1",
ActorType: "user",
ActorID: "user-1",
Action: "created_agent",
TargetType: "agent",
TargetID: "agent-1",
Details: `{"name":"test-agent"}`,
}
if err := repo.CreateActivityEntry(ctx, entry); err != nil {
t.Fatalf("create: %v", err)
}
entries, err := repo.ListActivityEntries(ctx, "ws-1", 10)
if err != nil {
t.Fatalf("list: %v", err)
}
if len(entries) != 1 {
t.Fatalf("count = %d, want 1", len(entries))
}
if entries[0].Action != "created_agent" {
t.Errorf("action = %q, want %q", entries[0].Action, "created_agent")
}
}
// Pins that CreateActivityEntry round-trips the new run_id and
// session_id columns added in Wave 0. Without persistence here the
// run detail page's Tasks Touched surface (which reads back via
// ListTasksTouchedByRun) would silently miss agent-driven activity.
func TestActivityEntry_PersistsRunAndSessionID(t *testing.T) {
repo := newTestRepo(t)
ctx := context.Background()
entry := &models.ActivityEntry{
WorkspaceID: "ws-1",
ActorType: "agent",
ActorID: "agent-1",
Action: "task.commented",
TargetType: "task",
TargetID: "task-A",
Details: "{}",
RunID: "run-xyz",
SessionID: "sess-abc",
}
if err := repo.CreateActivityEntry(ctx, entry); err != nil {
t.Fatalf("create: %v", err)
}
got, err := repo.ListActivityEntries(ctx, "ws-1", 10)
if err != nil {
t.Fatalf("list: %v", err)
}
if len(got) != 1 {
t.Fatalf("count = %d, want 1", len(got))
}
if got[0].RunID != "run-xyz" {
t.Errorf("run_id = %q, want run-xyz", got[0].RunID)
}
if got[0].SessionID != "sess-abc" {
t.Errorf("session_id = %q, want sess-abc", got[0].SessionID)
}
// And it shows up in ListTasksTouchedByRun.
tasks, err := repo.ListTasksTouchedByRun(ctx, "run-xyz")
if err != nil {
t.Fatalf("list tasks touched: %v", err)
}
if len(tasks) != 1 || tasks[0] != "task-A" {
t.Fatalf("tasks touched = %v, want [task-A]", tasks)
}
}
func TestActivityEntry_ListByTarget(t *testing.T) {
repo := newTestRepo(t)
ctx := context.Background()
entries := []*models.ActivityEntry{
{
WorkspaceID: "ws-1",
ActorType: "user",
ActorID: "user-1",
Action: "task.status_changed",
TargetType: "task",
TargetID: "task-1",
},
{
WorkspaceID: "ws-1",
ActorType: "agent",
ActorID: "agent-1",
Action: "task.comment_created",
TargetType: "task",
TargetID: "task-2",
},
}
for _, entry := range entries {
if err := repo.CreateActivityEntry(ctx, entry); err != nil {
t.Fatalf("create: %v", err)
}
}
got, err := repo.ListActivityEntriesByTarget(ctx, "ws-1", "task-1", 10)
if err != nil {
t.Fatalf("list by target: %v", err)
}
if len(got) != 1 {
t.Fatalf("count = %d, want 1", len(got))
}
if got[0].TargetID != "task-1" {
t.Fatalf("target_id = %q, want task-1", got[0].TargetID)
}
}