Files
2026-06-22 08:55:57 +08:00

64 lines
2.2 KiB
Go

package projectmemory
import (
"strings"
"testing"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
)
func TestRenderAgentsMD_GroupsByKindDeterministic(t *testing.T) {
entries := []Entry{
{ID: uuid.New(), Kind: KindGotcha, Title: "Zebra gotcha", Body: "watch out"},
{ID: uuid.New(), Kind: KindDecision, Title: "Use Postgres", Body: "ACID matters", Tags: []string{"db", "arch"}},
{ID: uuid.New(), Kind: KindDecision, Title: "Adopt Chi router", Body: "lightweight"},
{ID: uuid.New(), Kind: KindConvention, Title: "Tabs not spaces", Body: "gofmt"},
}
out := renderAgentsMD(entries, nil)
// Sections appear in canonical kind order: Decisions, Conventions, Gotchas.
di := strings.Index(out, "## Decisions")
ci := strings.Index(out, "## Conventions")
gi := strings.Index(out, "## Gotchas")
require.Greater(t, di, 0)
require.Greater(t, ci, di)
require.Greater(t, gi, ci)
// Within Decisions, titles are sorted: "Adopt Chi router" before "Use Postgres".
require.Less(t, strings.Index(out, "Adopt Chi router"), strings.Index(out, "Use Postgres"))
// Tags are rendered sorted.
require.Contains(t, out, "Tags: arch, db")
// Generated banner present.
require.True(t, strings.HasPrefix(out, agentsMDHeader))
// Determinism: same input → identical output.
require.Equal(t, out, renderAgentsMD(entries, nil))
}
func TestRenderAgentsMD_WorkspaceScoping(t *testing.T) {
ws := uuid.New()
other := uuid.New()
entries := []Entry{
{ID: uuid.New(), Kind: KindDecision, Title: "Project-wide", Body: "x"}, // ws nil → always
{ID: uuid.New(), Kind: KindDecision, Title: "WS-specific", Body: "y", WorkspaceID: &ws}, // matches ws
{ID: uuid.New(), Kind: KindDecision, Title: "Other-WS", Body: "z", WorkspaceID: &other}, // excluded
}
out := renderAgentsMD(entries, &ws)
require.Contains(t, out, "Project-wide")
require.Contains(t, out, "WS-specific")
require.NotContains(t, out, "Other-WS")
// With no workspace, only project-wide entries appear.
outNil := renderAgentsMD(entries, nil)
require.Contains(t, outNil, "Project-wide")
require.NotContains(t, outNil, "WS-specific")
}
func TestRenderAgentsMD_Empty(t *testing.T) {
out := renderAgentsMD(nil, nil)
require.Contains(t, out, "No project memory recorded yet")
}