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