108 lines
3.5 KiB
Go
108 lines
3.5 KiB
Go
// 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)
|
|
}
|