46 lines
1.6 KiB
Go
46 lines
1.6 KiB
Go
package wing_test
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/mathiasbq/hyperguild/ingestion/internal/wing"
|
|
)
|
|
|
|
func writePage(t *testing.T, dir, rel, body string) {
|
|
t.Helper()
|
|
full := filepath.Join(dir, rel)
|
|
require.NoError(t, os.MkdirAll(filepath.Dir(full), 0o755))
|
|
require.NoError(t, os.WriteFile(full, []byte(body), 0o644))
|
|
}
|
|
|
|
func scorerBrain(t *testing.T) string {
|
|
dir := t.TempDir()
|
|
writePage(t, dir, "wiki/infra/facts/k3s.md", "---\ntitle: K3s cluster\n---\nkubernetes cluster nodes scheduling pods deployment\n")
|
|
writePage(t, dir, "wiki/finance/facts/invoice.md", "---\ntitle: Invoices\n---\ninvoice payment bookkeeping ledger reconciliation\n")
|
|
return dir
|
|
}
|
|
|
|
func TestBM25Scorer_RanksTheWingWhosePagesMatch(t *testing.T) {
|
|
s := wing.NewBM25Scorer(scorerBrain(t), []string{"infra", "finance"}, "")
|
|
got := s.Score("notes about kubernetes cluster scheduling and pods")
|
|
assert.Greater(t, got["infra"], got["finance"])
|
|
assert.Greater(t, got["infra"], 0.0)
|
|
}
|
|
|
|
func TestBM25Scorer_ExcludesThePageBeingClassified(t *testing.T) {
|
|
// A page must not vouch for its own wing when it is the backtest sample.
|
|
s := wing.NewBM25Scorer(scorerBrain(t), []string{"infra", "finance"}, "wiki/infra/facts/k3s.md")
|
|
got := s.Score("kubernetes cluster nodes scheduling pods deployment")
|
|
assert.Zero(t, got["infra"], "the excluded page is the only infra match")
|
|
}
|
|
|
|
func TestBM25Scorer_NoUsableTermsScoresNothing(t *testing.T) {
|
|
s := wing.NewBM25Scorer(scorerBrain(t), []string{"infra", "finance"}, "")
|
|
assert.Empty(t, s.Score("a an to of"))
|
|
}
|