ajhahn.de
← eeco
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)
	}
}