// ingestion/internal/pipeline/backfill_test.go package pipeline import ( "context" "os" "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func setupBrainDir(t *testing.T) string { t.Helper() dir := t.TempDir() for _, sub := range []string{"wiki/sources", "wiki/concepts", "wiki/entities"} { require.NoError(t, os.MkdirAll(filepath.Join(dir, sub), 0o755)) } return dir } func writeFile(t *testing.T, path, content string) { t.Helper() require.NoError(t, os.MkdirAll(filepath.Dir(path), 0o755)) require.NoError(t, os.WriteFile(path, []byte(content), 0o644)) } func TestBackfillRefs_UpdatesConcept(t *testing.T) { dir := setupBrainDir(t) writeFile(t, filepath.Join(dir, "wiki/sources/shape-up.md"), "---\ntitle: Shape Up\n---\n\n## Summary\n\nSee [[betting|Betting]].\n") writeFile(t, filepath.Join(dir, "wiki/concepts/betting.md"), "---\ntitle: Betting\n---\n\n## Definition\n\nA resource allocation technique.\n") n, err := BackfillRefs(context.Background(), dir) require.NoError(t, err) assert.Equal(t, 1, n) got, err := os.ReadFile(filepath.Join(dir, "wiki/concepts/betting.md")) require.NoError(t, err) assert.Contains(t, string(got), "## Sources") assert.Contains(t, string(got), "[[shape-up|Shape Up]]") assert.Contains(t, string(got), "## Definition") // original content preserved } func TestBackfillRefs_Deduplication(t *testing.T) { dir := setupBrainDir(t) writeFile(t, filepath.Join(dir, "wiki/sources/shape-up.md"), "---\ntitle: Shape Up\n---\n\n## Summary\n\nSee [[betting|Betting]].\n") writeFile(t, filepath.Join(dir, "wiki/concepts/betting.md"), "---\ntitle: Betting\n---\n\n## Definition\n\nA technique.\n") // Run twice — should not duplicate the ref. _, err := BackfillRefs(context.Background(), dir) require.NoError(t, err) _, err = BackfillRefs(context.Background(), dir) require.NoError(t, err) got, err := os.ReadFile(filepath.Join(dir, "wiki/concepts/betting.md")) require.NoError(t, err) count := 0 for _, line := range splitLines(string(got)) { if line == "- [[shape-up|Shape Up]]" { count++ } } assert.Equal(t, 1, count, "ref should appear exactly once after two runs") } func TestBackfillRefs_MultipleSources(t *testing.T) { dir := setupBrainDir(t) writeFile(t, filepath.Join(dir, "wiki/sources/book-a.md"), "---\ntitle: Book A\n---\n\n## Summary\n\nSee [[shaping|Shaping]].\n") writeFile(t, filepath.Join(dir, "wiki/sources/book-b.md"), "---\ntitle: Book B\n---\n\n## Summary\n\nAlso [[shaping|Shaping]].\n") writeFile(t, filepath.Join(dir, "wiki/concepts/shaping.md"), "---\ntitle: Shaping\n---\n\n## Definition\n\nA design activity.\n") n, err := BackfillRefs(context.Background(), dir) require.NoError(t, err) assert.Equal(t, 1, n) // one concept page written got, err := os.ReadFile(filepath.Join(dir, "wiki/concepts/shaping.md")) require.NoError(t, err) assert.Contains(t, string(got), "[[book-a|Book A]]") assert.Contains(t, string(got), "[[book-b|Book B]]") } func TestBackfillRefs_NoSourcesDir(t *testing.T) { dir := t.TempDir() // no wiki/sources subdir n, err := BackfillRefs(context.Background(), dir) require.NoError(t, err) assert.Equal(t, 0, n) } func TestBackfillRefs_SkipsUnknownSlugs(t *testing.T) { dir := setupBrainDir(t) // Source links to a slug not in inventory and not on disk. writeFile(t, filepath.Join(dir, "wiki/sources/article.md"), "---\ntitle: Article\n---\n\n## Summary\n\nSee [[ghost-slug|Ghost]].\n") n, err := BackfillRefs(context.Background(), dir) require.NoError(t, err) assert.Equal(t, 0, n) }