package brain_test import ( "os" "path/filepath" "testing" "github.com/mathiasbq/hyperguild/ingestion/internal/brain" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestBuildWingIndex(t *testing.T) { dir := t.TempDir() for _, p := range []struct{ rel, body string }{ {"wiki/jepa-fx/decisions/val-vol.md", "---\ntitle: Val Vol R2\ncreated_at: 2026-05-06T10:00:00Z\n---\nbody\n"}, {"wiki/jepa-fx/facts/architecture.md", "---\ntitle: Architecture\ncreated_at: 2026-05-04T10:00:00Z\n---\nbody\n"}, {"wiki/jepa-fx/sources/paper.md", "---\n---\nbody\n"}, } { full := filepath.Join(dir, p.rel) require.NoError(t, os.MkdirAll(filepath.Dir(full), 0o755)) require.NoError(t, os.WriteFile(full, []byte(p.body), 0o644)) } require.NoError(t, brain.BuildWingIndex(dir, "jepa-fx")) got, err := os.ReadFile(filepath.Join(dir, "wiki", "jepa-fx", "_index.md")) require.NoError(t, err) s := string(got) assert.Contains(t, s, "# jepa-fx") assert.Contains(t, s, "| Hall | Note | Created |") assert.Contains(t, s, "| decisions | [Val Vol R2](decisions/val-vol.md) | 2026-05-06 |") assert.Contains(t, s, "| facts | [Architecture](facts/architecture.md) | 2026-05-04 |") assert.Contains(t, s, "| sources | [paper](sources/paper.md) |") // Halls sorted alphabetically. assert.Less(t, indexOf(s, "decisions"), indexOf(s, "facts")) assert.Less(t, indexOf(s, "facts"), indexOf(s, "sources")) } func TestBuildWingIndex_SkipsInvalidHalls(t *testing.T) { dir := t.TempDir() wingDir := filepath.Join(dir, "wiki", "jepa-fx") require.NoError(t, os.MkdirAll(filepath.Join(wingDir, "garbage"), 0o755)) require.NoError(t, os.WriteFile(filepath.Join(wingDir, "garbage", "x.md"), []byte("x"), 0o644)) require.NoError(t, os.MkdirAll(filepath.Join(wingDir, "facts"), 0o755)) require.NoError(t, os.WriteFile(filepath.Join(wingDir, "facts", "y.md"), []byte("y"), 0o644)) require.NoError(t, brain.BuildWingIndex(dir, "jepa-fx")) got, err := os.ReadFile(filepath.Join(wingDir, "_index.md")) require.NoError(t, err) s := string(got) assert.Contains(t, s, "facts") assert.NotContains(t, s, "garbage") } func TestBuildAllWingIndexes(t *testing.T) { dir := t.TempDir() for _, p := range []struct{ rel, body string }{ {"wiki/a/facts/x.md", "x"}, {"wiki/b/facts/y.md", "y"}, } { full := filepath.Join(dir, p.rel) require.NoError(t, os.MkdirAll(filepath.Dir(full), 0o755)) require.NoError(t, os.WriteFile(full, []byte(p.body), 0o644)) } require.NoError(t, brain.BuildAllWingIndexes(dir)) _, err := os.Stat(filepath.Join(dir, "wiki", "a", "_index.md")) require.NoError(t, err) _, err = os.Stat(filepath.Join(dir, "wiki", "b", "_index.md")) require.NoError(t, err) } func TestBuildWingIndex_NoWingDir(t *testing.T) { dir := t.TempDir() require.NoError(t, brain.BuildWingIndex(dir, "ghost")) } func indexOf(s, sub string) int { for i := 0; i+len(sub) <= len(s); i++ { if s[i:i+len(sub)] == sub { return i } } return -1 }