feat: mount lazyly

This commit is contained in:
Jan Bader committed 2026-09-19 23:36:10 +02:00
1 parent cf391172a1
commit 3b91a26b2c
3 files changed
+381 -12

No files matched your search

+122
View File
@@ -3,6 +3,8 @@ package main
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"testing"
@@ -10,6 +12,126 @@ import (
"bazil.org/fuse"
)
func TestLazyMountFetchesMonthOnlyWhenRead(t *testing.T) {
var queries []string
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var request struct {
Query string `json:"query"`
}
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
t.Fatal(err)
}
queries = append(queries, request.Query)
items := []SearchItem{}
if len(queries) == 1 {
items = []SearchItem{{
ID: "item-1",
Name: "Invoice",
Date: 1720396800000,
Attachments: []ItemAttachment{{ID: "att-1", Name: "invoice.pdf", Size: 1}},
}}
}
_ = json.NewEncoder(w).Encode(map[string]any{
"groups": []map[string]any{{"items": items}},
})
}))
defer server.Close()
root := buildLazyMountTree(NewDocspellClient(server.URL, ""), "state:confirmed", 100)
year, err := root.Lookup(context.Background(), "2024")
if err != nil {
t.Fatal(err)
}
month, err := year.(*lazyYearNode).Lookup(context.Background(), "07")
if err != nil {
t.Fatal(err)
}
if len(queries) != 0 {
t.Fatalf("expected no search before reading month, got %v", queries)
}
entries, err := month.(*lazyMonthNode).ReadDirAll(context.Background())
if err != nil {
t.Fatal(err)
}
if len(entries) != 1 || entries[0].Name != "Invoice.pdf" {
t.Fatalf("unexpected month entries: %#v", entries)
}
if len(queries) != 2 || queries[0] != "(& state:confirmed date:2024-07 )" || queries[1] != "(& state:confirmed date:2024-07 )" {
t.Fatalf("unexpected queries: %v", queries)
}
}
func TestLazyByIDShardFetchesMatchingPrefix(t *testing.T) {
var queries []string
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var request struct {
Query string `json:"query"`
}
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
t.Fatal(err)
}
queries = append(queries, request.Query)
items := []SearchItem{}
if len(queries) == 1 {
items = []SearchItem{{
ID: "it-item-1",
Name: "Invoice",
Attachments: []ItemAttachment{{ID: "att-1", Name: "invoice.pdf", Size: 1}},
}}
}
_ = json.NewEncoder(w).Encode(map[string]any{
"groups": []map[string]any{{"items": items}},
})
}))
defer server.Close()
root := buildLazyMountTree(NewDocspellClient(server.URL, ""), "", 100)
byID, err := root.Lookup(context.Background(), "by-id")
if err != nil {
t.Fatal(err)
}
shard, err := byID.(*lazyByIDNode).Lookup(context.Background(), "it")
if err != nil {
t.Fatal(err)
}
entries, err := shard.(*lazyByIDShardNode).ReadDirAll(context.Background())
if err != nil {
t.Fatal(err)
}
if len(entries) != 1 || entries[0].Name != "it-item-1.pdf" {
t.Fatalf("unexpected shard entries: %#v", entries)
}
if len(queries) != 2 || queries[0] != "id:it*" || queries[1] != "id:it*" {
t.Fatalf("unexpected queries: %v", queries)
}
}
func TestLazyByIDListsEveryPrefixWithoutSearching(t *testing.T) {
root := buildLazyMountTree(nil, "", 100)
byID, err := root.Lookup(context.Background(), "by-id")
if err != nil {
t.Fatal(err)
}
entries, err := byID.(*lazyByIDNode).ReadDirAll(context.Background())
if err != nil {
t.Fatal(err)
}
wantCount := len(docspellIDCharacters) * len(docspellIDCharacters)
if len(entries) != wantCount {
t.Fatalf("expected %d ID prefixes, got %d", wantCount, len(entries))
}
found := false
for _, entry := range entries {
if entry.Name == "7j" {
found = entry.Type == fuse.DT_Dir
break
}
}
if !found {
t.Fatalf("expected 7j directory in %#v", entries)
}
}
func TestBuildMountTreeGroupsByFolderAndDate(t *testing.T) {
items := []SearchItem{{
ID: "item-1",