Go 125 lines
package memory
import (
"os"
"strings"
"testing"
)
func TestWriteIndex_Empty(t *testing.T) {
s := newStore(t)
if err := s.WriteIndex(nil); err != nil {
t.Fatal(err)
}
b, err := os.ReadFile(s.indexPath())
if err != nil {
t.Fatal(err)
}
if !strings.Contains(string(b), "no facts recorded") {
t.Errorf("empty index missing placeholder:\n%s", string(b))
}
}
func TestWriteIndex_SeparatesPinned(t *testing.T) {
s := newStore(t)
a := makeFact("alpha", "active fact", TypeUser)
p := makeFact("pinned-one", "pinned fact", TypeProject, func(f *Fact) { f.Pin = true })
if err := s.WriteIndex([]*Fact{p, a}); err != nil {
t.Fatal(err)
}
b, err := os.ReadFile(s.indexPath())
if err != nil {
t.Fatal(err)
}
s2 := string(b)
iAlpha := strings.Index(s2, "**alpha**")
iPinHdr := strings.Index(s2, "## pinned")
iPinned := strings.Index(s2, "**pinned-one**")
if iAlpha < 0 || iPinHdr < 0 || iPinned < 0 {
t.Fatalf("missing expected entries:\n%s", s2)
}
if iAlpha >= iPinHdr || iPinHdr >= iPinned {
t.Errorf("ordering wrong (alpha < pinned-header < pinned-one):\n%s", s2)
}
}
func TestWriteIndex_SeparatesDisabled(t *testing.T) {
s := newStore(t)
a := makeFact("alpha", "active fact", TypeUser)
d := makeFact("muted-one", "disabled fact", TypeFeedback, func(f *Fact) { f.Disabled = true })
if err := s.WriteIndex([]*Fact{d, a}); err != nil {
t.Fatal(err)
}
b, err := os.ReadFile(s.indexPath())
if err != nil {
t.Fatal(err)
}
s2 := string(b)
iAlpha := strings.Index(s2, "**alpha**")
iDisHdr := strings.Index(s2, "## disabled")
iMuted := strings.Index(s2, "**muted-one**")
if iAlpha < 0 || iDisHdr < 0 || iMuted < 0 {
t.Fatalf("missing expected entries:\n%s", s2)
}
if iAlpha >= iDisHdr || iDisHdr >= iMuted {
t.Errorf("ordering wrong (alpha < disabled-header < muted-one):\n%s", s2)
}
}
func TestWriteIndex_DisabledOverridesPin(t *testing.T) {
s := newStore(t)
pd := makeFact("pinned-muted", "pinned and disabled", TypeProject, func(f *Fact) {
f.Pin = true
f.Disabled = true
})
if err := s.WriteIndex([]*Fact{pd}); err != nil {
t.Fatal(err)
}
b, _ := os.ReadFile(s.indexPath())
s2 := string(b)
if strings.Contains(s2, "## pinned") {
t.Errorf("pinned+disabled fact must not create a ## pinned section:\n%s", s2)
}
iDisHdr := strings.Index(s2, "## disabled")
iFact := strings.Index(s2, "**pinned-muted**")
if iDisHdr < 0 || iFact < 0 || iDisHdr >= iFact {
t.Errorf("pinned+disabled fact must list under ## disabled:\n%s", s2)
}
}
func TestWriteIndex_AllDisabled(t *testing.T) {
s := newStore(t)
d := makeFact("muted-one", "disabled fact", TypeFeedback, func(f *Fact) { f.Disabled = true })
if err := s.WriteIndex([]*Fact{d}); err != nil {
t.Fatal(err)
}
b, _ := os.ReadFile(s.indexPath())
s2 := string(b)
if !strings.Contains(s2, "_(no active facts)_") {
t.Errorf("all-disabled store must print the no-active-facts placeholder:\n%s", s2)
}
if !strings.Contains(s2, "## disabled") {
t.Errorf("all-disabled store must still render the ## disabled section:\n%s", s2)
}
}
func TestWriteIndex_AlphabeticalActive(t *testing.T) {
s := newStore(t)
facts := []*Fact{
makeFact("zeta", "z", TypeUser),
makeFact("alpha", "a", TypeUser),
makeFact("middle", "m", TypeUser),
}
if err := s.WriteIndex(facts); err != nil {
t.Fatal(err)
}
b, _ := os.ReadFile(s.indexPath())
s2 := string(b)
ia := strings.Index(s2, "**alpha**")
im := strings.Index(s2, "**middle**")
iz := strings.Index(s2, "**zeta**")
if ia >= im || im >= iz {
t.Errorf("expected alpha < middle < zeta in:\n%s", s2)
}
}