feat: mount lazyly
This commit is contained in:
1 parent
cf391172a1
commit
3b91a26b2c
3 files changed
+381
-12
No files matched your search
+122
@@ -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",
|
||||
|
||||
Reference in new issue
Block a user