Go 113 lines
package memory
import (
"os"
"path/filepath"
"strings"
"testing"
"time"
)
func TestSelect_WordOverlap(t *testing.T) {
s := newStore(t)
a := makeFact("pipeline-ref", "pipeline bugs tracked in linear", TypeReference)
b := makeFact("auth-feedback", "always lowercase usernames", TypeFeedback)
if err := s.Save(a); err != nil {
t.Fatal(err)
}
if err := s.Save(b); err != nil {
t.Fatal(err)
}
got, err := s.Select("ingest pipeline broke")
if err != nil {
t.Fatal(err)
}
if len(got) != 1 || got[0].Name != "pipeline-ref" {
t.Fatalf("Select got %v, want [pipeline-ref]", got)
}
}
func TestSelect_CaseInsensitive(t *testing.T) {
s := newStore(t)
if err := s.Save(makeFact("foo", "Bar Baz Qux", TypeUser)); err != nil {
t.Fatal(err)
}
got, err := s.Select("BAZ")
if err != nil {
t.Fatal(err)
}
if len(got) != 1 {
t.Errorf("expected one match, got %d", len(got))
}
}
func TestSelect_BumpsLastUsed(t *testing.T) {
s := newStore(t)
f := makeFact("hit", "matches query", TypeUser, func(f *Fact) {
f.LastUsed = time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
})
if err := s.Save(f); err != nil {
t.Fatal(err)
}
if _, err := s.Select("matches"); err != nil {
t.Fatal(err)
}
facts, _ := s.LoadAll()
if len(facts) != 1 {
t.Fatal("expected one fact")
}
wantDay := s.Now().UTC().Format(DateLayout)
if got := facts[0].LastUsed.UTC().Format(DateLayout); got != wantDay {
t.Errorf("last_used after Select = %s, want %s", got, wantDay)
}
}
func TestSelect_EmptyQueryReturnsNothing(t *testing.T) {
s := newStore(t)
if err := s.Save(makeFact("x", "any", TypeUser)); err != nil {
t.Fatal(err)
}
got, err := s.Select(" ")
if err != nil {
t.Fatal(err)
}
if got != nil {
t.Errorf("expected nil, got %v", got)
}
}
func TestSelect_LoadAllFail(t *testing.T) {
// A malformed fact file makes LoadAll fail; Select must surface the
// wrapped LoadAll error, never panic (pins malformed→error at the
// Select entry).
s := newStore(t)
if err := os.WriteFile(filepath.Join(s.MemoryDir, "bad.md"), []byte("nope"), 0o644); err != nil {
t.Fatal(err)
}
_, err := s.Select("anything")
if err == nil {
t.Fatal("expected malformed fact to fail Select")
}
if !strings.Contains(err.Error(), "memory.LoadAll:") {
t.Errorf("err = %v, want wrap memory.LoadAll:", err)
}
}
func TestSelect_MissDoesNotBump(t *testing.T) {
s := newStore(t)
oldDay := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
f := makeFact("miss", "no overlap here", TypeUser, func(f *Fact) {
f.LastUsed = oldDay
})
if err := s.Save(f); err != nil {
t.Fatal(err)
}
if _, err := s.Select("totally unrelated"); err != nil {
t.Fatal(err)
}
facts, _ := s.LoadAll()
if !facts[0].LastUsed.Equal(oldDay) {
t.Errorf("non-selected fact bumped: got %v", facts[0].LastUsed)
}
}