about summary refs log tree commit diff stats
path: root/internal/index/search_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/index/search_test.go')
-rw-r--r--internal/index/search_test.go150
1 files changed, 150 insertions, 0 deletions
diff --git a/internal/index/search_test.go b/internal/index/search_test.go
new file mode 100644
index 0000000..339a0de
--- /dev/null
+++ b/internal/index/search_test.go
@@ -0,0 +1,150 @@
+package index_test
+
+import (
+	"context"
+	"maps"
+	"math"
+	"slices"
+	"testing"
+	"time"
+
+	"go.alanpearce.eu/searchix/internal/config"
+	"go.alanpearce.eu/searchix/internal/index"
+	"go.alanpearce.eu/searchix/internal/nix"
+	"go.alanpearce.eu/x/log"
+)
+
+const dataRoot = "../../data"
+
+func TestSearchGitPackagesFirst(t *testing.T) {
+	log := log.Configure(false)
+	cfg := config.DefaultConfig
+
+	read, _, exists, err := index.OpenOrCreate(dataRoot, false, &index.Options{
+		Logger:    log.Named("index"),
+		LowMemory: false,
+	})
+	defer read.Close()
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !exists {
+		t.Fatal("expected index to exist")
+	}
+
+	ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
+	defer cancel()
+
+	source := cfg.Importer.Sources["nixpkgs"]
+	if source == nil || !source.Enable {
+		t.Fatal("expected source to exist and be enabled")
+	}
+
+	result, err := read.Search(
+		ctx,
+		source,
+		"git",
+		0,
+		100,
+	)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if result.Total < 4 {
+		t.Errorf("Expected at least 4 results, got %d", result.Total)
+	}
+	important := map[string]int{
+		"git":        0,
+		"git-doc":    0,
+		"gitFull":    0,
+		"gitMinimal": 0,
+		"gitSVN":     0,
+	}
+	var i int
+	for hit := range result.Hits {
+		data := hit.Data.(nix.Package)
+		if _, found := important[data.Attribute]; found {
+			important[data.Attribute] = i
+		}
+		i++
+	}
+	if slices.Max(slices.Collect(maps.Values(important))) > len(important) {
+		t.Errorf(
+			"Expected all of %s to be the first %d matches, got %v",
+			slices.Collect(maps.Keys(important)),
+			len(important),
+			important,
+		)
+	}
+}
+
+func TestSearchJujutsuPackagesFirst(t *testing.T) {
+	log := log.Configure(false)
+	cfg := config.DefaultConfig
+
+	read, _, exists, err := index.OpenOrCreate(dataRoot, false, &index.Options{
+		Logger:    log.Named("index"),
+		LowMemory: false,
+	})
+	defer read.Close()
+	if err != nil {
+		t.Fatal(err)
+	}
+	if !exists {
+		t.Fatal("expected index to exist")
+	}
+
+	ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
+	defer cancel()
+
+	source := cfg.Importer.Sources["nixpkgs"]
+	if source == nil || !source.Enable {
+		t.Fatal("expected source to exist and be enabled")
+	}
+
+	result, err := read.Search(
+		ctx,
+		source,
+		"jj",
+		0,
+		100,
+	)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if result.Total < 4 {
+		t.Errorf("Expected at least 4 results, got %d", result.Total)
+	}
+	important := map[string]int{
+		"jj":      0,
+		"jujutsu": 0,
+		"lazyjj":  0,
+		"jjui":    0,
+		"jj-fzf":  0,
+	}
+	matches := []string{}
+	unwanted := "javacc"
+	unwantedIndex := math.MaxInt
+	var i int
+	for hit := range result.Hits {
+		data := hit.Data.(nix.Package)
+		if _, found := important[data.Attribute]; found {
+			matches = append(matches, data.Attribute)
+		} else if data.Attribute == unwanted {
+			unwantedIndex = i
+			matches = append(matches, data.Attribute)
+		}
+		i++
+	}
+	if slices.Max(slices.Collect(maps.Values(important))) > unwantedIndex {
+		t.Errorf(
+			"Expected all of %s to be above unwanted result %s at index %d. Results: %v",
+			slices.Collect(maps.Keys(important)),
+			unwanted,
+			unwantedIndex,
+			matches,
+		)
+	}
+}