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) } }